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


10

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

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

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

문제는 logrotate가 파일을 이동하는 동안 파일을 닫았다가 다시 열도록 시작하라는 신호를 표시하지 않으므로 시작 프로세스가 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 

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


나는 또한 이것을 만났다. 우리가 전에 그것을 알아 채지 못했던 것은 매우 이상합니다.
pwaller 2016 년

1
이것에 대한 업데이트? 14.04에서 똑같은 문제를 봅니다. 이 nocreate지시문 때문에 , 누군가가이 지시문을 사용하는 이유, 특히 많은 양의 출력을 작성할 수있는 서비스에 대해 확신 할 수 없음
rynop

이것도 경험하고 있습니다.
Ztyx

답변:


2

세 가지 옵션이 있다고 생각합니다.

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

위의 포인트 3b는 더 까다 롭지 만 더 우아하며 프로그램이 자체적으로 충분하고 자체 관리되며 보모를 위해 OS의 작업이 필요하지 않기 때문에 대부분의 시간을 사용합니다.

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

man logrotate

또는

logrotate --help

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


0

이것은 알려진 문제이며 이것을 입력 할 때 티켓 이 열려 있습니다.

올바른 방법은 아마도 /etc/logrotate.d/upstart전체를 제거 하고 개별 서비스의 파일을 개별적으로 회전시키는 것입니다. 디렉토리 ( /var/log/upstart/)에는 다양한 서비스의 stdout / stderr 만 포함되어 있기 때문에 데몬 으로 실행되는 서비스는 이 두 채널에 전혀 출력되지 않아야합니다. 아마도 처음 시작할 때를 제외하고.

내가 관리하는 시스템에서 upstart php5.6-fpmphp7.1-fpm,, 및 세 가지 서비스를 실행합니다 acpid. 3 개의 로그 중 어느 것도 활성화되어 있지 않지만 때로는 기본 로그 파일 ( /var/log/php5.6-fpm.log)이 회전 하여 fpm이 다시 시작 되는 경우가 있습니다. 시작시 일부 무력을 출력하기 때문에이 노이즈가 발생합니다.

어쨌든 이러한 파일을 회전시키려는 경우 파일 이름이 서비스 이름과 일치하고 다음 postrotate스크립트를 사용한다는 사실에 의존 할 수 있습니다 .

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

위의 작업을 위해서는 거기에 동사를 사용 하지 마십시오. sharedscripts내 스크립틀릿은 사실에 의존하므로 파일의 실제 경로가 첫 번째 인수 ( $1) 로 전달됩니다 .

(리디렉션 /dev/nullservice-명령이 시끄럽기 때문에 유용 하며 cron이 이러한 노이즈를 이메일로 보내지 않기를 원합니다. 문제가있는 경우 stderr에만 리디렉션하지 않습니다. stdout여전히 이메일을받을 것입니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.