如何正确自动/手动轮换生产 Rails 应用程序的日志文件

如何正确自动/手动轮换生产 Rails 应用程序的日志文件

我正在接管一个服务器的管理,该服务器有一个定制的第 3 方 Rails 应用程序。应用程序开发人员告诉我 ruby​​ 日志文件变得越来越大,并向我指出了以下链接:-https://stackoverflow.com/questions/4883891/ruby-on-rails-product-log-rotation

日志位于 /root/product/app/log 中。该文件夹包含多个以 .log 结尾的文件。当前日志文件大小约为2GB,该文件夹还包含格式为“logname.log.2013_01_18.bz2”的归档日志文件。

我尝试搜索 ssh 命令历史记录,看看是否可以看到哪个命令用于创建存档文件,但这些命令不会返回那么远。我还运行了“cat /var/lib/logrotate/status”,但看起来 logrotate 没有旋转上述文件夹中的任何日志。

基本上:

  1. 我希望能够运行命令来手动轮换日志和/或让日志每个周日晚上自动轮换。
  2. 如果我需要关闭 Rails 应用程序来轮换日志,我对此没有任何问题,因为我每周日晚上都有一个维护窗口来执行此操作。
  3. 最后,我不确定是否应该每周将日志文件压缩到 bz2 中,或者仅每月压缩与上个月相关的任何轮换日志的日志。这主要是因为我不确定这个应用程序如何使用日志,而且我从未使用过 Rails 应用程序,也不需要手动配置日志轮换。

此时我确实需要保留所有日志文件而不是丢弃任何日志文件。欢迎提供与轮换日志相关的任何信息,例如在尝试轮换之前备份日志。

答案1

logrotate系统使用它来轮换日志,因此您有 2 个选择。您可以将这些应用程序日志的轮换合并到系统轮换中,也可以设置自己的轮换,然后手动运行它们或从 root 用户的 crontab 运行它们(假设 Rails 应用程序以 root 身份运行,其目录为/root/...)。

系统轮换

要在系统预先存在的日志中设置日志轮转,只需将新文件添加到目录中即可/etc/logrotate.d。叫它railsapp.conf。我会使用那里的其他示例来构建它。还与logrotate手册页进行交流。

用户轮换

如果您想运行自己的实例,logrotate只需为其提供命令行开关即可。

  1. 首先复制一份/etc/logrotate.conf /root/rails_logrotate.conf
  2. 编辑该文件,使其按照您想要的方式配置日志轮换(即保留所有日志、每周轮换等)
  3. 运行

    # 1st time
    $ logrotate -d -f -s $HOME/my_logrotate.state logrotate.conf
    
    # afterwards
    $ logrotate -d -s $HOME/my_logrotate.state logrotate.conf
    

    如果一切正常,您可以重新运行这些命令而无需切换-d。这仅用于调试目的,实际上不会执行任何任务,只是向您展示它会做什么。

    $ logrotate -s $HOME/my_logrotate.state logrotate.conf     
    

    您还可以使用该-v开关使其变得详细,类似于使用该开关时看到的输出-d

例子

  1. 从该日志文件开始。

    $ dd if=/dev/zero of=afile bs=1k count=10k
    10240+0 records in
    10240+0 records out
    10485760 bytes (10 MB) copied, 0.0702393 s, 149 MB/s
    
    $ ll afile
    -rw-rw-r-- 1 saml saml 10485760 Aug  6 14:37 afile
    
    $ touch -t 201307010101 afile
    $ ll afile
    -rw-rw-r-- 1 saml saml 10485760 Jul  1 01:01 afile
    
  2. 现在运行logrotate

    $ logrotate -v -f -s $HOME/my_logrotate.state logrotate.conf
    reading config file logrotate.conf
    reading config info for /home/saml/afile 
    
    Handling 1 logs
    
    rotating pattern: /home/saml/afile  forced from command line (1 rotations)
    empty log files are rotated, old logs are removed
    considering log /home/saml/afile
      log needs rotating
    rotating log /home/saml/afile, log->rotateCount is 1
    dateext suffix '-20130806'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    glob finding old rotated logs failed
    renaming /home/saml/afile to /home/saml/afile-20130806
    creating new /home/saml/afile mode = 0664 uid = 500 gid = 501
    
  3. 检查结果

    $ ll afile*
    -rw-rw-r-- 1 saml saml        0 Aug  6 14:40 afile
    -rw-rw-r-- 1 saml saml 10485760 Jul  1 01:01 afile-20130806
    

每周计划

要使其每周日运行,您可以为 root 用户创建以下 crontab 条目。

$ crontab -e

添加以下行:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
0 0 * * sun logrotate -v -f -s $HOME/my_logrotate.state $HOME/logrotate.conf

然后保存上面的内容。

您还可以使用这些类型的快捷方式,而不是指定实际的天、分钟、秒等。

string         meaning
------         -------
@reboot        Run once, at startup.
@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *".

参考

相关内容