Linux — logrotate 切割 Nginx http://blog.sina.com.cn/s/blog_5f54f0be0101h6y8.html 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 的默认值” ,如果別的文件设定了其他的值, # 就会以其它文件的设定为主 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 这个目录就会起变化了!而且应该不会出现错误讯息才对! (责任编辑:IT) |