深入解析linux下Logrotate日志管理工具

发布时间:2020-04-10编辑:脚本学堂
本文介绍下,linux下的日志管理工具logrotate的具体用法,有需要的朋友参考下吧。

linux系统中,管理日志可以使用一个非常实用的日志管理工具logrotate,以下就介绍下这个工具的用法。

一、logrotate初探

Logrotate基于cron运行,其脚本为:/etc/cron.daily/logrotate。
 

复制代码 代码示例:

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

实际运行时,Logrotate会调用配置文件/etc/logrotate.conf:
 

复制代码 代码示例:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    minsize 1M
    create 0664 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

此处的设置可以理解为Logrotate的缺省值。
也可以在「/etc/logrotate.d」目录里放置自己的配置文件,用来覆盖Logrotate的缺省值。

二、Logrotate 应用举例

按天保存一周的nginx日志压缩文件,配置文件为:/etc/logrotate.d/nginx。
如下:
 

复制代码 代码示例:
/usr/local/nginx/logs/*.log {
    daily
    dateext
    compress
    rotate 7
    sharedscripts
    postrotate
        kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

可以用如下命令来手动执行:
 

复制代码 代码示例:
shell> logrotate -f /etc/logrotate.d/nginx

执行时,进行相关调试,是个好习惯,比如:
 

复制代码 代码示例:
shell> logrotate -d -f /etc/logrotate.d/nginx
 

BTW:类似的还有Verbose选项,输出详细信息,大家可以自行研究下。

三、Logrotate 使用答疑

问题1:sharedscripts主要用途有哪些?
解答:
在前面Nginx的例子里声明日志文件的时候用了星号通配符,也就是说这里可能涉及多个日志文件,比如:access.log和error.log。
sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。

问题2:rotate和maxage的区别有哪些?
解答:
都用来控制保存多少日志文件的,区别在于rotate是以个数为单位的,而maxage是以天数为单位的。如果是以按天来轮转日志,那么二者的差别就不大了。

问题3:为什么生成日志的时间是凌晨四点?
解答:
由于Logrotate是基于CRON运行的,所以这个时间是由CRON控制的,具体可以查询CRON的配置文件 /etc/crontab,可以手动改成如23:59等时间执行:
 

复制代码 代码示例:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
59 23 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

问题4:如何告诉应用程序重新打开日志文件?
解答:
以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说mysql是通过flush-logs来重新打
开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,就必须重启服务。

Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的方式,整个过程中日志文件的操作句柄没有发生改变,所以不需要通知应用程序重新打开日
志文件。

注意:在拷贝和清空之间有一个时间差,所以可能会丢失部分日志数据。这个还真是要好好琢磨下。