Linux -- logrotate 切割 Nginx

本文深入介绍了Linux系统日志管理工具logrotate的配置方法、日志切割机制以及如何实现特定服务如syslog、Nginx的日志管理。通过实例演示了如何设置logrotate配置文件,确保日志文件定期、有序地轮换、压缩,并提供了实际测试logrotate的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用: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 这个目录就会起变化了!而且应该不会出现错误讯息才对!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值