随着时间推移,日志也会慢慢增加,为防止日志过大,需要做日志切割。
其中Logrotate支持按时间和大小来自动切分,以防止日志文件太大。
真正内容:当日志达到某个特定的大小,我们将日志分类,之前的日志保留一个备份,再产生的日志创建一个同名的文件保存新的日志。

logrotate配置文件主要有:
/etc/logrotate.conf 以及 /etc/logrotate.d/这个子目录下的明细配置文件。
logrotate的执行由crond服务调用的

其中全局参数的含义如下(/etc/logrotate.conf):
说明:(全局参数)
weekly : 每周执行回滚,或者说每周执行一次日志回滚
rotate: 表示日志切分后历史文件最多保存离现在最近的多少份 [rəʊˈteɪt] 旋转
create : 指定新创建的文件的权限与所属主与群组
dateext : 使用日期为后缀的回滚文件 #可以去/var/log目录下看看

不过一般我们都会在/etc/logrotate.d/目录下新建自己的配置文件

查看日志文件什么时候开始轮换的信息
[root@localhost ~]# vi /var/lib/logrotate/logrotate.status

配置文件参数说明

1
2
3
4
5
6
7
8
monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
notifempty: 如果日志文件为空,轮循不会进行。
create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

例子

  • 需求:/test/PluginHelper.log日志文件过大,需要做日志切割
    /etc/logrotate.d/下新建切割规则文件,将其命名为PluginHelper

    1
    [root@localhost ~]# vi /etc/logrotate.d/PluginHelper
  • 然后写入规则

    1
    2
    3
    4
    5
    6
    /test/PluginHelper.log{ #需要切割的日志文件
    weekly #至少每周执行一次
    rotate 3 #日志切分后历史文件最多保存离现在最近的3份
    create 0600 root root #指定新创建的文件的权限与所属主与群组
    minsize 1M #文件超过1M进行回滚
    }
  • 重新启动rsyslog服务
    [root@localhost ~]#systemctl restart rsyslog

  • 查看效果(强制切割)
    [root@localhost ~]# logrotate -vf /etc/logrotate.d/PluginHelper
    v:显示详细信息
    f:强制轮循,也就是说即使轮循条件没有满足,也强制执行

  • 查看日志是否切割成功

    1
    2
    3
    [root@localhost ~]# ll /test/total 0
    -rw-------. 1 root root 0 Aug 22 12:26 207_PluginHelper.log
    -rw-------. 1 root root 0 Aug 22 12:25 207_PluginHelper.log.1

    配置文件参数说明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
        missingok  日志切割期间产生错误将被忽略(如果日志丢失,不报错继续切割)

        daily、weekly、monthly、yearly  每天、每周、每月、每年执行

        create MODE OWNER GROUP  切割后指定创建新的空白文件的属性

        nocreate  不建立新的日志文件

        rotate N  保留N份,多余删除,不计算新建日志文件

        dateext  用当前日期作为后缀命名格式(默认年月日)

        dateformat .%s  配合dateext使用,紧跟在下一行出现,定义切割后的文件名,只支持%Y,%m,%d,%s

        size/minsize  达到指定大小才会切割,默认单位bytes,还可以是KB和MB

        compress  切割结束后,归档并使用gzip格式压缩

        nocompress  解除compress参数

        delaycompress  总是与compress参数一起使用,指示logrotate不要将最近的归档压缩,压缩将在下一次切割进行。

        nodelaycompress  解除delaycompress参数

        ifempty  即使日志为空,也执行切割

        notifempty  如果日志为空,切割不执行

        prerotate/endscript  在所有其他指令之前执行prerotate和endscript之间的命令。

        postrotate/endscript  在所有其他指令完成后,postrotate和endscript之间的命令将被执行。

        sharescripts  所有日志切割后统一执行一次脚本,如果没有配置该参数,则每个日志切割后都会执行一次脚本。

        errors ADDRESS  切割时的错误信息发送到指定的Emial地址

        mail ADDRESS  切割日志发送到指定的Email地址

        nomail  切割日志不发送邮件

        olddir DIRECTORY  切割后的日志文件放入指定目录,必须与当前日志处在同一文件系统

        noolddir  切割后的日志文件与当前文件放在同一目录下

        copytruncate  用于还在打开中的日志文件,把当前日志备份并截断;先拷贝后清空,可能丢失部分日志

        nocopytruncate  备份日志文件,但不截断。

项目里面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
xxxxxxxxxx{
nocompress
monthly
copytruncate
createntoifempty
rotate 6
olddir /opt/mysql/old_log
missingok
dateext
postrotate
/bin/kill -HUP `pidof /opt/mysql/bin/mysql-server 2>/dve/null ` 2 >dev/null || true
endscript
}