우리는 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
분명히 내 서비스의 출력을 다른 로그 파일로 리디렉션 할 수는 있지만 시스템 프로세스에는 여전히 문제가 있습니다. 또한 필요한 것보다 더 많은 인프라를 구축 할 필요가 없습니다.
답변
세 가지 옵션이 있다고 생각합니다.
-
“copytruncate”를 추가하여 기존 구성을 수정합니다
/var/log/upstart/*.log
{
copytruncate
daily
missingok
rotate 7
compress
notifempty
nocreate
} -
문제가없는 다른 로그 파일로 인해 기존 logrotate 구성을 변경할 수 없거나 허용되지 않는 경우 기존 구성이 작동하는 경우 “SERVICE_NAME.log”파일을 / 아래의 새 폴더로 이동하십시오. 원하는 경우 var / log “copytruncate”를 사용하여 새 구성을 작성하고 cron.daily에 추가하십시오.
-
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/
답변
이것은 알려진 문제이며 이것을 입력 할 때 티켓 이 열려 있습니다.
올바른 방법은 아마도 /etc/logrotate.d/upstart
전체를 제거 하고 개별 서비스의 파일을 개별적으로 회전시키는 것입니다. 디렉토리 ( /var/log/upstart/
)에는 다양한 서비스의 stdout / stderr 만 포함되어 있기 때문에 데몬 으로 실행되는 서비스는 이 두 채널에 전혀 출력되지 않아야합니다. 아마도 처음 시작할 때를 제외하고.
내가 관리하는 시스템에서 upstart php5.6-fpm
는 php7.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/null
은 service
-명령이 시끄럽기 때문에 유용 하며 cron이 이러한 노이즈를 이메일로 보내지 않기를 원합니다. 문제가있는 경우 stderr
에만 리디렉션하지 않습니다. stdout
여전히 이메일을받을 것입니다.)