(2013-12-16 10:42:21)
转载�
标签: logrotatenginx日志切割it |
分类: 工具/技巧 |
logrotate是作为linux系统日志的管理工具存在。他可以轮换,压缩,邮件系统日志文件。
它默认的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/
配置文件介绍:
========================
logrotate.conf 才主要的配置文件, logrotate.d 是一个目录, 该目录里的所有文件都会被主动的读入 /etc/logrotate.conf 中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以 /etc/logrotate.conf 这个文件的设定来作为默认值。
切割介绍:
--------------------------
当第一次执行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来储存日志。而第二次执行之后, messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来储存日志!如果我们仅设定保留三个日志而已的话,那么执行第四次时,则 messages.3 这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
当然,这个得根据配置文件中的 dateext 参数来判定:
先看 logrotate.conf 的内容:
vim /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果�e的文件设定了其他的值,
# 就会以其它文件的设定为主
weekly <==默认一周执行一次 rotate 工作
rotate 4 <==保留多少个日志文件.默认保留四个.
create <==创建新的文件.因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext <==文件后缀是日期格式,也就是切割后文件是:xxx.log-20131216.gz 这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1 这种格式
#compress <==是否压缩日志.
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 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。
由这个文件的设定我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录,虽然我们可以将所有的配置都给他写入 /etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理~
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中
切割案例:syslog
============================
下面我们再以 /etc/logrotate.d/syslog 这个切割 syslog 服务的配置文件,来看看该如何设定他的 rotate 呢?
[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
在上面的语法当中,我们知道正确的 logrotate 的写法为:
日志文件:
被处理的日志绝对路径.使用空格符分隔多个文件名;
执行脚本:
可调用外部指令来进行额外的命令,这个设定需与 sharedscripts .... endscript 设定合用才行。命令介绍:
prerotate:在启动 logrotate 之前进行的指令,例如修改文件的属性等动作;
postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
prerotate 与 postrotate 对于已加上特殊属性的文件处理上面,是相当重要的执行程序!
那么 /etc/logrotate.d/syslog 内设定的六个文件的切割功能就变成了:
1.该设定只对 /var/log/ 内的 messages, secure, maillog, spooler, boot.log, cron 有效;
2.日志切割每周一次、保留四个、且切割下来的日志文件不进行压缩(未更改预设值);
3.切割完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd
假设我们有针对 /var/log/messages 这个文件增加 chattr +a 的属性时, 依据 logrotate 的工作原理,我们知道,这个 /var/log/messages 将会被更名成为 /var/log/messages.1 才是。但是由于加上这个 +a 的参数啊,所以更名是不可能成功的! 那怎么办呢?
就利用 prerotate 与 postrotate 来进行日志文件切割前、后所需要作的动作!
[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
sharedscripts
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
/usr/bin/chattr +a /var/log/messages
endscript
}
看到否?就是先给他去掉 a 这个属性,让日志文件 /var/log/messages 可以进行切割的动作, 然后执行了切割之后,再给他加入这个属性!请特别留意的是,那个 /bin/kill -HUP ... 的意义,这一行的目的在于将系统的 syslogd 重新以其参数档 (syslog.conf) 的资料载入一次!也可以想成是 reload 的意思啦!
由于我们建立了一个新的空的纪录档,如果不执行此一行来重新启动服务的话, 那么记录的时候将会发生错误呦!
切割案例:Nginx
============================
在 /etc/logrotate.d 新建 nginx
/usr/local/nginx/logs/*.log {
daily
rotate 5
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
就是把日志切割后重启 nginx
Nginx 日志切割还可以这样:http://blog.sina.com.cn/s/blog_5f54f0be0100zaza.html
通过自定义的 shell 脚本去做.\
实际测试 logrotate
============================
[root@www ~]# logrotate [-vf] logfile选项与参数:
v: 启动显示模式,会显示 logrotate 执行的过程
f: 不论是否符合配置文件地规则,强制每个日志都进行 rotate 的动作
范例一: 执行一次 logrotate 看看整个流程
[root@www ~]# logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf <==读取主要设定档
including /etc/logrotate.d <==加载外部的设定
reading config file acpid <==就是外部设定啊!....(中间省略)....
Handling 21 logs <==共有 21 个日志被记录....(中间省略)....
rotating pattern: /var/log/messages /var/log/secure /var/log/maillog \
/var/log/spooler /var/log/boot.log /var/log/cron weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/messages <==开始处理 messages
log does not need rotating <==因为时间未到,不需要更动!....(底下省略)....
范例二:强制进行 logrotate 的动作
[root@www ~]# logrotate -vf /etc/logrotate.conf....(前面省略)....rotating log /var/log/messages, log->rotateCount is 4
renaming /var/log/messages.4 to /var/log/messages.5 (rotatecount 4, logstart 1, i 4),
renaming /var/log/messages.3 to /var/log/messages.4 (rotatecount 4, logstart 1, i 3),
renaming /var/log/messages.2 to /var/log/messages.3 (rotatecount 4, logstart 1, i 2),
renaming /var/log/messages.1 to /var/log/messages.2 (rotatecount 4, logstart 1, i 1),
renaming /var/log/messages.0 to /var/log/messages.1 (rotatecount 4, logstart 1, i 0),
old log /var/log/messages.0 does not exist....(底下省略)....# 看到否?整个 rotate 的动作就是这样一步一步进行的~
[root@www ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw------- 1 root root 63 Apr 8 15:19 /var/log/messages
-rw------- 1 root root 670 Apr 8 14:22 /var/log/messages.1
-rw------- 1 root root 24984 Apr 1 19:26 /var/log/messages.2
-rw------- 1 root root 1911 Mar 28 11:32 /var/log/messages.3
-rw------- 1 root root 25193 Mar 22 04:02 /var/log/messages.4
上面那个 -f 具有『强制执行』的意思,如果一切的设定都没有问题的话,那么理论上,你的 /var/log 这个目录就会起变化了!而且应该不会出现错误讯息才对!