zoukankan      html  css  js  c++  java
  • 简单好用的日志管理工具 Logrotate

    前言

    日志就像程序的生命记录仪,详细记录下了程序运行的点点滴滴。

    1. 慎重的选择记录哪些日志:在茫茫日志海中寻找真正记录问题的日志,你是不想经历的;
    2. 精心的定时压缩转移日志:故障发生了,日志却丢了,此时的任何辩解都是苍白无力的。

    记录哪些日志需要你在编写应用程序慎重决定,本文讲述如何使用Linux自带的logrotate程序来精心组织我们可爱的日志文件。

    简介

    日志,实际就是本文文件,且是个内容不断在增长的文件。处理通常就是按天或者按大小来备份、压缩或转储,非常简单。

    /var/log/messages是大家熟悉的系统日志存放位置。如果该文件内容增长特别快,几天可能就撑满了整个硬盘,那么对该文件的备份、压缩或转储就显得尤为重要。

    手动怎么处理呢?可能是:

    1. 编写日志处理脚本,脚本检测如果日志文件大小超过10M就拷贝一份日志并压缩转储,中间还需要清空原日志;
    2. Crontab中把这个脚本作为定时任务,每天执行下。

    Logrotate实际就是起着上述脚本作用的小工具,他通过让用户来配置规则的方式,检测和处理日志文件。配合Cron可让处理定时化;
    Logrotate预制了大量判断条件和处理方式,可大大降低手写脚本的负担和出错的可能;

    Logrorate检测日志文件属性,比对用户配置好的检测条件,对满足条件的再根据用户配置的要求来处理,整个可以通过Cron来定时调度,这其实是非常经典的Linux解决问题的思路,可以好好静下心来品味下,简单,好用。

    组成

    以下是logrotate运行的关键点:

    1. /usr/bin/logrotate 程序所在位置;
    2. /etc/cron.daily/logrotate 默认让Cron每天执行logrotate一次;
    3. /etc/logrotate.conf 全局配置文件;
    4. /etc/logrotate.d 应用自个的配置文件存放目录,覆盖全局配置;

    全局配置文件/etc/logrotate.conf

    # cat /etc/logrotate.conf
    
    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    
    # keep 4 weeks worth of backlogs
    rotate 4
    
    # create new (empty) log files after rotating old ones
    create
    
    # use date as a suffix of the rotated file
    # dateext
    
    # uncomment this if you want your log files compressed
    #compress
    
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d
    
    # no packages own wtmp and btmp -- we'll rotate them here
    /var/log/wtmp {
        monthly
        create 0664 root utmp
     minsize 1M
        rotate 1
    }
    
    /var/log/btmp {
        missingok
        monthly
        create 0600 root utmp
        rotate 1
    }
    
    # system-specific logs may be also be configured here.
    

    查看全局配置文件cat /etc/logrotate.conf,可以发现#是行注释,配置项都是以关键字形式出现(那么想知道每个关键字的作用,最简单的就是直接man查看了)。

    仔细看下每个关键字的注释,不难发现,比如:

    1. weekly:表示每周处理下日志;
    2. rotate4:最多保持4个轮转备份,关于轮转本身后文会详述,很有意思;
    3. create:处理完该日志文件后,新生成一个日志文件,当然尽可能是同名同权限等;
    4. dateext:默认未加时间戳;
    5. compress:默认不压缩;
    6. 对wtmp和btmp日志做了单独处理,于是你意识到了单独的配置可以放在/etc/logrotate.d目录,或者直接放在全局配置里面。

    于是当logrotate程序被执行时,按照字面意思logrotate默认是想每周处理下日志,对日志最多轮转保留4份,处理方式是不压缩也不加时间戳,处理完后再生成个同名文件。当然这些是默认设置,还对wtmp和btmp日志处理做了单独要求并且include /etc/logrotate.d目录下还有一大堆处理要求。该目录下配置文件,在logrotate被执行后,都会不一个个读取来执行。

    自定义配置文件存放目录/etc/logrotate.d/

    # ls /etc/logrotate.d/
    cups  debug  dracut  httpd  iptraf  mysqld  ppp  psacct  sssd  subscription-manager  syslog  tomcat6  up2date  vsftpd  wpa_supplicant  yum
    

    例如查看下sssd配置文件的内容:

    # cat /etc/logrotate.d/sssd
    
    /var/log/sssd/*.log {
        weekly
        missingok
        notifempty
        sharedscripts
        rotate 2
        compress
        postrotate
            /bin/kill -HUP `cat /var/run/sssd.pid  2>/dev/null`  2> /dev/null || true
        endscript
    }
    

    可以发现基本格式与全局配置文件/etc/logrotate.conf一致,不难想象单独为某个日志配置的要求优先级肯定更高,如果与全局配置中出现相同项目的配置,单独的肯定覆盖全局的。

    Cron执行 /etc/cron.daily/logrotate

    配置文件都指定完毕,logrotate可单独执行了,当然也可以通过cron来定时执行;

    # cat /etc/cron.daily/logrotate
    
    #!/bin/sh
    
    /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0
    

    默认的logrotate已经放在/etc/cron.daily/logrotate目录,很明显是让cron每天执行一次logrotate程序;

    当然你也可以将该脚本放到其他时间,比如每分钟执行,甚至可以单独写crontab表达式来让logrotate指定配置文件和指定时间执行;

    小结

    至此,我们看过了logrotate的全局配置文件,单独配置文件,已经如何配合cront来定时执行。
    为了加深记忆,我们先小结下:

    1. logrotate是个程序,专门用来处理日志文件;
    2. 处理需要用户配置规则,比如指定超出10M则做什么动作;
    3. 规则可配置到独立的配置文件中,当然全局还有个全局默认配置文件,要知道每个配置文件都放在哪哦;
    4. logrotate一被执行,就会搜索所有的配置文件按要求处理日志;
    5. 可以配合cron让logrotate定时执行;

    测试

    man过logrotate的同学大概知道logrotate该怎么用了,常见的选项使用如下:

    # 1. 调试 (d = debug)参数为配置文件,不指定则执行全局配置文件
    logrotate -d /etc/logrotate.d/test.conf
    
    # 2. 强制执行(-f = force),可以配合-v(-v =verbose)使用,注意调试信息默认携带-v;
    logrotate -v -f /etc/logrotate.d/test.conf
    

    本例通过自定义配置文件来压缩指定日志文件来测试logrotate的使用。
    注意logrotate都是需要使用root来执行的,(但是可以通过配置项来指定生成的日志文件为普通用户的)。

    # 1. 生成一个日志文件
    
    man ps > test.log
    ll -h test.log
    -rw-r--r-- 1 root root 54K Sep  6 11:36 test.log
    
    # 2. 编写对该日志文件如何处理的logrotate配置文件
    cat /etc/logrotate.d/test.conf
    
    /var/log/test.log {
    compress
    rotate 4
    size 30k
    create 0600 root root
    }
    
    # 3. 调试是否可以按照配置文件要求生成压缩文件
    
    logrotate -d /etc/logrotate.d/test.conf
    
    reading config file /etc/logrotate.d/test.conf
    reading config info for /var/log/test.log
    
    Handling 1 logs
    
    rotating pattern: /var/log/test.log  30720 bytes (4 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/test.log
      log needs rotating
    rotating log /var/log/test.log, log->rotateCount is 4
    dateext suffix '-20150906'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),
    renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),
    renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),
    renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),
    renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),
    renaming /var/log/test.log to /var/log/test.log.1
    creating new /var/log/test.log mode = 0600 uid = 0 gid = 0
    compressing log with: /bin/gzip
    removing old log /var/log/test.log.5.gz
    error: error opening /var/log/test.log.5.gz: No such file or directory
    
    # 4. 调试结果正常,实际测试下
    logrotate -f /etc/logrotate.d/test.conf
    ll -h test.log*
    
    -rw------- 1 root root   0 Sep  6 11:44 test.log
    -rw-r--r-- 1 root root 14K Sep  6 11:44 test.log.1.gz
    

    测试正常;
    以上logrotate -f /etc/logrotate.d/test.conf指令完全可以写入crontab中,按照要求时间来执行,此处暂时不拆开讲了。

    轮转

    我们从上述debug信息中,摘录轮转部分的日志来理解下,什么叫轮转。

    rotating log /var/log/test.log, log->rotateCount is 4
    
    renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),
    renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),
    renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),
    renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),
    renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),
    renaming /var/log/test.log to /var/log/test.log.1
    
    emoving old log /var/log/test.log.5.gz
    error: error opening /var/log/test.log.5.gz: No such file or directory
    

    根据配置文件要求,轮转4份;
    以伪代码在简写上述日志为:

    rotateCount=4
    mv 4 5
    mv 3 4
    mv 2 3
    mv 1 2
    rm 5
    

    这就很容易理解了,所谓轮转,就是类似二级制向右位移一样不断的重命名;

    例子

    在弄清楚logrotate的运作机制,又实地测试一番后,以下将通过多个例子方式来让大家快速配置。

    清空但不删除日志文件

    copytruncate的作用在于先复制一份当前日志文件用做处理,再清空源日志文件,让其继续接收日志。
    当然在复制和清空的空隙可能会有若干

    $ cat logrotate.conf 
    
    /tmp/output.log {        
        size 1k        
        copytruncate        
        create 700 bala bala        
        rotate 4        
        compress 
    }
    

    摘自参考3;

    日志处理完执行自定义脚本

    postrotate和endscript中间可以编写自定义脚本,用来对日志或者其他其定义处理,扩展性非常强;
    例如由于logrotate对压缩日志可指定的时间戳只能到天,于是可以再自定义脚本里面对文件做时分等细化命名;

    $ cat logrotate.conf 
    
    /tmp/output.log {        
        size 1k        
        copytruncate        
        rotate 4        
        compress        
        postrotate               
            /home/bala/myscript.sh        
        endscript 
    }
    

    摘自参考3;

    更改压缩程序

    默认压缩程序使用.gz,当然可以自定义,需要制定压缩程序和后缀名;

    $ cat logrotate.conf 
    
    /tmp/output.log {        
        size 1k        
        copytruncate        
        create        
        compress        
        compresscmd /bin/bzip2        
        compressext .bz2        
        rotate 4 
    }
    

    参考

    1. man logrotate
    2. 被遗忘的logrotate
    3. HowTo: The Ultimate Logrotate Command Tutorial with 10 Examples
    4. logrotate 进行nginx日志分割
  • 相关阅读:
    Jedis与Redisson选型对比
    使用rdbtools工具来解析redis rdb文件
    Generating equals/hashCode implementation but without a call to superclass
    解决 Order By 将字符串类型的数字 或 字符串中含数字 按数字排序问题
    File.delete()和Files.delete(Path path)的区别
    file.deleteOnExit()与file.delete()的区别
    java日期中YYYY与yyyy的区别
    IDEA git分支回退指定的历史版本
    Lucene介绍与使用
    Lombok 学习指南
  • 原文地址:https://www.cnblogs.com/futeng/p/4785206.html
Copyright © 2011-2022 走看看