• CentOS下的日志切割


      在Linux下,日志会不停的增长,为了防止日志文件过大,导致我们无法在日志中快速找到想要的信息,我们会定时对日志文件进行切割。在这里我将使用logrotate切割日志。

    (1).logrotate的配置文件

      logrotate配置文件主要在两个地方:/etc/logrotate.conf以及/etc/logrotate.d/下的明细配置文件。

      其中/etc/logrotate.conf文件是主配置文件,/etc/logrotate.d/下的明细配置文件都会被读入/etc/logrotate.conf进行执行,所以请注意这里还涉及到了公有变量和私有变量。

       logrotate的执行是由crond服务来调用的,其脚本是/etc/cron.daily/logrotate,每天自动执行。我们可以看一下脚本具体内容:

    [root@xuexi ~]# cat /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
    

      简单的说明下,就是/usr/sbin/logrotate工具调用了/var/lib/logrotate/logrotate.status和/etc/logrotate.conf两个文件。然后将执行的结果(就是那个$?,成功为0,不成功为非0)进行判断,非0时执行/usr/bin/logger命令。最后退出。

       看完定时计划任务,我们再来看主配置文件/etc/logrotate.conf(也就是公有变量)。具体内容如下:

    [root@xuexi ~]# grep -vE "^$|^#" /etc/logrotate.conf 
    weekly  //每周一次rotate(翻译是旋转,其实就是切割)
    rotate 4  //保留4份切割文件,多余删除,不计算新建日志文件
    create  //结束后创建一个新的空白日志文件
    dateext  //用日期作为切切割文件的后缀
    include /etc/logrotate.d  //将/etc/logrotate.d目录下的文件都加载进来(全都执行)
    /var/log/wtmp {  //仅针对/var/log/wtmp文件
        monthly  //每月执行一次
        create 0664 root utmp  //结束后创建新的空白日志,权限0664,所有者root,所属组utmp
    	minsize 1M  //切割文件最少需要1M,否则不执行
        rotate 1  //保留1份,多余删除,不计算新建日志文件
    }
    /var/log/btmp {  //仅针对/var/log/btmp
        missingok  //丢失不报错
        monthly  //每月执行一次
        create 0600 root utmp  //结束后创建新的空白日志,权限0600,所有者root,所属组utmp
        rotate 1  //保留1份,多余删除,不计算新建日志文件
    }
    

      配置文件参数说明:

        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  备份日志文件,但不截断。

    (2).查看上次切割日志时间

      /var/lib/logrotate/logrotate.status中默认记录logrotate上次切割日志文件的时间

    [root@xuexi logrotate]# cat /var/lib/logrotate/logrotate.status 
    logrotate state -- version 2
    "/var/log/yum.log" 2019-1-2-11:30:2
    "/var/log/cups/page_log" 2018-11-1-10:0:0
    "/var/log/cups/error_log" 2018-11-1-10:0:0
    "/var/log/boot.log" 2019-4-16-11:37:1
    "/var/log/cups/access_log" 2019-4-15-10:18:1
    "/var/log/chrony/*.log" 2018-11-1-10:0:0
    "/var/log/wtmp" 2018-11-1-10:0:0
    "/var/log/spooler" 2019-4-15-10:18:1
    "/var/log/btmp" 2019-4-8-15:13:1
    "/var/log/iscsiuio.log" 2018-11-1-10:0:0
    "/var/log/maillog" 2019-4-15-10:18:1
    "/var/log/libvirt/libvirtd.log" 2018-11-1-10:0:0
    "/var/log/libvirt/qemu/*.log" 2018-11-1-10:0:0
    "/var/log/wpa_supplicant.log" 2018-11-1-10:0:0
    "/var/log/secure" 2019-4-15-10:18:1
    "/var/log/numad.log" 2018-11-1-10:0:0
    "/var/log/ppp/connect-errors" 2018-11-1-10:0:0
    "/var/log/messages" 2019-4-15-10:18:1
    "/var/account/pacct" 2018-11-1-10:0:0
    "/var/log/cron" 2019-4-15-10:18:1
    

    (3).自定义日志切割

      首先将sshd服务产生的日志自定义,作为实验目标

    [root@xuexi ~]# vim /etc/rsyslog.conf
    //在文件末尾添加一行
    local0.*  /var/log/sshd.log
    [root@xuexi ~]# vim /etc/ssh/sshd_config
    //将SyslogFacility AUTHPRIV改为
    SyslogFacility local0
    [root@xuexi ~]# touch /var/log/sshd.log
    [root@xuexi ~]# ll /var/log/sshd.log
    -rw-r--r--. 1 root root 0 4月 17 13:38 /var/log/sshd.log
    [root@xuexi ~]# systemctl restart sshd
    [root@xuexi ~]# systemctl restart rsyslog.service 
    [root@xuexi ~]# ll /var/log/sshd.log
    -rw-r--r--. 1 root root 352 4月 17 13:38 /var/log/sshd.log
    

      之后创建切割明细配置文件,并强制执行

    [root@xuexi ~]# vim /etc/logrotate.d/sshd
    [root@xuexi ~]# cat /etc/logrotate.d/sshd 
    /var/log/sshd.log{
        missingok
        weekly
        create 0600 root root
        dateext
        rotate 3
    }
    [root@xuexi ~]# systemctl restart rsyslog.service
    [root@xuexi ~]# logrotate -vf /etc/logrotate.d/sshd 
    reading config file /etc/logrotate.d/sshd
    Allocating hash table for state file, size 15360 B
    
    Handling 1 logs
    
    rotating pattern: /var/log/sshd.log forced from command line (3 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/sshd.log
      log needs rotating
    rotating log /var/log/sshd.log, log->rotateCount is 3
    dateext suffix '-20190417'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    glob finding old rotated logs failed
    fscreate context set to unconfined_u:object_r:var_log_t:s0
    renaming /var/log/sshd.log to /var/log/sshd.log-20190417
    creating new /var/log/sshd.log mode = 0600 uid = 0 gid = 0
    set default create context
    [root@xuexi ~]# ll /var/log/sshd*
    -rw-------. 1 root root   0 4月  17 13:47 /var/log/sshd.log
    -rw-r--r--. 1 root root 352 4月  17 13:38 /var/log/sshd.log-20190417
    

      logrotate的-d选项是预演,-f是强制执行,-v是显示详细过程。

    (4).扩展

      另外还可使用shell和python进行日志切割,这里我找了一个大佬的文章提供参考:运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)

  • 相关阅读:
    [No0000F0]DataGrid一行Row添加ToolTip,wpf
    [No0000EE]主要的宏观经济指标查询
    [No0000E9]Microsoft Help Viewer 2.3绿色版
    [No0000F2]ip安全监视器
    [No0000ED]IPSec策略之管理
    [No0000EC]C# 字符串(String)
    [No0000EB]C# 数组(Array)
    [No0000EA]C# 可空类型(Nullable)
    [No0000E8]C# 方法 参数传递
    [No0000E7]C# 封装 与访问修饰符
  • 原文地址:https://www.cnblogs.com/diantong/p/10717926.html
Copyright © 2020-2023  润新知