我正在使用 DockerCloud 来提供 RESTful API 微服务,并使用 LogDNA 查看容器的日志。我使用 logspout 将日志发送到 LogDNA,它运行良好,直到 dockercloud/logrotate 旋转我的容器日志。然后,logspout 似乎停止工作,我需要重新启动容器。此错误已记录并重现(https://github.com/gliderlabs/logspout/issues/309)。
在解决这个问题之前,我想在发生 dockercloud/logrotate 时自动重启 logspout 容器。我的想法是监听一个日志文件,当发生 logrotate 时,启动一个重启 logspout 的脚本,但还没有找到要检查的日志。
当发生 logrotate 时,关于如何重新启动 logspout 容器的任何想法?
答案1
我发现有人制作了一个 docker 镜像,在容器日志的大小减少后重新启动 logspout。(https://hub.docker.com/r/ograhl/logspout-restart/)
我还不能让它工作,但是我从中获取了脚本 run.sh 并对其进行了如下修改:
#!/bin/sh
set -e
last_logbytes=0
while true
do
# Sum up size of all log files
logbytes=`ls -s /var/lib/docker/containers/*/*.log | awk '{sum+=$1;} END {print sum;}'`
if [ $logbytes -lt $last_logbytes ]; then
# Size has been reduced since last poll; Restart logspout
echo "Restarting Logspout..."
docker restart f4f5159fe595 #This is logspout container id
fi
last_logbytes=$logbytes
sleep 10
done
我已经编辑了 /etc/rc.local 以在启动时启动该脚本。
由于此解决方案每 10 秒运行一次,因此会丢失一些日志。除非 logspout 修复此问题,否则我们只能忍受这种情况。