Linux 日志管理工具 | logrotate------------(切割NGINX相关日志)
Linux 日志管理工具 | logrotate
logrotate软件是一个日志管理工具,用于切割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。最小化安装系统后logrotate工具已经安装,需要对什么服务的日志轮循,则在默认配置文件/etc/logrotate.conf中添加,或者在/etc/logrotate.d目录里创建新的配置文件
-
命令选项说明
选项 说明 -d debug模式,隐含-v,不会对日志文件做实际操作 -f --force,强制轮转日志 -v 在轮换日志时显示详细信息 -s 使用指定的状态文件 -
配置文件参数及说明
参数 说明 daily 指定转储周期为每天 weekly 指定转储周期为每周 monthly 指定转储周期为每月 size 当日志文件达到指定大小时才转储,缺省单位是字节,可以设定k(小写)或者M(大写) rotate 指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份 compress 通过gzip压缩转储后的日志 nocompress 不压缩转储后的日志 dateext 在转储后的日志文件后面加上日期做后缀 dateformat 指定日期格式,默认是 -%Y%m%d,最多也只能加上秒,如:-%Y%m%d%s copytruncate 用于还在打开中的日志文件,把当前日志备份并截断 nocopytruncate 备份日志文件不截断 nocreate 不建立新的日志文件 delaycompress 与compress一起使用时,转储的日志到下一次转储时才压缩 nodelaycompress 覆盖delaycompress,转储完成时就压缩 ifempty 即使是空文件也转储,缺省选项 notifempty 空文件不转储 olddir dir 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 noolddir 转储后的日志文件和当前日志文件放在同一目录 include 用于读取其他配置文件,可以指定文件,也可以指定目录 create 自动建立新的日志文件,新的日志文件具有和原来的文件一样权限 prerotate/endscript 在转储以前需要执行的的命令,这两个关键字必须独立成行 postrotate/endscript 在转储以后需要执行的的命令,这两个关键字必须独立成行 firstaction/endscript 在转储所有匹配通配符的日志之前执行的命令,在prerotate之前执行,这两个关键字必须独立成行 lastaction/endscript 在转储所有匹配通配符的日志之后执行的命令,在postrotate之后执行(并且至少有一个日志被转储才会执行),这两个关键字必须独立成行 -
配置说明
logrotate缺省配置文件是 /etc/logrotate.conf,配置文件中通过使用include选项读取其他配置文件,默认指定的是 /etc/logrotate.d/,该目录下配置文件的参数会覆盖缺省参数。以下将讲述logrotate的配置步骤,实现将日志转储,这里使用testlog作为示例:
示例:配置Nginx日志转储策略:每月转储并保留6个月日志
-
在/etc/logrotate.d/目录下创建子配置文件
[root@server logs]# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log #指定日志路径
{
monthly#每月转储一次
rotate 6#保留6个备份
copytruncate#备份日志并截断
delaycompress#转储的日志到下一次转储时才压缩
compress#转储后使用gzip压缩
notifempty#日志为空时不处理
missingok#切割中遇到日志错误忽略
dateext#在转储后的日志加上日期做后缀
dateformat -%Y%m%d#指定日期的格式
}
-
创建好配置以后,系统会在每天利用 cron 定时执行 logrotate 日志分割指令。这里我们为了看到效果,不等到系统自动执行,可以手动强制执行一次日志分割,强制执行会立即进行一次日志。手动运行logrotate命令,命令如下:
[root@server logs]# logrotate -fv /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /usr/local/nginx/logs/*.log forced from command line (6 rotations)
empty log files are not rotated, old logs are removed
considering log /usr/local/nginx/logs/access.log
log needs rotating
considering log /usr/local/nginx/logs/error.log
log needs rotating
rotating log /usr/local/nginx/logs/access.log, log->rotateCount is 6
Converted ' -%Y%m%d' -> '-%Y%m%d'
dateext suffix '-20230709'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
copying /usr/local/nginx/logs/access.log to /usr/local/nginx/logs/access.log-20230709
truncating /usr/local/nginx/logs/access.log
rotating log /usr/local/nginx/logs/error.log, log->rotateCount is 6
Converted ' -%Y%m%d' -> '-%Y%m%d'
dateext suffix '-20230709'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
copying /usr/local/nginx/logs/error.log to /usr/local/nginx/logs/error.log-20230709
truncating /usr/local/nginx/logs/error.log
注释:-v选项可以查看logrotate命令运行的详细信息,通过以上的输出,可以很清楚的看出logrotate的运行过程
-
检查,查看日志是否被转储,命令如下
[root@server logs]# ll
total 20
-rw-r----- 1 nobody nobody 0 Jul 9 14:14 access.log
-rw-r----- 1 nobody nobody 2040 Jul 9 14:14 access.log-20230709
-rw-r----- 1 nobody nobody 0 Jul 9 14:14 error.log
-rw-r----- 1 nobody nobody 9102 Jul 9 14:14 error.log-20230709
-rw-r--r-- 1 root root 5 Jul 9 11:46 nginx.pid
注释:可以看到原来的日志文件nginx日志access、error已经被转储,access.log跟error.log大小已经为0字节
[root@master logs]# cat /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log #指定日志路径
{
monthly
copytruncate
delaycompress
compress
notifempty
missingok
dateext
dateformat -%Y%m%d
}
进行转存操作:::::
正在转存操作中::::
[root@master logs]# ll
total 1661792
-rw-r--r--. 1 root root 0 Jul 14 10:29 access.log
-rw-r--r--. 1 root root 532666942 Jul 14 10:29 access.log-20230714
-rw-r--r--. 1 root root 0 Jul 14 10:32 error.log
-rw-r--r--. 1 root root 1169002313 Jul 14 10:32 error.log-20230714
-rw-r--r--. 1 root root 4 Jul 6 10:31 nginx.pid
转存成功,旧的日志被清空为0,产生新的备份文件,并且以时间为命名:::