问题背景
项目部署的过程中,经常会需要查看程序的执行日志。我之前的做法都是用nohup ... > xxx.log 2>&1 &
将日志保存到xxx.log
文件中的。但是问题是,程序有时会运行很长时间,一直保存在一个文件里,文件会越来越大,下载、查看都不是很方便。所以就需要一种方法能够定时地将日志文件分割,比如按天分割,每天保存一个。正好Linux系统上的logrotate工具可以实现这个功能。
logrotate是什么?
官方介绍:
The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files. Logrotate can be set to handle a log file hourly, daily, weekly, monthly or when the log file gets to a certain size.
简单来说,就是可以自动地、定时地对日志文件进行轮转、压缩、删除。对于轮转操作,我理解就是对日志文件定时地进行备份、重命名,并生成新的日志文件的过程。
logrotate配置文件
配置文件主要有两部分:
shell
# 主配置
/etc/logrotate.conf
# 子配置
/etc/logrotate.d/*
主配置里就是一些全局配置,我在此次实现里没用到,就先不管。
子配置里存放的是不同服务对应的日志文件。比如我有一个springboot服务一直在往nohup.out文件中写文件,现在想用logrotate工具实现日志分割功能,那就可以在/etc/logrotate.d目录下创建一个名字为springboot文件:
shell
/etc/logrotate.d/springboot
文件里的具体内容如下:
shell
/path/to/nohup.out {
# 按每天轮转
daily
# 保存7个历史备份,即一周
rotate 7
# 日志非空时轮转
notifempty
# 自动创建新的日志文件,和源文件有相同权限
create
# 分割的日志文件的文件名以日期格式结尾
dateext
}
当然也有其他的配置,具体可以自行百度。
验证配置文件是否编写正确
写好了之后,我不可能等到每天凌晨它启动轮转的时候再去看它是否能够正常工作,那太费时间了。所以就需要手动地先进行验证。
好在logrotate也提供了这样的功能:
sudo logrotate -d /path/to/mylogrotate.conf
,用于验证配置文件是否编写正确。如果没有error报错,说明编写正确sudo logrotate -f /path/to/mylogrotate.conf
,用于强制执行轮转,执行后立刻执行轮转,这个时候就能查看是否能分割日志文件了
这里需要注意的是:
- 分割的日志文件默认是和轮转的日志文件同级目录的
- 由于轮转后会清空日志文件,所以保险起见,一定要先进行备份!!!(对于这种会删除数据、日志等的操作一定都要备份!!)
写配置文件遇到的问题
在写配置文件的时候,发现注释不能和单个配置写在同一行里,否则注释的#符号会被识别成配置,导致报错。正确的写法应该是注释单独写一行,比如:
shell
/path/to/nohup.out {
# 按每天轮转
daily
# 保存7个历史备份,即一周
rotate 7
# 日志非空时轮转
notifempty
# 自动创建新的日志文件,和源文件有相同权限
create
# 分割的日志文件的文件名以日期格式结尾
dateext
}
错误的写法:
shell
/path/to/nohup.out {
daily # 按每天轮转
rotate 7 # 保存7个历史备份,即一周
notifempty # 日志非空时轮转
create # 自动创建新的日志文件,和源文件有相同权限
dateext # 分割的日志文件的文件名以日期格式结尾
}