日志管理工具logrotate

原创
2019/02/28 18:35
阅读数 231

linux上软件部署后,难免会产生各种类型的日志。随着时间的推移,各类无用的过期日志会占用非常多的硬盘空间。因此对旧日志进行压缩转储然后到期删除就非常必要了。

最先想到的就是crontab中自行编写脚本进行日志的清理,但是自行编写脚本处理会比较麻烦。因此使用了linux下常用的日志工具logrotate。

logrotate工具

logrotate工具,被称作日志轮转工具,可以自动对日志进行截断,压缩以及轮转的功能。配合crontab之后,可以很方便的处理linux上的各类日志。

一般的发行版中都会自带有logrotate工具。可以通过which logrotate查看具体命令的地方。另外,logrotate还包括两个配置文件目录

/etc/logrotate.conf       
全局的配置文件,存储这公用的默认配置项
/etc/logrotate.d
子项配置目录,一些系统级别的日志轮转策略以及用户自定义的日志轮转策略配置地方。

需要注意的是,logrotate只是对日志的处理,如果需要定期的日志处理则还是要配合cron进行。在centos中,在/etc/cron.daily目录中可以看到logrotate的执行策略

#!/bin/sh

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

cron.daily目录中的配置,会按日被cron执行一次。从脚本可以看出来,logrotate使用默认的/etc/logrotate.conf执行命令。在/etc/logrotate.conf中可以看到会把/etc/logrotate.d目录中的配置也包括进来。

logrotate命令

logrotate命令本身比较简单,通过man手册可以看到命令的可选也是比较少的。

logrotate [-dv] [-f|--force] [-s|--state file] config_file

-d --debug 选项:debug模式,仅用于测试配置文件是否有效,不会实际对日志进行操作。
-v --verbose 选项:详细模式,会输出更多的细节内容。
-f --force 选项:强制开启日志轮转切割,即使logrotate认为不需要时候。
-s --state file 选项:指定状态文件。
-m --mail 选项:指定命令和账号发送logrotate消息。

logrotate的配置文件

在实际使用中,一般只需要在/etc/logrotate.conf目录中增加需要的日志轮转策略即可。下面以nginx的日志轮转策略为例,解释一下配置文件的编写。所有可选的配置选项可以在logrotate的man手册中看到。

# 指定需要进行处理的日志目录及日志名称,支持通配符
/var/logn/nginx/*.log {
    # 日志轮转的周期,支持hourily/daily/weekly/monthly/yearly。
    # 使用每小时的配置是,需要把lograte配置成每小时执行的,而不是每天执行一次。
    # weekly可以执行执行的weenday,详见`man logrotate`
    daily
    # 对归档的日志进行压缩处理
    compress
    # 与compress配合使用,最近一次的归档日志不做压缩
    delaycompress
    # 轮转次数,即最多保留14个归档
    rotate 14
    # 轮转时,指定新创建日志文件的权限,用户名以及用户组。
    # 归档的日志文件权限与原文件相同,新生的文件采用此权限形式。
    create 640 nginx adm
    # 超过指定大小时,才执行轮转操作。默认单位为K,可使用M或者G
    size 100M
    # 在归档日志是使用日期作为结尾,而不是简单的数字
    dateext
    # 如果日志文件missing消失,不报错。继续处理下一个日志文件。
    missingok
    #如果日志为空,不进行轮转操作。实际上与size配置重了。
    notifempty
    # 在指定日志名如果使用了通配符,默认在每一个匹配的日志轮转后都会执行一次postscript。
    # 同时执行脚本时会把日志的结对路径作为第一个参数传给脚本。
    # 使用了sharedscripts之后在一个同一个通配符下,脚本指挥被执行一次。
    # 同时传递的路径参数也是把整个模式作为参数传进去的。当一个都没匹配时,脚本不会被执行。
    sharedscripts
    # 执行轮转之后执行的操作,以endscript结尾。同理还有轮转前执行的prerotate
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

logrotate的使用

在配置好配置文件之后,在正式使用前,最好使用logrotate的debug模式进行配置文件的测试,防止出错。

$ sudo logrotate /etc/logrotate.d/nginx

reading config file /etc/logrotate.d/nginx
Reading state from file: /var/lib/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state

Handling 1 logs

rotating pattern: /var/log/nginx/*log  after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
Now: 2019-02-28 16:22
Last rotated at 2019-02-24 15:51
log needs rotating
considering log /var/log/nginx/error.log
Now: 2019-02-28 16:22
Last rotated at 2019-02-24 15:51
log needs rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 7
dateext suffix '-20190228'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
rotating log /var/log/nginx/error.log, log->rotateCount is 7
dateext suffix '-20190228'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
renaming /var/log/nginx/access.log to /var/log/nginx/access.log-20190228
creating new /var/log/nginx/access.log mode = 0640 uid = 1000 gid = 1000
renaming /var/log/nginx/error.log to /var/log/nginx/error.log-20190228
creating new /var/log/nginx/error.log mode = 0640 uid = 1000 gid = 1000
running postrotate script
running script with args /var/log/nginx/*log  (null): "
                test ! -r /run/nginx.pid || kill -USR1 `cat /run/nginx.pid`

从输出可以看出来,在debug模式下,logrotate对指定的配置文件进行了一次模拟操作。

可以看到在模拟操作中,将现有的日志文件重命名为了access-20190228,同时使用配置的的权限重新生成一个同名日志文件。然后执行postrotate中定义的脚本。

在确定没有什么问题时候可以对日志进行操作了,或者等待下一次自动进行操作。

$ sudo logrotate -f /etc/logrotate.d/nginx
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部