로깅을 우회하고 syslog에 직접 로깅할 수 있는 기회를 제공하는 systemd 도구를 사용하는 솔루션을 한동안 찾고 있었습니다. 물론 필터링도 가능하지만 시스템 로그가 아닌 로그만 필터링할 수 있습니다.
지금까지 나는 올바른 선택을 할 수 없었습니다. 내 시스템은 239-68 시스템의 OL8입니다.
이미 시도했습니다:
[Service]
...
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my_service
...
이는 로그 및 syslog에 대한 이중 로깅을 제공합니다. 두 번째 시도가 StandardOutput
설정 되었습니다 StandardError
.append
이 방법으로 전송된 메시지는 원시 메시지이고 내 관할권을 벗어난 발신자(애플리케이션)가 설정해야 할 수 있는 식별자나 타임스탬프가 없으므로 위 방법을 사용하고 싶지 않습니다.
별도의 스크립트에서 로거를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 이는 비공식적이므로 실제로는 최후의 수단입니다 ExecStart
.2>&1
나는 또한 다음 두 가지 주제를 보았습니다.
https://github.com/systemd/systemd/issues/6432
https://github.com/systemd/systemd/pull/24058
그러나 그 중 어느 것도 위의 문제를 구체적으로 다루지 않습니다.
이 문제를 해결하는 방법에 대한 다른 아이디어를 알려 주실 수 있나요?
답변1
한 가지 가능성은 프로그램의 표준 출력을 Unix 도메인 소켓에 연결하는 것입니다. 필터링을 수행하고 마지막으로 파일에 쓰기 전에 이 소켓을 읽고 타임스탬프를 추가하도록 rsyslogd를 구성합니다. 예를 들어 다음 행을 다음에 추가하십시오 /etc/rsyslog.conf
.
module(load="imptcp")
input(type="imptcp" path="/tmp/mysocket1" name="my1")
template(name="outfmt" type="string" string="%timegenerated:::date-rfc3339% %inputname% %rawmsg%\n")
if $inputname=="my1" then {
action(type="omfile" file="myoutput" template="outfmt")
}
rsyslogd가 다시 시작되면 소켓이 생성됩니다 /tmp/mysocket1
. 시스템 서비스 파일에 사용됨
StandardOutput=file:/tmp/mysocket1
기본적으로 StandardError
동일한 소켓이 상속됩니다 StandardOutput
.
이제 프로그램에서 작성한 모든 줄은 rsyslogd에서 읽고 수신 타임스탬프, 입력에 제공한 이름 "my1" 및 rawmsg를 추가하는 등 처리됩니다. (rsyslog 문서에 따르면 systemd는 실제로 메시지의 타임스탬프를 무시하고 자체 내부 시간을 사용하므로 이는 드문 일이 아닙니다.)
여러 프로그램을 구별해야 하는 경우 각 프로그램에는 자체 명명된 소켓이 필요합니다. 테스트하는 것보다 inputname
규칙 세트에 설정을 포함하는 것이 좋습니다. 물론 자체 구성 파일을 사용하여 별도의 전용 rsyslogd 데몬을 생성하고 실행할 수도 있습니다.