zoukankan      html  css  js  c++  java
  • 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脚本实现)

  • 相关阅读:
    Mac php使用gd库出错 Call to undefined function imagettftext()
    centos 使用 locate
    Mac HomeBrew 安装 mysql
    zsh 命令提示符 PROMPT
    新的开始
    Java 面试题分析
    Java NIO Show All Files
    正确使用 Volatile 变量
    面试题整理 2017
    有10阶梯, 每次走1,2 or 3 阶,有多少种方式???
  • 原文地址:https://www.cnblogs.com/diantong/p/10717926.html
Copyright © 2011-2022 走看看