『学了就忘』Linux日志管理 — 93、日志轮替补充
1、把自己的日志加入日志轮替
使用RPM包方式安装服务的日志会自动的加入logrotate
轮替,一般不需要你介入。
而使用源码包方式安装服务的日志,需要手工把该服务的日志加入到logrotate.conf
配置文件中。
所以源码包方式安装服务的日志和手动指定的日志,是需要自己手动加入logrotate
日志轮替。
(1)操作方式
有两个方法:
- 第一种方法是直接在
/etc/logrotate.conf
配置文件中写入该日志的轮替策略,从而把日志加入logrotate
轮替。 - 第二种方法是在
/etc/logrotate.d/
目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被"include"
到主配置文件中,所以也可以把日志加入轮替。
推荐第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入/etc/logrotate.conf
配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。
(2)示例
我们在/var/log/
目录中创建要给testerr.log
日志文件,这个日志不是系统默认日志,所以默认这个日志是不会轮替的,那么我们需要把这个日志加入日志轮替的策略。
拓展:
- 有个典型应用就是给予特定的日志加入
chattr
的a
属性,如果系统文件加入了a
属性,那么这个文件就只能增加数据,但是不能删除和修改已有的数据了,而且root
用户也不能例外。- 所以我们会给重要的日志文件加入
a
属性,这样的话可以保护日志文件不被恶意修改。不过一旦加入了a
属性,那么日志轮替时,这个日志文件是不能被改名的,当然也就不能进行日志轮替了。所以我们可以利用prerotate
和postrotate
来修改日志文件的chattr
的a
属性。在下一个小节,我们会具体说明下这两个参数的使用。
采用第二种方式实现,如下:
#先给日志文件赋予chattr的a属性,保证日志的安全。
[root@localhost ~]# chattr +a /var/log/testerr.log
# 创建testerr轮替文件,
[root@localhost ~]# vim /etc/logrotate.d/testerr
# 把/var/log/testerr.log日志文件加入轮替。
/var/log/testerr.log{
weekly <-- 每周轮替一次
rotate 6 <-- 保留6个轮替日志
sharedscripts <-- 以下命令只执行一次
prerotate <-- 在日志轮替之前执行
# 在日志轮替之前取消a属性,以便让日志可以轮替。
usr/bin/chattr -a /var/log/testerr.1og
endscript <-- 脚本结束
sharedscripts
postrotate <-- 在日志轮替之后执行
# 日志轮替之后,重新加入a属性。
/usr/bin/chattr +a /var/log/testerr.log
endscript
sharedscripts
postrotate
# 重启rsyslog服务,保证日志轮替正常。
/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) &>/dev/null
endscript
练习2:把Nginx服务的日志加入日志轮替,需要重启Nginx服务。
# 假设Nginx的日志放在/date目录下
/date/logs/nginx/access/access.log
/date/logs/nginx/access/default.log
{
daily
rotate 15
sharedscripts
postrotate
#重启rsyslog服务
/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) &>/dev/null
#重启Nginx服务
/bin/kill -HUP $(/bin/cat /usr/local/nginx/1ogs/nginx.pid) &>/dev/null
endscript
}
实际工作中就可以以此为例。
提示:Linux系统自身日志或者使用RPM包方式安装服务的日志,需要重启。
2、logrotate命令
我们日志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务。如果大家还记得/etc/cron.daily/
目录,就会发现这个目录中是有logrotate
文件,logrotate
命令通过这个文件依赖定时任务执行的。
logrotate
命令的格式:
[root@localhost ~]# logrotate [选项] 配置文件名
选项:
如果此命令没有选项,则会按照配置文件中的条件进行日志轮替。
-v:显示日志轮替过程。
-f:强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有的日志进行轮替。
注意:
logrotate
命令一般不需要我们执行,需要强制轮替的时候才需要执行。
我们执行logrotate
命令,并查看下执行过程:
# 查看日志轮替的流程
[root@localhost ~]# logrotate -v /etc/logrotate.conf
# 截取一个日志轮替说明
# 这就是我们自己加入轮替的testerr.log日志。
rotating pattern:/var/log/testerr.log weekly(6 rotations)
empty log files are rotated,old logs are removed
considering log/var/log/testerr.log
log does not need rotating <-- 时间不够一周,所以不进行日志轮替
我们发现/var/log/testerr.log
加入了日志轮替,已经被logrotate
识别并调用了。只是时间没有达到轮替的标准,所以没有进行轮替。
那我们强制进行一次日志轮替,看看有什么结果:
# 强制进行日志轮替,不管是否符合轮替条件
[root@localhost ~]# logrotate -vf /etc/logrotate.conf
# 目标testerr.log日志文件片段
rotating pattern:/var/log/testerr.1og forced from command line(6 rotations)
empty log files are rotated,old logs are removed
considering 1og/var/log/testerr.log
log needs rotating <-- 日志需要轮替
rotating log/var/log/testerr.log,log->rotateCount is 1
dateext suffix'-20200618' <-- 提取日期参数
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/testerr.log to /var/log/testerr.log-20200618
# 创建新日志文件,同时制定权限、所有者和属组
creating new/var/log/testerr.log mode= 0600 uid =0 gid=0
running postrotate script
我们发现testerr.log
日志已经完成了日志轮替。
我们查看下新产生的日志和旧日志:
[root@localhost ~]# ll /var/log/testerr.log*
# 旧日志文件已经转储
-rw-------. 1 root root 0 6月 7 10:07/var/log/testerr.log
-rw-------. 1 root root 237 6月 18 09:58/var/log/testerr.log-20200618
# 新的日志文件被自动加入了chattr的a属性。
[root@localhost ~]# lsattr /var/1og/testerr.log
-a------e- /var/1og/alert.log
logrotate
命令使用“-f"
选项之后,就不管日志是否已经符合了日志轮替条件,而强制把所有的日志都进行了轮替。