`file :`구성을 통해 systemd에서 관리하는 서비스 로그를 올바르게 로그 로테이션하는 방법

Aug 19 2020

나는 systemd가 파일에 직접 로그를 쓰도록 지시하는 다음 systemd 구성이있는 systemd에서 관리하는 서비스를 가지고 있습니다 (syslog 또는 아무것도 없음)

StandardOutput=file:/var/log/foo/my.log

logrotate 규칙이 있습니다.

/var/log/foo/*.log
{
        rotate 31
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
}

무슨 일이 일어나고 있는지 로그가 회전되지만 서비스는 여전히 이전 회전 파일에 쓰고 있고 새 로그 파일은 비어 있습니다.

서비스가 대신 syslog에 쓰는 유사한 작업 설정이 있습니다. logrotate 구성에는

postrotate
                invoke-rc.d rsyslog rotate > /dev/null

, 로그가 회전되었음을 syslog에 알립니다.

문제는 내 문제가있는 경우 로그가 파일로 직접 이동하므로 systemd 또는 실제 서비스 프로세스에 유사한 신호를 보내야하는지 (또는 어느 것이) 필요한지 알 수 없다는 것입니다.

나는 copytruncatelogrotate에서 내 문제를 해결할 것이라고 확신 하는 옵션을 찾았 지만 이것이 이상적인 방법이 아니라는 느낌을 받고 있습니다. 그렇지 않으면 copytruncatelogrotate의 기본 동작이 될 것입니다.

이 문제를 어떻게 해결합니까? systemd에 신호를 보내야합니까? 서비스 프로세스에 신호를 보내야합니까? copytruncate대신 logrotate 에서 사용해야 합니까?
중요한 경우 서비스는 logback을 사용하여 stdout에 쓰는 Java 프로세스입니다.

답변

eleventyone Aug 18 2020 at 22:32

copytruncate이 경우 정답입니다. 로그 파일을 다시 열도록 신호를 보낼 수있는 적절한 데몬이 있기 때문에 필요하지 않기 때문에 기본값이 아닙니다.

대안은 사후 회전 스크립트에서 서비스를 다시 시작하는 것이지만 편리하거나 바람직하지 않을 수 있습니다.