나는 logrotate를 사용하여 Apache 액세스 로그, 오류 로그를 회전하고 로그를 다시 작성합니다. 내 구성 파일은 다음과 같습니다.
/apache/*log {
compress
dateext
rotate 365
size=+300M
olddir /log/old/apache
notifempty
missingok
lastaction
/bin/apache reload
endscript
}
내 문제는 회전이 발생할 때마다 Apache가 방금 회전된 로그 파일에 아무 것도 쓰지 않기 때문에 Apache를 다시 로드해야 한다는 것입니다. logrotate가 회전할 때마다 Apache가 다시 로드되는 것을 방지할 수 있는 방법이 있습니까?
답변1
아파치가 다시 로드해야 하는 이유는 일단 파일을 열면 파일 핸들을 얻고 해당 파일 핸들에 계속 쓰기 때문입니다. 파일을 이동할 때 이 내용이 표시되지 않고 동일한 핸들에 계속 기록됩니다. 다시 로드하면 파일이 다시 열리고 새 핸들이 생성됩니다.
다시 로드하지 않으려면 파일을 이동하는 대신 파일을 복사하고 이전 파일을 지울 수 있습니다. 이 방법으로 Apache는 동일한 파일 핸들에 계속 쓸 수 있습니다. 다음과 같이 logrotate 구성 파일에 "copytruncate" 옵션을 추가하면 됩니다.
/apache/*log {
copytruncate
compress
dateext
rotate 365
size=+300M
olddir /log/old/apache
notifempty
missingok
}
답변2
사용하시길 추천드려요http://cronolog.org/
이것이 내가 사용하는 방법입니다:
CustomLog "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined