• Linux日志切割神器logrotate


    Logrotate允许自动循环压缩,删除和邮寄日志文件。可以将Logrotate设置为每小时,每天,每周,每月或当日志文件达到一定大小或时间时处理日志文件。

    安装:

    主流Linux发行版上都默认安装有logrotate包,如果出于某种原因,logrotate没有安装,你可以使用apt-get或yum命令来安装。

    在Debian或Ubuntu上:apt-get install logrotate

    在Fedora,CentOS或RHEL上:yum install logrotate

    检查安装成功: logrotate --version

    原理:

    logrotate 是怎么做到滚动日志时不影响程序正常的日志输出呢?logrotate 提供了两种解决方案。

    create

    这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:

    1. 重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
    2. 创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。
    1. 最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。

    如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。

    不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如下方式。

    copytruncate

    该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤如下:

    1. 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
    2. 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。

    如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。

    通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。

    举例:

    先看结果:nginx日志滚动 (每天23.59分滚动,保留5个备份,并压缩,后缀有日期)

    配置logrotate

    执行文件:/etc/logrotate.conf

    自定义配置文件:/etc/logrotate.conf- 顶层主配置文件,通过 include 指令,会引入/etc/logrotate.d/通常一些第三方软件包,会把自己私有的配置文件,也放到这个目录下。 如 yum,zabbix-agent,syslog,nginx 等。

    [root@gop-sg-192-168-56-103 logrotate.d]# cat yum
    /var/log/yum.log {
        missingok
        notifempty
        size 30k
        yearly
        create 0600 root root
    }

    运行logrotate

    具体 logrotate 命令格式如下:

    logrotate [OPTION...] <configfile>
    -d, --debug :debug 模式,测试配置文件是否有错误。
    -f, --force :强制转储文件。
    -m, --mail=command :压缩日志后,发送日志到指定邮箱。
    -s, --state=statefile :使用指定的状态文件。
    -v, --verbose :显示转储过程。

    logrotate用法

    详细介绍请自行 man logrotate

    结合cornd定时任务

    由于 logrotate 是基于 cron 运行的,所以这个日志轮转的时间是由 cron 控制的,具体可以查询 cron 的配置文件 /etc/crontab

    [root@gop-sg-192-168-56-103 logrotate.d]# vim /etc/crontab
    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
  • 相关阅读:
    mysql:左连接、内连接、in()语句以及对比
    微信小程序与Java的Servlet通信小示例
    MyEclipse快捷键大全
    學習網站
    spring 框架的筆記
    下載地址
    學習hibernate筆記
    配置struts.xml
    蓄水池采样(Reservoir Sampling)
    秦时明月哲理
  • 原文地址:https://www.cnblogs.com/shadow-yin/p/14843057.html
Copyright © 2020-2023  润新知