logrotate
로그 파일을 회전하기 위해 with를 사용하고 copytruncate
있으며 새 파일 이름을 매개변수로 사용하여 스크립트를 실행해야 합니다. $1
inside 를 사용할 수 있다는 것을 알고 있지만 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
:
일반적으로 로그 파일의 절대 경로는 첫 번째 인수로 스크립트에 전달되고, 최종 회전된 로그 파일의 절대 경로는 두 번째 인수로 스크립트에 전달됩니다.
두 번째 매개변수만 확인하면 될 것 같습니다.