背景:线上部署的 rails+puma 程序 production.log 进行了切割,使用了 logrotate 进行每日一次的日志切割
问题:
1. 切割第一天production.log 没有日志被写入, 日志写入到了切割出来的production.log-2019xxxx文件中;
2. 切割第二天production.log 没有日志被写入, 前一天的production.log-2019xxxx.gz文件中也没有新的日志;所有产生的文件中均没有日志写入, rails 的日志消失了???
3. 重启puma 重新部署,日志被正常写入进production.log文件里面
猜测:多线程在日志切割点初始化时指定的日志文件产生不一致导致了 rails 不知道该把日志写到哪个文件中
logrotate 配置
/path/current/log/production.log {
daily
rotate 7
dateext
compress
delaycompress
missingok
notifempty
create 644 deploy deploy
su root deploy
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
综上,希望得到有类似经验的朋友帮忙,找到问题
https://gist.github.com/iamdbc/f73b1984a8ffe239b5e197ad8f5e9e87
应该需要重启 puma,你可以试下上面这个 (puma 未测试,我用的 unicorn 类似的设置没有问题)
host 多個 rails 網站的 log rotate 設定 https://github.com/charlietag/os_preparation/blob/master/templates/F_02_PKG_06_ruby_07_setup_rails_logrotate/etc/logrotate.d/rails
/etc/logrotate.d/rails
${web_sites}/*/log/*.log {
daily
rotate 30
compress
missingok
notifempty
create 644 ${current_user} ${current_user}
sharedscripts
postrotate
if [ -n "$1" ]; then
PUMA_PID_FILES="$(readlink -m "$(dirname "$1")/../tmp/pids/puma.pid")"
for PUMA_PID_FILE in $PUMA_PID_FILES; do
if [ -s "$PUMA_PID_FILE" ]; then
PUMA_PID=$(cat ${PUMA_PID_FILE} 2>/dev/null)
#echo "$1"
#echo "kill $PUMA_PID"
kill -USR2 $PUMA_PID
sleep 3
fi
done
fi
endscript
}
/data/deploy/laiwang/current/log/prod*.log {
daily
size 200M
missingok
compress
delaycompress
copytruncate
rotate 5
su deploy deploy
}
我现在的配置,没遇到你说的问题
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
你应该去重启 puma 而不是重启 syslog。看上去像是复制粘贴了 syslog 的 rotate 配置但是没有改重启脚本。
/home/jasl/sites/lab/shared/log/*.log {
daily
missingok
rotate 14
compress
delaycompress
dateext
notifempty
copytruncate
create 0640 jasl jasl
sharedscripts
postrotate
kill -HUP `cat /home/jasl/sites/lab/shared/tmp/pids/puma.pid`
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
祖传 logrotate 配置供参考
是时候普及一下 kill 和 linux 空间占用的知识了
在 linux 删除文件后,如果有进程在之前打开了这个文件,则这个删除的文件的空间是不会释放掉的 ,
(帖子提到的拆分日志后 puma 之后产生的日志就消失了 是因为之前 puma 进程打开的文件句柄,实际上是被删除了的 所以就会消失)
需要让打开这个文件的进程释放这个文件句柄,
那么最粗暴的释放句柄的方式是?
结束掉这个进程就好了...
然而 有些关键是有些进程并不方便被直接结束 (比如这里的 puma 进程)
其实 kill 并不像字面意义那样完全杀气腾腾,其实里面还隐藏了一个叫做信号量的东西
发送不同的信号量会实现不同的作用,这个具体得看进程程序是咋写的,只是一般情况下默认的信号量大家都是结束进程罢了
根据 puma 的文档 https://github.com/puma/puma/blob/master/docs/signals.md
kill -HUP puma.pid 就会根据路径重新打开文件句柄,而不影响其他的服务
(重新打开新的文件句柄,则又发现了新的文件,则日志就可以正常输出了)
so jasl 的这个是完全可行的