本文最后更新于 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工具

配置文件如下图所示

image-20240806141041537

二、测试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 文件的切割
image-20240806142239862

三、日志切割案例

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