파일에 기록하는 시스템 서비스가 있습니다.
[Unit]
Description=...
[Service]
ExecStart=/path/to/my_service
StandardOutput=append:/var/log/my_service/log.log
StandardError=append:/var/log/my_service/err_log.log
[Install]
WantedBy=multi-user.target
각 줄 앞에 현재 타임스탬프를 추가하고 싶습니다. 터미널에서 다음 명령을 사용 ts
하면 됩니다 moreutils
.
/path/to/my_service | /usr/bin/ts '[%Y-%m-%d %H:%M:%S]'
나는 시도했다:
ExecStart=/path/to/my_service | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'
그러나 로그 출력은 여전히 동일하게 보입니다.
StandardOutput
로그 파일 앞 과 StandardError
로그 파일의 각 줄 앞에 타임스탬프를 추가하는 방법은 무엇입니까 ?
답변1
이것시작 매개변수 실행전체 셸 기능은 지원되지 않습니다. 이 설명을 참조하세요명령줄 부분이 페이지의 내용:
구문은 셸 구문에서 영감을 얻었지만 다음 단락에 설명된 메타 문자와 확장만 이해하며 변수는 다르게 확장됩니다.특히 "<", "<<", "">" 및 ">>"를 사용한 리디렉션, "|"를 사용한 파이프, "&"를 사용한 백그라운드에서 프로그램 실행 및 기타 쉘 구문 요소는 지원되지 않습니다.
(내 강조)
작업을 수행하려면 래핑 셸을 호출하세요.
ExecStart=/bin/bash -c "/path/to/my_service 2> >(/usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]' >&2) | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'"
여기서는 stderr를 실행 타임스탬프를 대체하는 프로세스 대체(bash 필요)로 리디렉션 ts
하고 출력을 stderr로 리디렉션하여 systemd의 StandardError가 이를 포착하도록 합니다. 원래 명령의 stdout은 파이프링되어 ts
systemd의 StandardOutput에 의한 캡처를 위해 stdout으로 전송됩니다.