docker(apache) 로그를 파일에 파이프하는 다음 cronjob이 있습니다.
* * * * * flock -n /srv/www/htdocs/scripts/pipe.lock /srv/www/htdocs/scripts/pipe_docker_logs.sh
Pipeline_docker_logs.sh는 다음 작업을 수행합니다.
tail -f `docker inspect --format='{{.LogPath}}' docker_apache` >& /var/log/apache2/docker_apache_access.log &
이 tail 백그라운드 프로세스에 의해 작성된 파일은 logrotate.d를 통해 회전됩니다.
파일이 회전되면 tail 프로세스는 새로 생성된 파일에 대한 쓰기를 중지합니다. tail 프로세스를 종료하고 cron이 이를 다시 시작하고 로그 파일에 다시 쓰기 시작할 때까지 기다립니다.
이제 로그가 회전되면 종료 또는 다시 시작 명령이 필요할 것이라고 생각합니다. 어쩌면 cron이 이 작업을 수행하기에 잘못된 장소이고 logrotate.d가 이를 수행해야 할까요? 어떤 팁이 있나요?
ELK와 Fluent에 대해 알고 있지만... 그건 단지 컨테이너일 뿐이고 좀 과한 것 같아요.
답변1
이 파일을 회전하기 위해 logrotate에 사용자 정의 지시문을 추가했다고 가정합니다. 그렇다면 해결책은 copytruncate
.매뉴얼 페이지
copytruncate
이전 로그 파일을 이동하고 새 로그 파일을 생성하도록 선택하는 대신 복사본을 생성한 후 원본 로그 파일을 자릅니다. 일부 프로그램에서 로그 파일을 닫으라고 지시할 수 없어 이전 로그 파일에 영원히 계속해서 쓸(추가) 수 있는 경우에 사용할 수 있습니다. 파일 복사와 자르기 사이의 시간 간격은 매우 짧으므로 일부 로깅 데이터가 손실될 수 있습니다. 이 옵션을 사용하면 이전 로그 파일이 그대로 유지되므로 만들기 옵션이 적용되지 않습니다.
여기에 예가 있습니다.
/var/log/custom_logs/*.log
{
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
copytruncate
}
도움이 되었기를 바랍니다.