Logrotate: 회전된 파일을 사용하여 postrotate 스크립트 실행

Logrotate: 회전된 파일을 사용하여 postrotate 스크립트 실행

logrotate로그 파일을 회전하기 위해 with를 사용하고 copytruncate있으며 새 파일 이름을 매개변수로 사용하여 스크립트를 실행해야 합니다. $1inside 를 사용할 수 있다는 것을 알고 있지만 postrotate이는 날짜 확장자를 가진 파일이 아니라 회전된 파일의 이름을 제공합니다.

그래서 기본적으로 나는 다음을 가지고 있습니다 :

/var/log/myapp/server.log

이 logrotate 구성을 실행하면 다음과 같습니다.

/var/log/myapp/server.log {
  copytruncate
  rotate 1008
  dateext
  dateformat -%s
  create 660 syslog syslog
  postrotate
    python3 /opt/myapp/test.py $1 > /dev/null
  endscript
}

알겠어요

/var/log/myapp/server.log <-- (now empty)
/var/log/myapp/server.log-1536844088

회전 후 스크립트를 어떻게든 실행할 수 있나요 /var/log/myapp/server.log-1536844088?

답변1

내가 이해한 바에 따르면 logrotate는 로그 파일 이름을 의 postrotate스크립트에 전달합니다. 스크립트와 첫 번째 인수를 사용하고 logrotate가 날짜 형식을 사용하여 회전된 파일을 생성했다는 지식을 사용하여 -%s이러한 파일 목록을 생성 할 수 있습니다.

import sys
import fnmatch
import os

for file in os.listdir(os.path.dirname(sys.argv[1])):
        if fnmatch.fnmatch(file, os.path.basename(sys.argv[1]) + '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'):
                print(file)

이것은 내 첫 번째 Python 스크립트이므로 관용적이지는 않지만 아이디어를 보여주기를 바랍니다. fnmatch() 함수에서 사용하는 glob은 몇 년 동안(2286년 11월 말까지) 9,999,999,999초가 10,000,000,000초로 롤오버됩니다. "단지" "10자리 숫자만" 필요하도록 범위를 "확대"할 수 있습니다.

...
if fnmatch.fnmatch(file, os.path.basename(sys.argv[1]) + '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*'):
...

답변2

dateformat -%s예를 들어 접미사를 추가하면 고유한 파일을 찾아 X 없이 이름을 바꾼 후 Python에 제공 X할 수 있습니다 .*X

dateformat -%sX
postrotate
  for f in *X; do mv "$f" "${f%X}" && test.py "${f%X}"; done
endscript

for덜 깨지도록 고리 를 사용했어요 . 이 프로세스가 올바른지 확인하고 싶을 수도 있습니다 /bin/sh.

답변3

postrotate
  python3 /opt/myapp/test.py $1-`date '+%Y%m%d'` > /dev/null
endscript

같은 날 실행되는 한 작동합니다.

답변4

에서 man logrotate:

일반적으로 로그 파일의 절대 경로는 첫 번째 인수로 스크립트에 전달되고, 최종 회전된 로그 파일의 절대 경로는 두 번째 인수로 스크립트에 전달됩니다.

두 번째 매개변수만 확인하면 될 것 같습니다.

관련 정보