로그 회전 후 Rsyslog가 원격 서버로 데이터 전송을 중지 함


9

내 구성에서, 나는 변화 다음을 담당하는 사람들 위해 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를 실행 중입니다.

답변:


8

문제는 실제로 로그 로테이션에서 발생했습니다.

기본적으로 유니콘을 실행하는 구성에서는 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
}

이것들이 파일의 직접적인 사본이라면, 문제는 실제로 당신이 post-rotate대신에 ( 사용 하지 않는) 사용하고 있다고 생각합니다 postrotate. 왜냐하면 원래 logrotate 스크립트는 rsyslog와 잘 작동했을 것입니다 (postrotate 스크립트가 실행 중이었다면) ) ...?
mltsy

2
언제 기억이 나지 않았지만로 변경 post-rotate했습니다 lastaction. 귀하의 의견은 여전히 ​​합리적이며 당시의 문제를 해결했을 수도 있습니다 :). 그러나 레코드의 copytruncate경우 느리고 파일 핸들로 재생되기 때문에 앞으로는 사용하지 않을 것 입니다.
빈센트 B.

2

logrotate 파일에에 대한 항목이 포함되어 있으며 /home/user/shared/log/*.log의 로그 파일과 일치하지 않습니다 /home/user/my_app/shared/log/unicorn.stderr.log. copytruncatersyslog가 현재 파일의 이름을 바꾸고 새 파일을 작성하고 imfile이 이제 이름이 바뀐 파일의 파일 핸들을 계속 따라 가면서 해당 디렉토리에 대한 로그 항목을 추가해야 합니다.


죄송합니다. 파일 이름은 오타 일뿐입니다. 그러나 copytruncate가 좋은 지적 일 수 있습니다. 하나만 살펴 보도록하겠습니다. :).
Vincent B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.