1、简介
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把这个过程叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行,比如系统每天的定时任务会执行一次logrotate操作来完成系统日志的转储。logrotate 的默认配置文件是 /etc/logrotate.conf,一般自定义一个新的配置文件来完成相应日志切割管理。
logrotate是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为“转储”。我们可以根据日志的大小,或者根据其使用的天数来转储。
logrotate 的执行由crond服务实现。在/etc/cron.daily目录中,有个文件logrotate,它实际上是个shell script,用来启动logrotate。logrotate程序每天由cron在指定的时间(/etc/crontab)启动。因此,使用ps是无法查看到logrotate的。如果它没有起来,就要查看一下crond服务有没有在运行。在执行logrotate时,需要指定其配置文件/etc/logrotate.conf。这 个配置文件的注释写得很清楚,没有必要再罗嗦了。只想强调下面这行,它的作用包含存放在/etc/logrotate.d目录下面的配置文件,不可或缺。 如果你安装了一个新的服务,它的日志转储的规则可以建立一个专门的配置文件,放在/etc/logrotate.d下面。它其实也因为下面的这句话,在 logrotate服务启动时被读取。
每个存放在/etc/logrotate.d目录里的文件,都有上面格式的配置信息。在{}中定义的规则,如果与logrotate.conf中的冲突,以/etc/logrotatate.d/中的文件定义的为准
测试参数
1 -?或--help:在线帮助; 2 -d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况; 3 -f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然; 4 -s<状态文件>或--state=<状态文件>:使用指定的状态文件; 5 -v或--version:显示指令执行过程; 6 -usage:显示指令基本用法。
eg :logrotate -vf /etc/logrotate.conf #强制执行
----- 可直接手动执行
$ logrotate --force /etc/logrotate.d/nginx
----- 显示详细的信息;而且--debug/-d实际上不会操作具体文件(Dry Run)
$ logrotate --debug --verbose --force /etc/logrotate.d/nginx
2 主要参数
1 compress 通过gzip 压缩转储以后的日志 2 nocompress 不需要压缩时,用这个参数 3 copytruncate 用于还在打开中的日志文件,把当前日志备份并截断 4 nocopytruncate 备份日志文件但是不截断 5 create mode owner group 转储文件,使用指定的文件模式创建新的日志文件 6 nocreate 不建立新的日志文件 7 delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 8 nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。 9 errors address 专储时的错误信息发送到指定的Email 地址 10 ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。 11 notifempty 如果是空文件的话,不转储 12 mail address 把转储的日志文件发送到指定的E-mail 地址 13 nomail 转储时不发送日志文件 14 olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 15 noolddir 转储后的日志文件和当前日志文件放在同一个目录下 16 prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行 17 postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行 18 daily 指定转储周期为每天 19 weekly 指定转储周期为每周 20 monthly 指定转储周期为每月 21 rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 22 tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 23 size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem). 24 dateext 切换后的日志文件会附加上一个短横线和YYYYMMDD格式的日期,没有这个配置项会附加一个小数点加一个数字序号. 25 dateformat 配合dateext使用可以为切割后的日志加上YYYYMMDD格式的日期 26 sharedscripts #共享脚本,下面的postrotate <s> endscript中的脚本只执行一次即可;
在定义日志文件时也可以使用通配符,但最好少用通配符,因会它会包括已经切换过的日志,要用的话最好在*号后加上扩展名, 如*.log。
常见日志切割
nginx的日志切割
首先切换到/etc/logrotate.d
cd /etc/logrotate.d
touch nginx
配置
1 #也可以分开写 2 #/var/log/nginx/access.log /var/log/nginx/err.log{} 3 /usr/local/nginx/logs/*.log { 4 #频次为每天运行 5 daily 6 #保留3天的日志 7 rotate 3 8 #如果日志文件不存在,则不报错,直接忽略 9 missingok 10 #如果日志文件为空则不执行轮替操作 11 notifempty 12 compress 13 #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统; 14 olddir /data/log_backup/ 15 #日志共享脚本,也就是说等access和error两个日志都rotate之后再执行下面的脚本 16 sharedscripts 17 #日期格式默认access.log-20171206 18 dateext 19 #总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。 20 delaycompress 21 su root 22 postrotate 23 [ -e /usr/local/nginx/logs/nginx.pid ] && /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || : 24 endscript 25 }
不过也可以脚本,如下
1 #!/bin/bash 2 PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 3 logs_path="/usr/local/nginx/logs/" 4 logs_backup_path="/usr/local/nginx/logs/backup_log/" 5 6 #以前的日志文件。 7 8 log_name="accessaa.log" 9 log_err="error.log" 10 pid_path="/usr/local/nginx/logs/nginx.pid" 11 12 13 14 mv ${logs_path}${log_name} ${logs_backup_path}${log_name}_$(date +"%Y-%m-%d").log 15 16 mv ${logs_path}${log_err} ${logs_backup_path}${log_err}_$(date +"%Y-%m-%d").log 17 18 19 20 kill -USR1 `cat ${pid_path}`