我正在接管一个服务器的管理,该服务器有一个定制的第 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 没有旋转上述文件夹中的任何日志。
基本上:
- 我希望能够运行命令来手动轮换日志和/或让日志每个周日晚上自动轮换。
- 如果我需要关闭 Rails 应用程序来轮换日志,我对此没有任何问题,因为我每周日晚上都有一个维护窗口来执行此操作。
- 最后,我不确定是否应该每周将日志文件压缩到 bz2 中,或者仅每月压缩与上个月相关的任何轮换日志的日志。这主要是因为我不确定这个应用程序如何使用日志,而且我从未使用过 Rails 应用程序,也不需要手动配置日志轮换。
此时我确实需要保留所有日志文件而不是丢弃任何日志文件。欢迎提供与轮换日志相关的任何信息,例如在尝试轮换之前备份日志。
答案1
logrotate
系统使用它来轮换日志,因此您有 2 个选择。您可以将这些应用程序日志的轮换合并到系统轮换中,也可以设置自己的轮换,然后手动运行它们或从 root 用户的 crontab 运行它们(假设 Rails 应用程序以 root 身份运行,其目录为/root/...
)。
系统轮换
要在系统预先存在的日志中设置日志轮转,只需将新文件添加到目录中即可/etc/logrotate.d
。叫它railsapp.conf
。我会使用那里的其他示例来构建它。还与logrotate
手册页进行交流。
用户轮换
如果您想运行自己的实例,logrotate
只需为其提供命令行开关即可。
- 首先复制一份
/etc/logrotate.conf
/root/rails_logrotate.conf
- 编辑该文件,使其按照您想要的方式配置日志轮换(即保留所有日志、每周轮换等)
运行
# 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
。
例子
从该日志文件开始。
$ 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
现在运行
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
检查结果
$ 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 * * * *".