Fork me on GitHub

利用logrotate服务切割日志

logrotate 是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为”转储”。我们可以根据日志的大小,或者根据其使用的天数来转储。

启动方式


logrotate 的执行由crond服务实现。在 /etc/cron.daily 目录中,有个文件logrotate,它实际上是个shell script,用来启动logrotate。logrotate程序每天由cron在指定的时间 (/etc/crontab) 启动。
1
2
3
4
5
6
7
8
9
# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

在执行logrotate时,需要指定其配置文件/etc/logrotate.conf

这个配置文件的注释写得很清楚,没有必要再罗嗦了。只想强调下面这行,它的作用包含存放在/etc/logrotate.d目录下面的配置文件,不可或缺。如果你安装了一个新的服务,它的日志转储的规则可以建立一个专门的配置文件,放在/etc/logrotate.d下面。它其实也因为下面的这句话,在 logrotate服务启动时被读取。

每个存放在/etc/logrotate.d目录里的文件,都有上面格式的配置信息。在{}中定义的规则,如果与logrotate.conf中的冲突,以/etc/logrotatate.d/中的文件定义的为准。

参数说明


日志文件匹配规则中,不要使用/var/log/news/,这会匹配已经切换过的日志,应使用/var/log/news/.log

选项 用途
nocompress/compress 不压缩/压缩
delaycompress 不压缩前一个截断的文件(需要与compress一起用)
daily/weekly/monthly 每天/周/月轮转一次
copytruncate 清空原有文件,而不是创建一个新文件
create 0644 root utmp 新建日志文件,权限、属主、组
ifempty 即使用空文件也转储
notifempty 日志文件为空不进行转储
olddir 转储后的日志存放目录,必须和当前日志文件在同一个文件系统
rotate 5 保留最近的5个日志文件
minisize 1M 必须大于1MB才会转储
size 50M 超过50MB后轮转日志
mail www@my.org 轮换后的把日志发给邮箱
missingok 如果日志文件不存在,不报错
prerotate,endscript 在logrotate之前执行的命令
postrotate,endscript 在logrotate之后执行的命令
sharedscripts 共享脚本,表示切换时只执行一次脚本
dateext 增加日期作为后缀,不然会是一串无意义的数字
dateformat .%s 切换后文件名,必须配合dateext使用

logrotate.conf范例


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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# sample logrotate configuration file
compress # 全局设置, 压缩
/var/log/messages {
rotate 5 # 保留5份日志
weekly # 每周轮换一次
postrotate # 轮换之后重启syslogd服务
/usr/bin/killall -HUP syslogd
# rhel6中为:/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
# 可查看/etc/logrotate.d/下的配置文件
endscript
}
"/var/log/httpd/access.log" /var/log/httpd/error.log { # 指定多个文件, 如果有特殊字符需要用单引号
rotate 5
mail www@my.org
size 100k # 超过100k后切换日志, 并把老的日志发送邮件给www@my.org
sharedscripts # 共享脚本.下面的postrotate脚本只运行一次.
postrotate
/usr/bin/killall -HUP httpd
endscript
}
/var/log/news/* { # 少用通配符, 因会它会包括已经切换过的日志, 要用的话最好在*号后加上扩展名, 如*.log
monthly
rotate 2
olddir /var/log/news/old
missingok
postrotate
kill -HUP 'cat /var/run/inn.pid'
endscript
nocompress
}
/var/log/ipwall/messages.log { #日志路径一定要和rsyslog定义的日志文件路径一致
rotate 65535 #滚动65535次
create 0777 syslog adm #设置权限,方便windows连接samba服务器
compress #采用压缩
size 50M #文件大小50M以上的分割日志
dateext
dateformat .%s #定义文件切割后的文件名,必须配合dateext使用
#posrotate/endscript这段脚本使rsyslog程序重新读取配置文件,程序释放对messages.log文件持有的文件描述符
postrotate
/bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2>/dev/null) &>/dev/null
endscript
}

强制轮转


1
2
3
4
5
6
logrotate -f /etc/logrotate.conf # –强制轮转
logrotate -vf /etc/logrotate.conf # –再加一个-v参数查看轮转的过程
logger -t 'aaaa' 'bbbbbb' #–在日志里加一个内容tag和内容
tail /var/log/messages
# Jun 12 20:34:22 kadefor aaaa: bbbbbb

Nginx日志切割


1
2
3
4
5
6
7
8
9
10
11
12
/var/log/nginx/*log {
daily
rotate 10
missingok
notifempty
compress
sharedscripts
su root
postrotate
/bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || :
endscript
}

PHP日志切割


1
2
3
4
5
6
7
8
9
10
/var/log/php-fpm/*log {
missingok
notifempty
sharedscripts
delaycompress
create 0664 www www
postrotate
/bin/kill -SIGUSR1 `cat /var/run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}



    本文标题   :   利用logrotate服务切割日志

    文章作者   :   火柴

    发布时间   :   2016年12月2日 - 14时12分

    本文链接   :   http://www.chen-hao.com.cn/利用logrotate服务切割日志.html

    本文字数   :   本文一共有1,118字

    许可协议   :   Attribution-NonCommercial 4.0

    © 转载请保留以上信息,谢谢合作。