我有以下 cronjob,它将 docker (apache) 日志传输到文件中:
* * * * * 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 进程并等待 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
}
希望这可以帮助。