天天看点

Linux日志切割工具Logrotate配置详解

作者:海淘世界

日志记录了程序运行时各种信息,通过日志可以分析用户行为,记录运行轨迹,查找程序问题。随着时间增长,日志越来越大,为了节省空间和整理方便,日志文件经常需要按时间或大小等维度分成多份,删除时间久远的日志文件,这也称为日志轮转、日志分割、日志切割等。

Logrotate 程序是Linux默认安装的日志文件管理工具,它可以用来轻松分割日志文件,压缩转存、删除旧的日志文件,并创建新的日志文件。

Linux日志切割工具Logrotate配置详解

Logrotate(/usr/sbin/logrotate)由Linux计划任务crond(/usr/sbin/crond)定期驱动运行的,它的主配置文件位于:/etc/logrotate.conf。

logrotate命令格式如下:

logrotate [OPTION...] <configfile>           

常用选项包括:

  • -d, --debug :debug模式,测试配置文件是否有错误。
  • -f, --force :强制转储文件。
  • -m, --mail=command :压缩日志后,发送日志到指定邮箱。
  • -s, --state=statefile :使用指定的状态文件。
  • -v, --verbose :显示转储过程。

既然Logrotate是一个普通的程序,那么我们就可以手动运行它,例如 -f 进行调试:

logrotate -f /etc/logrotate.d/nginx
logrotate -f /etc/logrotate.d/php           

Logrotate配置文件介绍

Linux系统已经默认安装了logrotate,位于/usr/sbin/logrotate,配置文件包括:

  • /etc/logrotate.conf 主配置文件,其中语句include /etc/logrotate.d的作用是包含logrotate.d目录下的配置文件。
  • /etc/logrotate.d/ 应用程序配置文件,保存一些应用的配置文件(Apache、Nginx、MySQL、PHP、Tomcat…)
# ll /etc/logrotate.d
total 56
-rw-r--r--  1 root root   91 Mar 15  2022 bootlog
-rw-r--r--. 1 root root  130 Feb 19  2018 btmp
-rw-r--r--. 1 root root  160 May 12  2021 chrony
-rw-r--r--. 1 root root   88 Apr 12  2021 dnf
-rw-r--r--  1 root root   93 Mar 15  2022 firewalld
-rw-r--r--  1 root root  194 Mar 25  2022 httpd
-rw-r--r--. 1 root root  162 Mar 11  2022 kvm_stat
-rw-r--r--  1 root root 1977 Sep 22  2021 mysqld
-rw-r--r--  1 root root  203 Nov 10  2021 php-fpm
-rw-r--r--. 1 root root  408 Apr 12  2021 psacct
-rw-r--r--. 1 root root  155 Mar 16  2022 samba
-rw-r--r--. 1 root root  237 Feb  2  2022 sssd
-rw-r--r--  1 root root  100 May 19  2021 wpa_supplicant
-rw-r--r--. 1 root root  145 Feb 19  2018 wtmp           

Logrotater日志文件切割策略

主配置文件 logrotate.conf 定义了Logrotate的默认行为,例如轮转周期、保留几个日志文件、是否压缩等。

注意:include /etc/logrotate.d 语句还将导入/etc/logrotate.d/ 目录中的各个应用配置,例如Apache、yum等程序。如果想要轮转某个应用产生的日志文件,那么可以将它的日志轮转配置文件放到这个目录。

# ll -h /etc/logrotate.d
total 28K
-rw-r--r--  1 root root  91 Aug  6  2019 bootlog
-rw-r--r--  1 root root 160 Sep 19  2018 chrony
-rw-r--r--  1 root root 194 Jan  8  2022 httpd
-rw-r--r--  1 root root 810 Oct  2  2020 mariadb
-rw-r--r--  1 root root 224 Sep 30  2020 syslog
-rw-r--r--. 1 root root 100 Oct 31  2018 wpa_supplicant
-rw-r--r--  1 root root 103 Aug  8  2019 yum
           

文件的最后还举了两个示例,从这两个示例可以看出logrotate使用方法非常简单:

/var/log/wtmp 表示想要轮转的对象(这里是文件wtmp),除了单个文件以外,还支持通配符以表示多个文件,例如:

  • /var/log/news/*:/var/log/news/目录下的所有文件
  • ~/log/*.log:~/log/目录下所有.log文件
# cat /etc/logrotate.conf
weekly 			//默认每一周执行一次rotate轮转工作
rotate 4 		//保留多少个日志文件(轮转几次),默认保留四个,即指定日志文件删除之前轮转的次数,0 指没有备份
create 			 //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为修改了日志文件名,因此要创建一个日志文件
dateext 	  //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
compress //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行
include /etc/logrotate.d //导入/etc/logrotate.d/ 目录中的各个应用配置

/var/log/wtmp { 		//仅针对 /var/log/wtmp 所设定的参数
    monthly //每月一次切割,取代默认的一周
    minsize 1M //文件大小超过 1M 后才会切割
    create 0664 root utmp //指定新建的日志文件权限以及所属用户和组
    rotate 1 //只保留一个日志
}
#这个 wtmp 可记录用户登录系统及系统重启的时间
#因为有 minsize 的参数,因此不见得每个月一定会执行一次喔,要看文件大小。

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}           

Logrotate中其他可配置参数,具体如下:

compress //通过gzip 压缩转储以后的日志
nocompress //不做gzip压缩处理
copytruncate //用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate //备份日志文件不过不截断
create mode owner group //轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate //不建立新的日志文件
delaycompress //和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress //覆盖 delaycompress 选项,转储同时压缩。
missingok //如果日志丢失,不报错继续滚动下一个日志
errors address //专储时的错误信息发送到指定的Email 地址
ifempty //即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty //当日志文件为空时,不进行轮转
mail address //把转储的日志文件发送到指定的E-mail 地址
nomail //转储时不发送日志文件
olddir directory //转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir //转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts //运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate //在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate //在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily //指定转储周期为每天
weekly //指定转储周期为每周
monthly //指定转储周期为每月
rotate count //指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5个备份
dateext //使用当期日期作为命名格式
dateformat //配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %H %M %S %V %s
size(minsize) logsize //当日志文件到达指定的大小时才轮转,可以指定单位为k或M,例如size 500k、size 100M           

Apache日志

# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}           

查看Apache日志目录,可以发现轮转规律与上面描述一致。

# ll -h /var/log/httpd/
total 772M
-rw-r--r-- 1 root root  76M Nov  7 21:16 access_log
-rw-r--r-- 1 root root 166M Oct 16 03:14 access_log-20221016
-rw-r--r-- 1 root root 158M Oct 23 03:27 access_log-20221023
-rw-r--r-- 1 root root 177M Oct 30 03:34 access_log-20221030
-rw-r--r-- 1 root root 196M Nov  6 03:43 access_log-20221106
-rw-r--r-- 1 root root  36K Nov  7 21:05 error_log
-rw-r--r-- 1 root root 352K Oct 16 03:14 error_log-20221016
-rw-r--r-- 1 root root 211K Oct 23 03:27 error_log-20221023
-rw-r--r-- 1 root root 302K Oct 30 03:34 error_log-20221030
-rw-r--r-- 1 root root 142K Nov  6 03:43 error_log-20221106
-rw-r--r-- 1 root root    0 May 22 03:34 ssl_access_log
-rw-r--r-- 1 root root  32K May 15 10:46 ssl_access_log-20220522
-rw-r--r-- 1 root root    0 May 22 03:34 ssl_error_log
-rw-r--r-- 1 root root 1.9K May 15 10:50 ssl_error_log-20220522
-rw-r--r-- 1 root root    0 May 22 03:34 ssl_request_log
-rw-r--r-- 1 root root  42K May 15 10:46 ssl_request_log-20220522           

Nginx日志

# cat /etc/logrotate.d/nginx

/var/log/weblog/*.log {
    daily  //指定转储周期为每天
    compress  //通过gzip 压缩转储以后的日志
    rotate 7  //保存7天的日志
    missingok  //如果日志文件丢失,不要显示错误
    notifempty  //当日志文件为空时,不进行轮转
    dateext  //使用当期日期作为命名格式,exp: nginx_access.log-20190120
    sharedscripts  //运行postrotate脚本
    postrotate  //执行的指令
            if [ -f /run/nginx.pid ]; then
                    kill -USR1 `cat /run/nginx.pid`
            fi
    endscript  //结束指令
}           

PHP-FPM日志

# cat /etc/logrotate.d/php-fpm
/var/log/php-fpm/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/kill -SIGUSR1 `cat /run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
    endscript
}           

参考文章

  • https://www.digihunch.com/2018/05/cron-and-logrotate-in-centos/
  • https://www.jianshu.com/p/c44e7d79096e
  • http://c.biancheng.net/view/1095.html
  • https://cloud.tencent.com/developer/article/1619542
  • https://zhuanlan.zhihu.com/p/90507023
  • https://blog.csdn.net/xiaojin21cen/article/details/122309230
  • https://blog.csdn.net/damiaomiao666/article/details/72597731
  • https://www.cnblogs.com/wushuaishuai/p/9330952.html#_label0
  • https://www.jianshu.com/p/87e2fd01393c

继续阅读