Linux -- logrotate 切割 Nginx

Linux -- logrotate 切割 Nginx

 (2013-12-16 10:42:21)

sg_trans.gif转载

标签: 

logrotate

 

nginx

 

日志

 

切割

 

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


你可能感兴趣的:(linux,nginx,logrotate,--,切割)