部署 关于 logrotate日志切割多线程 Rails 程序时出现的日志记录消失问题,求教

cckkll · 2019年06月17日 · 最后由 cckkll 回复于 2019年06月19日 · 6256 次阅读
  • 背景: 线上部署的 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
}

综上,希望得到有类似经验的朋友帮忙, 找到问题

copytruncate 加这个试试看

liuminhan 回复

加了这个选项后还要重启 puma,因为 puma 进程还处于找不到 production.log 的状态

liuminhan 回复

看了文档之后我觉得也可以加上 copytruncate 这个参数试试

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
}

如果需要重启 puma 我觉得就不需要改配置了

/data/deploy/laiwang/current/log/prod*.log {
    daily
    size 200M
    missingok
    compress
    delaycompress
    copytruncate
    rotate 5
    su deploy deploy
}

我现在的配置, 没遇到你说的问题

之前沒看到這個參數,copytruncate,看起來是好參數!

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 配置供参考

msg7086 回复

还真是 但是我不想重启 puma 啊

jasl 回复

谢谢

cckkll 回复

为啥不想重启 puma?

hjiangwen 回复

你不觉得日志切割没有必要重启服务吗

jicheng1014 回复

谢谢解答 很详细 👍

cckkll 关闭了讨论。 06月19日 10:31
需要 登录 后方可回复, 如果你还没有账号请 注册新账号