Linux日志管理工具Logrotate:自动化轮转与最佳实践
本文最后更新于 2024-08-06,文章内容可能已经过时。
一、介绍
logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。系统会按照计划的频率运行logrotate,通常是每天。在大多数的Linux发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate
1.1 配置文件解释
系统默认安装logrotate工具,它默认的配置文件在:
主配置文件: /etc/logrotate.conf
目录:/etc/logrotate.d/
logrotate 历史记录: /var/lib/logrotate/logrotate.status
logrotate.conf 是 logrotate 的主配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行,另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。
logrotate 定义日志信息配置选项:
compress --> 压缩日志文件的所有非当前版本
daily,weekly,monthly --> 按指定计划轮换日志文件
delaycompress --> 压缩所有版本,除了当前和下一个最近的
endscript --> 标记 prerotate 或 postrotate 脚本的结束
errors "emailid" --> 给指定邮箱发送错误通知
missingok --> 如果日志文件丢失,不要显示错误
notifempty --> 如果日志文件为空,则不轮换日志文件
olddir "dir" --> 指定日志文件的旧版本放在 “dir” 中
postrotate --> 引入一个在日志被轮换后执行的脚本
prerotate --> 引入一个在日志被轮换前执行的脚本
rotate 'n' --> 在轮换方案中包含日志的 n 个版本
sharedscripts --> 对于整个日志组只运行一次脚本
size='logsize' --> 在日志大小大于 logsize(例如 100K,4M)时轮换
logrotate 命令格式:
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
在我们系统上,位于/var/log 下面的一些系统日志,boot.log rpmpkgs.log 等等 都使用了logrotate工具
配置文件如下图所示
二、测试logrotate工具
测试目的: 让我们为我们自己的示例日志文件 /root/sample.log 配置 logrotate,实现自动切割日志
第一步,先准备好文件内容
[root@localhost ~]# cat > /root/sample_output.log << EOF
this is a test log
hello srebro.cn
EOF
[root@localhost ~]# cat /root/sample_output.log
this is a test log
hello srebro.cn
第二步,在 /etc/logrotate.d/目录中 添加一个配置文件
# vim /etc/logrotate.d/srebro-test
# Logrotate file for test
/root/sample_output.log
{
missingok
daily
copytruncate
rotate 30
notifempty
dateext
}
通常,你需要等待一天才能等到 logrotate 由 /etc/cron.daily 执行。除此之外,你可以手动执行logrotate命令
第三步,手动执行logrotate 命令
/usr/sbin/logrotate -vf /etc/logrotate.d/srebro-test
[root@localhost ~]# ls -l sample_output.log*
-rw-r--r-- 1 root root 0 8月 6 14:21 sample_output.log
-rw-r--r-- 1 root root 35 8月 6 14:21 sample_output.log-20240806
完成sample_output.log 文件的切割
三、日志切割案例
3.1 nginx日志切割
[root@hcss-ecs-195f logs]# cat /etc/logrotate.d/nginx
/home/application/nginx/logs/*.log
{
missingok
daily
copytruncate
rotate 30
notifempty
dateext
}
[root@hcss-ecs-195f logs]# ll /home/application/nginx/logs/
total 124736
-rw-r--r-- 1 root root 179863 Aug 6 14:27 access.log
-rw-r--r-- 1 root root 127304584 Aug 6 13:35 access.log-20240806
-rw-r--r-- 1 root root 0 Aug 6 13:35 error.log
-rw-r--r-- 1 root root 234502 Aug 6 13:35 error.log-20240806
3.2 tomcat 日志切割
[root@hcss-ecs-195f logs]# cat /etc/logrotate.d/tomcat
/home/application/tomcat/logs/catalina.out {
rotate 14
daily
copytruncate
compress
notifempty
missingok
}
[root@hcss-ecs-195f logs]# ll /home/application/tomcat/logs/
-rw-r--r-- 1 root root 179863 Aug 6 14:27 catalina.out
-rw-r--r-- 1 root root 127304584 Aug 6 13:35 catalina.out.1.gz
3.3 mysql日志切割
[root@hcss-ecs-195f logs]# cat /etc/logrotate.d/mysql
/home/application/Database/mysql5.7/data/mysqld.log
/home/application/Database/mysql5.7/data/slow_query.log
{
missingok
daily
copytruncate
rotate 30
notifempty
dateext
}
[root@localhost logrotate.d]# ll /home/application/Database/mysql5.7/data/mysqld.log*
-rw-r----- 1 systemd-coredump input 18713 8月 6 14:32 /home/application/Database/mysql5.7/data/mysqld.log
-rw-r----- 1 systemd-coredump input 421220 8月 6 13:40 /home/application/Database/mysql5.7/data/mysqld.log-20240806
[root@localhost logrotate.d]# ll /home/application/Database/mysql5.7/data/slow_query.log*
-rw-r----- 1 systemd-coredump input 175 8月 6 13:41 /home/application/Database/mysql5.7/data/slow_query.log
-rw-r----- 1 systemd-coredump input 1222 8月 6 13:40 /home/application/Database/mysql5.7/data/slow_query.log-20240806
四、参考
- https://www.cnblogs.com/txlsz/p/13126723.html
- 感谢你赐予我前进的力量