시스템 서비스 로그를 파일로 리디렉션

시스템 서비스 로그를 파일로 리디렉션

Ubuntu 16.04에서 Flume을 시스템 서비스로 실행하려고 하는데 다음이 있습니다./etc/systemd/system/flume-ng.service

[Unit]
Description=Apache Flume

[Service]
ExecStart=/usr/bin/nohup /opt/flume/current/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &
ExecStop=/opt/flume/current/bin/flume-ng agent stop

[Install]
WantedBy=multi-user.target

다음 줄을 추가해 보았습니다.

StandardOutput=/var/log/flume-ng/log1.log
StandardError=/var/log/flume-ng/log2.log   

이것은 나에게 효과가 없습니다. systemctl daemon-reload나는 뛰었고systemctl restart flume-ng

이것이 어떻게 작동하는지 아는 사람이 있나요?

답변1

리디렉션

다음은 systemd v236 이상에만 적용됩니다.

StandardOutput=file:/var/log/flume-ng/log1.log
StandardError=file:/var/log/flume-ng/log2.log

기록에 따르면여기.

systemd가 v236보다 이전인 경우 다음을 사용할 수 있습니다.

ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >/var/log/flume-ng/log1.log 2>/var/log/flume-ng/log2.log'

이렇게 하면 서비스가 다시 시작될 때마다 전체 로그 파일 내용을 덮어쓰게 됩니다.

추가의

서비스를 다시 시작하는 사이에 파일 로그를 유지하고 새 로그 줄만 추가하려면 다음을 수행하세요.

# Works only in systemd v240 and newer!
# (but backported to e.g. RHEL8)
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log

systemd가 v240보다 오래된 경우 다음을 사용할 수 있습니다.

ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'

execmy_binary즉 , 포킹 없이 리다이렉션을 설정한 후 쉘 프로그램이 해당 프로그램으로 대체된다는 뜻이다 . 따라서 my_binary직접 실행하는 것과 별 차이가 없습니다 ExecStart=.

답변2

ExecStart=/usr/bin/nohup …

이것은 잘못된 것입니다. 그것을 제거. 이 서비스는 대화형 로그인 세션에서 실행되고 있지 않습니다. 먼저 끊기 신호를 보낼 제어 터미널이나 세션 리더가 없습니다.

ExecStart=… &

이것은 잘못된 것입니다. 그것을 제거. 이것은 쉘 스크립트가 아닙니다. &특별한 쉘과 같은 의미가 없으며 어쨌든 서비스를 시작하는 잘못된 방법입니다.

표준 출력=/var/log/flume-ng/log1.log
표준 오류=/var/log/flume-ng/log2.log

이것들은 모두 틀렸습니다. 이것을 사용하지 마십시오. 체계이미 보냈습니다서비스 프로세스의 표준 출력 및 오류는 서비스 단위에서 그러한 설정 없이 로그에 기록됩니다. 다음 명령을 사용하여 볼 수 있습니다.

Journalctl -e -u Flume-ng.service

답변3

덮어쓰지 않고 파일에 로깅하려면(system.d 버전 240+ 필요):

StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log

또는

StandardOutput=append:/var/log/flume-ng/log.log
StandardError=inherit

답변4

출력이 전혀 나오지 않으면 먼저 스크립트를 테스트해야 합니다.

예를 들어, Python 스크립트는 출력 스트림을 버퍼링합니다(단, 콘솔에서 테스트할 때가 아니라 파이프로 연결될 때만). 따라서 버퍼가 플러시될 때까지 로그 메시지가 표시되지 않습니다.

-u이를 방지하려면 스위치( python3 -u script) 를 지정 하거나 PYTHONUNBUFFERED변수를 설정하십시오.

Environment=PYTHONUNBUFFERED=1

관련 정보