Upstart가 로그 회전 시 로그 파일을 다시 열지 않음

Upstart가 로그 회전 시 로그 파일을 다시 열지 않음

우리는 Ubuntu 서버에서 서비스를 관리하기 위해 upstart를 사용합니다. /var/log/upstart/SERVICE_NAME.log에 로그아웃되는 로그를 생성합니다.

그런 다음 매일 12.04 LTS와 함께 제공되는 로그 회전 스크립트를 사용하여 로그 파일이 회전됩니다.

/var/log/upstart/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

문제는 logrotate가 파일을 이동하는 동안 upstart에 파일을 닫았다가 다시 열라는 신호가 표시되지 않아 upstart 프로세스가 삭제 PID에 기록된다는 것입니다.

init          1       root    8w      REG              202,1        64       2431 /var/log/upstart/dbus.log.1 (deleted)
init          1       root   13w      REG              202,1        95       2507 /var/log/upstart/acpid.log.1 (deleted)
init          1       root   14w      REG              202,1       127      17377 /var/log/upstart/whoopsie.log.1 (deleted)
init          1       root   36w      REG              202,1       122       6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init          1       root   37w      REG              202,1        30       6762 

분명히 내 서비스의 출력을 다른 로그 파일로 리디렉션할 수 있지만 시스템 프로세스에는 여전히 문제가 있습니다. 또한 필요한 것보다 더 많은 인프라를 구축할 필요가 없습니다.

답변1

나는 당신에게 3가지 선택권이 있다고 믿습니다.

  1. "copytruncate"를 추가하여 기존 구성을 수정합니다.

    /var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }

  2. 문제가 발생하지 않고 기존 구성이 작동하는 다른 로그 파일로 인해 기존 logrotate 구성을 변경할 수 없거나 변경할 수 없는 경우(허용되지 않는 경우) "SERVICE_NAME.log" 파일을 / 아래의 새 폴더로 이동하세요. var/log 원하는 경우 "copytruncate"를 사용하여 새 구성을 생성하고 cron.daily에 추가하세요.

  3. a) 호스트 OS의 logrotate 구성을 변경하거나 호스트 OS의 cron.daily에 추가할 수 없는 경우 세 번째 옵션은 파일에 쓰기 전에 파일이 존재하는지 확인하도록 스크립트나 프로그램을 변경하는 것입니다. b) 또 다른 방법은 로그 파일을 다른 곳으로 이동하고 스크립트나 프로그램 내에서 해당 프로그램의 로그 파일에 특정한 logrotate 명령을 실행하는 것입니다.

위의 3b번 항목은 더 까다롭지만 더 우아하며 프로그램이 자급자족하고 자체 관리되며 OS 작업을 돌볼 필요가 없다는 의미로 내가 대부분의 시간에 사용하는 것입니다.

logrotate를 수동으로 실행하고 이를 프로그램이나 스크립트에 추가하는 방법을 알아보려면 다음을 입력하십시오.

man logrotate

또는

logrotate --help

프로그램에 Python을 사용하는 경우 이 프로그램이 Python을 사용하여 로그 파일을 자체 관리하는 방법을 확인할 수 있습니다. http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/

답변2

알고 보니 이는 알려진 문제이며티켓내가 이것을 입력하는 동안 계속 열려 있습니다.

아마도 올바른 일은 /etc/logrotate.d/upstart전체를 제거하고 개별 서비스의 파일을 개별적으로 회전시키는 것입니다. 디렉토리( /var/log/upstart/)에는 다양한 서비스의 stdout/stderr만 포함되어 있고,악마이 두 채널로 모두 출력되어야 합니다. 아마도 시작 시점을 제외하고 말이죠.

제가 관리하고 있는 시스템에서는 세 가지 서비스가 upstart에 의해 실행됩니다: php5.6-fpm, php7.1-fpmacpid. 세 개의 로그 중 어느 것도 활성화되어 있지 않지만 메인 로그 파일( /var/log/php5.6-fpm.log)이 순환되어 fpm이 다시 시작되는 경우가 있습니다. 그리고 시작 시 약간의 비정상을 출력하기 때문에 이러한 소음이 발생합니다.

어쨌든 이러한 파일을 교체해야 한다면 해당 이름이 서비스 이름과 일치한다는 사실을 믿고 다음 postrotate스크립트를 사용할 수 있습니다.

    postrotate
            service=${1##*/}
            service=${service%.log*}
            service $service restart > /dev/null
    endscript

위의 작업을 수행하려면 다음을 수행하십시오.~ 아니다거기에 동사를 사용하십시오 - 내 스크립틀릿은 파일의 실제 경로가 첫 번째 인수( ) sharedscripts로 전달된다는 사실에 의존합니다 .$1

(-command는 시끄러우므로 으로 리디렉션하는 것이 /dev/null유용합니다 service. 그리고 cron이 이러한 소음을 이메일로 보내는 것을 원하지 않습니다. 주의할 점은 내가 stderr거기 로 리디렉션하지 않는다는 점 stdout입니다. 문제가 있는 경우에는 이에 대한 이메일은 계속 수신됩니다.)

관련 정보