zoukankan      html  css  js  c++  java
  • Linux日志文件总管——logrotate

    1、logrotate简介

           日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。

          logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。另外,旧日志也可以通过电子邮件发送。

    2、logrotate安装

           主流Linux发行版上都默认安装有logrotate包,如果出于某种原因,logrotate没有出现在里头,你可以使用

    yum install logrotate crontabs     ##本文只讲述centos的版本,其他系统版本请自行查询

    3、logrotate的配置相关文件

    A、logrotate.conf

     logrotate的主要配置文件是/etc/logrotate.conf,通常不需要对它进行修改。

     1 [root@localhost logrotate.d]# cat /etc/logrotate.conf 
     2 # see "man logrotate" for details
     3 # rotate log files weekly
     4 weekly
     5 
     6 # keep 4 weeks worth of backlogs
     7 rotate 4
     8 
     9 # create new (empty) log files after rotating old ones
    10 create
    11 
    12 # use date as a suffix of the rotated file
    13 dateext
    14 
    15 # uncomment this if you want your log files compressed
    16 #compress
    17 
    18 # RPM packages drop log rotation information into this directory
    19 include /etc/logrotate.d
    20 
    21 # no packages own wtmp and btmp -- we'll rotate them here
    22 /var/log/wtmp {
    23     monthly
    24     create 0664 root utmp
    25     minsize 1M
    26     rotate 1
    27 }
    28 
    29 /var/log/btmp {
    30     missingok
    31     monthly
    32     create 0600 root utmp
    33     rotate 1
    34 }
    35 
    36 # system-specific logs may be also be configured here.
    View Code

     B、logrotate.d

         日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
          另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

    [root@localhost logrotate.d]# cd /etc/logrotate.d/
    [root@localhost logrotate.d]# ls
    dracut  httpd  php-fpm  syslog  yum

    C、logrotate的定时任务

    Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。
    实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。
    可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

    1 [root@localhost logrotate.d]# cat /etc/cron.daily/logrotate 
    2 #!/bin/sh
    3 
    4 /usr/sbin/logrotate /etc/logrotate.conf
    5 EXITVALUE=$?
    6 if [ $EXITVALUE != 0 ]; then
    7     /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    8 fi
    9 exit 0
    View Code

     D、logrotate的记录日志

    logrotate自身的日志通常存放于/var/lib/logrotate/status目录。如果处于排障目的,我们想要logrotate记录到任何指定的文件,我们可以指定像下面这样从命令行指定。

    # logrotate -vf –s /var/log/logrotate-status /etc/logrotate.d/log-file

    4、logrotate命令格式

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

    详细参数:

      1 rotate COUNT
      2     轮转COUNT次,也就是最多保留COUNT个轮转备份。
      3     超出的被删除或邮寄。
      4     设置为0,则不保存轮转的老日志。
      5 start COUNT
      6     轮转文件名基于这个数字。
      7     例如,指定0时,原日志文件轮转的备份文件以.0为扩展名,如果指定9,就直接从.9开始跳过0-8
      8     然后再继续向后轮转rotate指定的次数。
      9 
     10 compress
     11     默认使用gzip压缩老日志
     12 nocompress
     13     不压缩老日志
     14 compresscmd
     15     指定压缩命令,默认gzip
     16 uncompresscmd
     17     指定解压命令,默认gunzip
     18 compressext
     19     如果启用了压缩,指定在压缩了的日志文件上使用哪个扩展。默认随配置的压缩命令
     20 compressoptions
     21     可以传送命令行选项给压缩程序,默认的gzip使用-9选项(最大压缩率)
     22 delaycompress
     23     延迟到下次轮转时压缩之前的日志文件。
     24     需要与compress项连用,当程序有时不能关闭写日志文件时可使用此项。
     25 nodelaycompress
     26     不延迟压缩
     27 
     28 copy
     29     拷贝日志文件,不修改原有文件。
     30     给当前日志文件做快照,或其他工具需要截断或解析文件时,可使用此项
     31     使用此项时,create项就没用了,因为老日志文件占着位置
     32 nocopy
     33     留下原日志文件而不复制
     34 copytruncate
     35     在创建了拷贝后截断原日志文件到0大小,而不是用移动就日志文件再创建新文件的方法。
     36     可用于日志一些程序不关闭日志文件一直写的情况。
     37     注意,在拷贝文件和截断文件时有一个非常小的时间片,所以可能会丢失日志信息。
     38     使用此项时,create无效
     39 nocopytruncate
     40     创建拷贝后不截断原日志文件
     41 create MODE OWNER GROUP
     42     在轮转动作之后,postrotate脚本执行之前,立即使用刚轮转的日志文件名创建日志文件。
     43     MODE 指定日志文件的权限(0660之类)
     44     OWNER 指定日志文件的属主
     45     GROUP 指定日志文件的属组
     46     可省略任何上述属性,省略的属性从原文件继承,可使用nocreate项来关闭
     47 nocreate
     48     不创建新的日志文件
     49 
     50 daily
     51     每天轮转日志文件
     52 weekly
     53     如果当前的星期几比上次轮转的星期几少,或者过了一个多星期,就会发生轮转
     54     通常是在每周的第一天轮转,如果logrotate不是每天运行的,会在第一次有机会时进行轮转。
     55 monthly
     56     一月中logrotate第一次运行时进行轮转(通常是一月的第一天)
     57 yearly
     58     如果当前年份不同于上次轮转的年份,则进行日志轮转
     59 
     60 dateext
     61     归档旧日志文件时,文件名添加YYYYMMDD形式日期,可用dateformat选项扩展配置。
     62 nodateext
     63     不使用dateext扩展名
     64 dateformat FORMAT_STRING
     65     使用strftime(3)类似的格式指定dateext的格式,只允许%Y %m %d和%s指定符。
     66     默认为 -%Y%m%d。
     67     注意:扩展中分割日志的字符也是日期格式的一部分,
     68     系统时钟需要设置到2001-09-09之后,%s才能正确工作
     69 extension EXT
     70     日志文件可在轮转后使用指定的EXT扩展名。
     71     如果使用压缩,通常EXT后还会加上压缩文件的扩展名,通常是.gz。
     72     例如想把mylog.foo轮转为mylog.1.foo.gz而不是mylog.foo.1.gz
     73 
     74 ifempty
     75     默认项,即使日志是空的也进行轮转,覆盖notifempty项
     76 notifempty
     77     如果日志为空,则不进行轮转
     78 
     79 include FILE_OR_DIRECTORY
     80     读取include指令下的文件。
     81     如果是目录,在继续处理包含的文件之前,按字母顺序读取目录下大部分文件(只读取普通文件)
     82         目录或管道文件等,还有使用指定扩展名的文件不读取
     83         用tabooext指令定义禁忌扩展名。
     84     include指令不能出现在日志文件定义中。
     85 tabooext [+] LIST
     86     修改当前禁忌扩展名列表。
     87     如果列表前使用了+,表示将LIST加到当前列表中,否则就替换当前列表。
     88     默认包含:.rpmorig, .rpmsave, .v, .swp, .dpkg-dist, .dpkg-old, .dpkg-new, .disabled
     89 
     90 mail ADDRESS
     91     当日志轮转超过保留数时,多出的会mail到ADDRESS。
     92     可在log定义中使用nomail指令来不邮寄该log
     93 nomail
     94     不邮寄日志
     95 mailfirst
     96     与mail指令连用,邮寄刚轮转的日志,而不是期满的日志(超出数量要被删除的)
     97 maillast
     98     默认项,与mail连用,邮寄超出rotate数量要被删除的日志。
     99 
    100 maxage COUNT
    101     删除COUNT天前的轮转备份。
    102     只在轮转动作时检查日志文件的时间戳。
    103     如果配置了maillast和mail指令,删除的轮转备份会被邮寄。
    104 minsize SIZE
    105     日志文件增长到超过SIZE bytes时进行轮转,但不会在额外指定的时间间隔之前(daily,weekly等)。
    106     相关的size指令与其类似,但size与间隔指令互斥,不考虑时间而直接进行轮转。
    107     而minsize指令要考虑大小和时间戳。
    108 size SIZE
    109     超过SIZE时轮转,SIZE默认单位是KB,可使用M,G来指定MB和GB。
    110 shred
    111     默认关闭
    112     删除文件使用shred -u(销毁)而不是unlink()系统调用。
    113     可确保删除日志后,文件不可读(对磁盘伤害大)。
    114 shredcycles COUNT
    115     调用shred在删除日志文件前覆写COUNT次,不使用此项时,就按shred默认次数覆写。
    116 noshred
    117     删除就文件时不使用shred
    118 
    119 missingok
    120     如果日志文件不存在,继续处理下一个文件而不产生报错信息。
    121 nomissingok
    122     默认项,如果日志文件不存在,就产生错误。
    123 
    124 olddir DIRECTORY
    125     轮转的日志放到DIRECTORY目录中,目录必须与日志文件在同一物理设备上,
    126     如果没指定绝对路径,则假定该目录在与日志目录下。
    127 noolddir
    128     日志只在它们的当前目录中轮转。
    129 
    130 sharedsctipts
    131     通常prerotate和postrotate脚本为每一个轮转的日志运行,也就是说一个单独的脚本可能因为日志轮转定义
    132     中匹配了多个文件时(例如/var/log/news/*),该脚本会运行多次。
    133     指定此项,脚本只对所有匹配的日志文件统一执行一次。
    134     如果匹配的日志都不需要轮转,脚本也不会执行。
    135     如果脚本错误退出,剩下的动作也不会为任何日志执行。
    136     隐含create项,可被nosharedscripts覆盖。
    137 nosharedscripts
    138     默认项
    139     为每一个轮转的日志执行prerotate和postrotate
    140     如果脚本错误退出,剩下的动作只不对影响到的日志执行。
    141 prerotate/endscript
    142     在prerotate和endscript之间的行(他俩自己各占一行),在日志文件被轮转之前并且有需要轮转时,才会执行。
    143     该指令只能用于log文件定义中。
    144 postrotate/endscript
    145     在prerotate和endscript之间的行,在日志文件被轮转之后执行。
    146     该指令只能用于log文件定义中。
    147 firstaction/endscript
    148     在firstaction和endscript之间的行,在轮转所有匹配了通配符的日志被轮转之前,
    149     在prerotate执行之前,并且至少要有一个日志需要被轮转时,才会执行。
    150     只能用于log文件定义中,如果脚本错误退出,就不再继续往下进行。
    151 lastaction/endscript
    152     在lastaction和endscript之间的行,在轮转了所有匹配的日志后,在postrotate执行之后,
    153     并且至少要有一个日志被轮转了的情况下,才会执行。
    154     只能用于log文件定义中,如果脚本错误退出,只显示一个错误信息作为最后的动作。
    View Code

    如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要

    # /usr/sbin/logrotate -f /etc/logrotate.d/nginx
    # /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx

    根据日志切割设置进行操作,并显示详细信息

    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf 
    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

    根据日志切割设置进行执行,并显示详细信息,但是不进行具体操作,debug模式

    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf 
    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

    5、logrotate切割案列

    比如以系统日志/var/log/message做切割来简单说明下:
    第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
    第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!
    如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
    日志究竟轮换几次,这个是根据配置文件中的dateext 参数来判定的。

    看下logrotate.conf配置:
    # cat /etc/logrotate.conf
    # 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
    # 就会以其它文件的设定为主

    weekly          //默认每一周执行一次rotate轮转工作
    rotate 4       //保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
    create         //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
    dateext       //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
    compress      //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行

    include /etc/logrotate.d
    # 将 /etc/logrotate.d/ 目录中的所有文件都加载进来

    /var/log/wtmp {                 //仅针对 /var/log/wtmp 所设定的参数
    monthly                    //每月一次切割,取代默认的一周
    minsize 1M              //文件大小超过 1M 后才会切割
    create 0664 root utmp            //指定新建的日志文件权限以及所属用户和组
    rotate 1                    //只保留一个日志.
    }

    # 这个 wtmp 可记录用户登录系统及系统重启的时间
    # 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。

    由这个文件的设定可以知道/etc/logrotate.d其实就是由/etc/logrotate.conf 所规划出来的目录,虽然可以将所有的配置都写入/etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当使用很多的服务在系统上面时, 每个服务都要去修改/etc/logrotate.conf的设定也似乎不太合理了。 
    所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中。

     5.1、nginx日志切割

    [root@ceshi_web1 ~]# cat /etc/logrotate.d/nginx
    /Data/nginx/*/*log {
        daily
        rotate 365
        missingok
        notifempty
        compress
        dateext
        sharedscripts
        postrotate
        /etc/init.d/nginx reload
        endscript
    }
     
    [root@ceshi_web1 ~]# ll /Data/nginx/www.ceshi.com/
    ..........
    -rw-r--r-- 1 root root      1652 august  1 00:00 error.log-20180101.gz
    -rw-r--r-- 1 root root      1289 august  2 00:00 error.log-20180102.gz
    -rw-r--r-- 1 root root      1633 august  3 00:00 error.log-20180103.gz
    -rw-r--r-- 1 root root      3239 august  4 00:00 error.log-20180104.gz

    线上使用:

     1 1)logrotate日志分割配置:
     2 [root@bastion-IDC ~# vim /etc/logrotate.d/nginx
     3 /data/nginx_logs/*.access_log        
     4 {
     5 nocompress                                   
     6 daily                                  
     7 copytruncate                                  
     8 create                              
     9 ifempty                                   
    10 olddir /data/nginx_logs/days           
    11 rotate 0                                        
    12 }
    13 2)日志分割脚本
    14 [root@bastion-IDC ~# vim /usr/local/sbin/logrotate-nginx.sh
    15 #!/bin/bash
    16 #创建转储日志压缩存放目录
    17 mkdir -p /data/nginx_logs/days
    18 #手工对nginx日志进行切割转换
    19 /usr/sbin/logrotate -vf /etc/logrotate.d/nginx
    20 #当前时间
    21 time=$(date -d "yesterday" +"%Y-%m-%d")
    22 #进入转储日志存放目录
    23 cd /data/nginx_logs/days
    24 #对目录中的转储日志文件的文件名进行统一转换
    25 for i in $(ls ./ | grep "^(.*).[[:digit:]]$")
    26 do
    27 mv ${i} ./$(echo ${i}|sed -n 's/^(.*).([[:digit:]])$/1/p')-$(echo $time)
    28 done
    29 #对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
    30 for i in $(ls ./ | grep "^(.*)-([[:digit:]-]+)$")
    31 do
    32 tar jcvf ${i}.bz2 ./${i}
    33 rm -rf ./${i}
    34 done
    35 #只保留最近7天的压缩转储日志文件
    36 find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} ;
    37 3)crontab定时执行
    38 [root@bastion-IDC ~# crontab -e
    39 #logrotate
    40 0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1
    41 手动执行脚本,测试下看看:
    42 [root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
    43 [root@bastion-IDC ~# cd /data/nginx_logs/days
    44 [root@bastion-IDC days# ls
    45 ceshi.access_log-2017-01-18.bz2
    View Code

    5.2、tomcat日志切割

    [root@ceshi-backup ~]# cat /etc/logrotate.d/tomcat
    /Data/app/tomcat-7-ceshi/logs/catalina.out {
    rotate 14
    daily
    copytruncate
    compress
    notifempty
    missingok
    }
     
    [root@ceshi-backup ~]# ll /Data/app/tomcat-7-ceshi/logs/catalina.*
    -rw-r--r--. 1 root root     0 Jan 19 19:11 /Data/app/tomcat-7-ceshi/logs/catalina.out
    -rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-ceshi/logs/catalina.out.1.gz

    5.3、系统日志syslog切割

    [root@ceshi_web1 ~]# cat /etc/logrotate.d/syslog
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
        sharedscripts
        postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
    }
     
    [root@ceshi_web1 ~]# ll /var/log/messages*
    -rw------- 1 root root 34248975 Jan 19 18:42 /var/log/messages
    -rw------- 1 root root 51772994 Dec 25 03:11 /var/log/messages-20161225
    -rw------- 1 root root 51981366 Jan  8 03:36 /var/log/messages-20170108
    -rw------- 1 root root 51843025 Jan 15 03:40 /var/log/messages-20170115
    [root@ceshi_web1 ~]# ll /var/log/cron*
    -rw------- 1 root root 2155681 Jan 19 18:43 /var/log/cron
    -rw------- 1 root root 2932618 Dec 25 03:11 /var/log/cron-20161225
    -rw------- 1 root root 2951820 Jan  8 03:37 /var/log/cron-20170108
    -rw------- 1 root root 3203992 Jan 15 03:41 /var/log/cron-20170115
    [root@ceshi_web1 ~]# ll /var/log/secure*
    -rw------- 1 root root  275343 Jan 19 18:36 /var/log/secure
    -rw------- 1 root root 2772744 Jan  1 02:57 /var/log/secure-20170101
    -rw------- 1 root root 1115543 Jan  8 03:26 /var/log/secure-20170108
    -rw------- 1 root root  731599 Jan 15 03:40 /var/log/secure-20170115
    [root@ceshi_web1 ~]# ll /var/log/spooler*
    -rw------- 1 root root 0 Jan 15 03:41 /var/log/spooler
    -rw------- 1 root root 0 Dec 18 03:21 /var/log/spooler-20161225
    -rw------- 1 root root 0 Jan  1 03:06 /var/log/spooler-20170108
    -rw------- 1 root root 0 Jan  8 03:37 /var/log/spooler-20170115
  • 相关阅读:
    Yii的上传类使用CUploadedFile
    后台无刷新修改字段js
    YII CGridView的分析
    YII开发技巧分享——模型(models)中rules自定义验证规则
    easy_ui之窗口弹出的实例
    php后台如何避免用户直接进入方法
    暑假周总结三
    暑假周总结二
    暑假周总结一
    从入门到精通6
  • 原文地址:https://www.cnblogs.com/dadonggg/p/8649706.html
Copyright © 2011-2022 走看看