日志切割工具的使用 - logrotate

温馨提醒

logrotate运行机制

系统会定时运行logrotate,一般是每天一次。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate

logrotate组成

1
2
3
4
/usr/bin/logrotate				# 程序所在目录
/etc/cron.daily/logrotate		# 默认crontab每天执行一次logrotate
/etc/logrotate.conf				# 全局配置文件
/etc/logrotate.d

安装

1
yum install logrotate

配置

vim /etc/logrotate.d/tomcat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/data/tomcat/logs/catalina.out {
	daily 				# 表示每天整理一次
	copytruncate		# 用于还在打开中的日志文件,把当前日志备份并截断
	rotate 30			# 保留30天的备份文件,一定要备份该,如果不配置默认是0,也就是只允许存在一份日志,刚切出来的日志马上就会被删除
	compress			# 通过gzip压缩转储日志
	notifempty			# 如果是空文件,不转储
	dateext				# 文件后缀是日期格式,也就是切割后文件是xxx.log-20211217.gz
	missingok			# 如果日志不存在则忽略该警告信息
}
		
以下为不常用参数:
weekly            指定转储周期为每周
monthly           指定转储周期为每月
nocompress        不需要压缩时,用这个参数 
nocopytruncate    备份日志文件但是不截断
create mode owner group   转储文件,使用指定的文件模式创建新的日志文件
nocreate          不建立新的日志文件
delaycompress 和 compress    一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress     覆盖 delaycompress 选项,转储同时压缩
errors address     转储时的错误信息发送到指定的Email 地址
ifempty     	即使是空文件也转储,这个是 logrotate 的缺省选项。
mail address     把转储的日志文件发送到指定的E-mail 地址
nomail      	转储时不发送日志文件
olddir directory      转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 
noolddir      	转储后的日志文件和当前日志文件放在同一个目录
prerotate/endscript     在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript   在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

测试

1
2
logrotate -d /etc/logrotate.d/tomcat				# 调试-d
logrotate -v -f /etc/logrotate.d/tomcat				# 强制执行-f

案例

  • nginx 日志切割

    cat /etc/logrotate.d/nginx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    /home/application/nginx/logs/*.log
    {
        missingok
        daily
        copytruncate
        rotate 30
        notifempty
        dateext
    }
  • tomcat 日志切割

    cat /etc/logrotate.d/tomcat

    1
    2
    3
    4
    5
    6
    7
    8
    
    /home/application/tomcat/logs/catalina.out {
    rotate 14
    daily
    copytruncate
    compress
    notifempty
    missingok
    }
  • mysql 日志切割

    cat /etc/logrotate.d/mysql

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    /home/application/Database/mysql5.7/data/mysqld.log
    /home/application/Database/mysql5.7/data/slow_query.log
    
    {
        missingok
        daily
        copytruncate
        rotate 30
        notifempty
        dateext
    }