내 구성에서, 나는 변화 다음을 담당하는 사람들 위해 rsyslog 한 /home/user/my_app/shared/log/unicorn.stderr.log
사용을 imfile
. 내용은 TCP를 사용하여 다른 원격 로깅 서버로 전송됩니다.
로그 파일이 회전하면 rsyslog는 원격 서버로 데이터 전송을 중지합니다.
rsyslog를 다시로드하고 HUP 신호를 보내고 다시 시작하려고 시도했지만 아무것도 작동하지 않았습니다.
실제로 작동하는 유일한 방법은 더럽습니다.
- 서비스를 중지하고 rsyslog 통계 파일을 삭제 한 후 rsyslog를 다시 시작하십시오. 내 logrotate 파일의 postrotate 후크에있는 모든 것.
kill -9
rsyslog를 시작하십시오.
rsyslog 내부를 건드리지 않고이 작업을 수행 할 수 있는 올바른 방법이 있습니까?
Rsyslog 파일
$ ModLoad 임 마크 $ ModLoad imudp $ ModLoad imtcp $ ModLoad imuxsock $ ModLoad imklog $ ModLoad imfile $ template WithoutTimeFormat, "[환경] [% syslogtag %]-% msg %" $ WorkDirectory / var / spool / rsyslog $ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log $ InputFileTag 유니콘 -stderr $ InputFileStateFile stat-unicorn-stderr $ InputFile 심각도 정보 $ InputFileFacility 로컬 8 $ InputFilePollInterval 1 $ InputFilePersistStateInterval 1 $ InputRunFileMonitor # 원격 서버로 전달 $ syslogtag에 'apache-'가 포함 된 경우 @@ my_server : 5000; WithoutTimeFormat : syslogtag, "apache-"포함 ~ *. * @@ my_server : 5000; SyslFormat
로그 파일
/home/user/my_app/shared/log/*.log { 매일 missingok dateext 30도 회전 압박 붕대 공증인 확장 gz 카피 640 명의 사용자 생성 공유 스크립트 회전 후 (rsyslog 중지 && rm / var / spool / rsyslog / stat- * && rsyslog 2 시작> & 1) || 진실 엔드 스크립트 }
참고로, 파일은 rsyslog 사용자가 읽을 수 있으며 서버에 연결할 수 있으며 동일한주기에서 회전하지 않는 다른 로그 파일은 계속 올바르게 추적됩니다.
우분투 12.04를 실행 중입니다.
답변
문제는 실제로 로그 로테이션에서 발생했습니다.
기본적으로 유니콘을 실행하는 구성에서는 copytruncate
지시문 을 사용할 필요가 없습니다 . (여기서 문제가 발생합니다)
USR1-작업자 프로세스가 소유 한 모든 로그를 다시 엽니 다. 로그로 간주되는 내용은 Unicorn :: Util.reopen_logs를 참조하십시오. 로그 파일은 현재 요청 처리가 완료 될 때까지 다시 열리지 않으므로 한 요청에 대한 여러 로그 라인 (Rails에서 수행 한 것처럼)이 여러 로그에 분할되지 않습니다.
이 구성으로 업데이트 한 후 제대로 작동하기 시작했습니다.
/home/user/my_app/shared/log/*.log {
daily
missingok
dateext
rotate 30
compress
notifempty
extension gz
create 640 user user
sharedscripts
post-rotate
# Telling Unicorn to reload files
test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"
# Reloading rsyslog telling it that files have been rotated
reload rsyslog 2>&1 || true
endscript
}
답변
logrotate 파일에에 대한 항목이 포함되어 있으며 /home/user/shared/log/*.log
의 로그 파일과 일치하지 않습니다 /home/user/my_app/shared/log/unicorn.stderr.log
. copytruncate
rsyslog가 현재 파일의 이름을 바꾸고 새 파일을 작성하고 imfile이 이제 이름이 바뀐 파일의 파일 핸들을 계속 따라 가면서 해당 디렉토리에 대한 로그 항목을 추가해야 합니다.