CC00020.LinuxSystem——|Linux&日志管理.V03|

一、日志轮替
### --- 日志文件的命名规则

~~~     日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,
~~~     当旧日志文件超出保存的范围之后,就会进行删除。那么旧的日志文件改名之后,如何命名呢?
~~~     主要依靠#/etc/logrotate.conf 配置文件中“dateext”参数:
~~~     如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀,
~~~     例如“secure-20180605”。这样的话日志文件名不会重叠,
~~~     所以也就不需要日志文件的改名,只需要保存指定的日志个数,删除多余的日志文件即可。
~~~     如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。
~~~     当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,
~~~     然后新建“secure”日志,用来保存新的日志。当第二次进行日志轮替时,
~~~     “secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,
~~~     然后也会新建“secure”日志,用来保存新的日志,以此类推。
~~~     注:比如apache日志切割推荐使用系统自带的日志切割/etc/logrotate.conf;
~~~     不要使用apache自带的日志切割工具。apache自带的日志切割工具只有切割功能,
~~~     没有日志轮替功能;需要人为的删除之前的日志,而系统自带的日志切割工具具有该功能。

二、logrotate 配置文件

### --- logrotate 配置文件

[root@server11 ~]# vim /etc/rsyslog.conf 
see "man logrotate" for details
rotate log files weekly
weekly
~~~     每周对日志文件进行一次轮替
keep 4 weeks worth of backlogs
rotate 4
~~~     保存 4 个日志文件,也就是说如果进行了 5 次日志轮替,就会删除第一个备份日志
create new (empty) log files after rotating old ones
create
~~~     在日志轮替时,自动创建新的日志文件
use date as a suffix of the rotated file
dateext
~~~     使用日期作为日志轮替文件的后缀
uncomment this if you want your log files compressed
compress
~~~     日志文件是否压缩。如果取消注释,则日志会在转储的同时进行压缩
~~~     以上日志日志配置为默认配置,如果需要轮替的日志没有设定独立的参数,那么都会遵守以上参数。
~~~     如果轮替日志配置了独立参数,那么独立参数优先级更高。
RPM packages drop log rotation information into this directory
include /etc/logrotate.d
~~~     包含/etc/logrotate.d/目录中所有的子配置文件。也就是说会把这个目录中所有子配置文件读取进来,
~~~     进行日志轮替。
no packages own wtmp and btmp -- we'll rotate them here
~~~     以下两个轮替日志有自己的独立参数,如果和默认的参数冲突,则独立参数生效。
/var/log/wtmp {
~~~     以下参数仅对此目录有效
monthly
~~~     每月对日志文件进行一次轮替
create 0664 root utmp
~~~     建立的新日志文件,权限是 0664,所有者是 root,所属组是 utmp 组
minsize 1M
~~~     日志文件最小轮替大小是 1MB。也就是日志一定要超过 1MB 才会轮替,否则就算
~~~     时间达到一个月,也不进行日志转储
rotate 1
~~~     仅保留一个日志备份。也就是只有 wtmp 和 wtmp.1 日志保留而已
}
/var/log/btmp {
~~~     以下参数只对/var/log/btmp 生效
missingok
~~~     如果日志不存在,则忽略该日志的警告信息
monthly
create 0600 root utmp
rotate 1
}
system-specific logs may be also be configured here.
### --- 记录日志的位置

[root@server21 ~]# cat /etc/logrotate.d/syslog 
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

logrotate 配置文件的主要参数,我们通过表 16-4 来说明下:

参数说明
daily日志的轮替周期是每天
weekly日志的轮替周期是每周
monthly日志的轮替周期是每月
rotate数字保留的日志文件的个数,0值没有备份
compress日志轮替时,旧的日志进行压缩
create mode owner group建立新的日志,同时指定新日志的权限与所欲着和所属组,如create 0600 root utmp
mail address当日志轮替时,输出内容通过邮件发送到指定的邮件地址,如mail shenc@lamp.net
missingok如果日志不存在,则忽略该日志的浸膏信息
notifempty如果日志为空文件,则不进行日志轮替
minisize大小日志轮替的最小值,也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
size大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替,如size 100k
dateext使用日期作为日志轮替文件的后缀,如 secure-20180605
sharedscripts在次关键字之后的脚本只执行一次
prerotate/endscript在日志轮替之前执行脚本命令,endscript标示prerotate脚本结束
postrotate/endscript在日志轮替之后执行脚本命令,endscript标示postrotate脚本结束
## --- 这些参数中较为不好理解的应该就是 prerotate/endscript 和 postrotate/endscript 参数了,
## --- 我们利用“man logrotate”中的列子来解释下这两个参数。例如:
~~~      prerotate 和 postrotate 主要用于在日志轮替的同时,执行指定的脚本,一般用于日志轮替之后
~~~     重启服务。这里强调,如果你的日志是写入 rsyslog 服务的配置文件的,那么把新日志加入 logrotate
~~~     后,一定要重启 rsyslog 服务,否则你会发现虽然新日志建立了,但是数据还是写入了旧的日志当中。
~~~     那是因为虽然 logrotate 知道日志轮替了,但是 rsyslog 服务却并不知道。同理,如果你的日志不是
~~~     被 rsyslog 管理,如源码包安装的 Apache、Nginx 等服务,则需要重启 Apache 或 Nginx 服务,否则
~~~     日志也不能正常轮替。

"/var/log/httpd/access.log" /var/log/httpd/error.log {
~~~     日志轮替的是/var/log/httpd/中 RPM 包安装的 apache 正确访问日志和错误日志
rotate 5
~~~     轮替 5 次
mail www@my.org
~~~     信息发送到指定邮箱
size 100k
~~~     日志大于 100KB 时才进行日志轮替,不再按照时间轮替
sharedscripts
~~~     以下脚本只执行一次
postrotate
~~~     在日志轮替结束之后,执行以下脚本
/usr/bin/killall -HUP httpd
~~~     重启 apache 服务
endscript
~~~     脚本结束
}
三、把自己的日志加入日志轮替
### --- 把自己的日志加入日志轮替

### --- 这里有两个方法:
### --- 第一种方法是直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略,
~~~     从而把日志加入轮替;
### --- 第二种方法是在/etc/logrotate.d/目录中新建立该日志的轮替文件,

~~~     在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,
~~~     所以也可以把日志加入轮替。我们这里推荐第二种方法,因为系统中需要轮替的日志非常多,
~~~     如果全都直接写入/etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,
~~~     不利于此文件的维护。说起来很复杂,我们举个例子吧,
~~~     还记得我们自己生产的/var/log/alert.log 日志吗?这个日志不是系统默认日志,
~~~     而是我们通过/etc/rsyslog.conf 配置文件自己生成的日志,
~~~     所以默认这个日志是不会轮替的。
~~~     那么我们需要把这个日志加入日志轮替的策略,该怎么实现呢?
~~~     我们采用第二种方法,
~~~     也就是在/etc/logrotate.d/目录中建立此日志的轮替文件。具体步骤如下:
### --- 在/etc/logrotate.d/目录中建立此日志的轮替文件。具体步骤如下:
~~~     先给日志文件赋予 chattr 的 a 属性,保证日志的安全

[root@server21 ~]# chattr +a /var/log/alert.log
~~~     创建 alter 轮替文件,把/var/log/alert.log 加入轮替

[root@server21 ~]# vi /etc/logrotate.d/alter
/var/log/alert.log {
weekly                                                      // 每周轮替一次
rotate 6                                                    // 保留 6 个轮替日志
sharedscripts                                               // 以下命令只执行一次
prerotate                                                   // 在日志轮替之前执行
~~~     在日志轮替之前取消 a 属性,以便让日志可以轮替

/usr/bin/chattr -a /var/log/alert.log
endscript                                                   // 脚本结束
sharedscripts
postrotate                                                  // 在日志轮替之后执行
~~~     日志轮替之后,重新加入 a 属性

/usr/bin/chattr +a /var/log/alert.log
endscript
sharedscripts
postrotate
/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) &>/dev/null
endscript
~~~     重启 rsyslog 服务,保证日志轮替正常
}
### --- 再举个例子,我们如果需要把 Nginx 服务的日志加入日志轮替,则也需要重启 Nginx 服务,例如:

/date/logs/nginx/access/access.log /date/logs/nginx/access/default.log {
~~~     假设 Nginx 的日志放在/date 目录下
daily
rotate 15
sharedscripts
postrotate
/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) &>/dev/null
~~~     重启 rsyslog 服务
/bin/kill -HUP $(/bin/cat /usr/local/nginx/logs/nginx.pid) &>/dev/null
~~~     重启 Nginx 服务
endscript
}
四、logrotate 命令
### --- logrotate 命令
### --- 我们日志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务。如果大家还记得
~~~     /etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件,logrotate 通过这个文件依赖定时任务执行的。
~~~     不过 logrotate 命令的格式是什么样的呢?我们来学习下:
### --- 选项:
~~~     如果此命令没有选项,则会按照配置文件中的条件进行日志轮替 
~~~     -v:显示日志轮替过程。加了-v 选项,会显示日志的轮替的过程,显示日志轮替过程。加了-v 选项,会显示日志的轮替的过程
~~~     -f:强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有的日志进行轮替

[root@localhost ~]# logrotate [选项] 配置文件名
### --- 我们执行 logrotate 命令,并查看下执行过程:

[root@server21 ~]# vim -v  /etc/logrotate.conf 
~~~     查看日志轮替的流程
~~~     …省略部分输出…
rotating pattern: /var/log/alert.log weekly (6 rotations)
~~~     这就是我们自己加入轮替的 alert.log 日志。
empty log files are rotated, old logs are removed
considering log /var/log/alert.log
log does not need rotating                                          // 时间不够一周,所以不进行日志轮替
~~~      …省略部分输出…
~~~     我们发现/var/log/alert.log 加入了日志轮替,已经被 logrotate 识别,并调用了。只是时间没
~~~     有达到轮替的标准,所以没有进行轮替。那我们强制进行一次日志轮替,看看有什么结果:
~~~     强制进行日志轮替,不管是否符合轮替条件

[root@server21 ~]# logrotate -vf /etc/logrotate.conf
~~~     …省略部分输出…
rotating pattern: /var/log/alert.log forced from command line (6 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/alert.log
log needs rotating                                                  // 日志需要轮替
rotating log /var/log/alert.log, log->rotateCount is 6
dateext suffix '-20180607'                                          // 提取日期参数
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/alert.log to /var/log/alert.log-20180607
~~~     旧的日志被重命名
creating new /var/log/alert.log mode = 0600 uid = 0 gid = 0
~~~     创建新日志文件,同时制定权限、所有者和属组
running postrotate script
~~~     …省略部分输出…
~~~     我们发现 alert.log 日志已经完成了日志轮替。我们查看下新产生的日志和旧日志:
### --- 旧日志文件已经转储
~~~     新的日志文件被自动加入了 chattr 的 a 属性。
~~~     logrotate 命令使用“-f”选项之后,就不管日志是否已经符合了日志轮替条件,
~~~     而强制把所有的日志都进行了轮替。

[root@localhost ~]# ll /var/log/alert.log*
-rw-------. 1 root root 0 6 月           7 10:07 /var/log/alert.log
-rw-------. 1 root root 237 6 月         7 09:58 /var/log/alert.log-20180607
[root@server21 ~]# lsattr /var/log/alert.log
-------------e- /var/log/alert.log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值