Nginx日志切割之Logrotate篇

  不管是什么日志文件,都是会越来越大的,大到一定程度就是个可怕的事情了,所以要及早的做处理,方法之一就是按时间段来存储,不过linux系统提供了Logrotate的日志管理工具,很好用,不用写计划任务脚本了,不过弊端是转储后的日志文件放入指定的目录,必须和当前日志文件再同一个系统,下面是摘录别人的。记录下以备不时之需。

      Logrotate是Linux下一款日志管理工具,可用于日志文件的转储(即删除旧日志文件,创建新日志文件)。可以根据日志大小或者按照某时段间隔来转储,内部使用cron程序来执行。Logrotate还可以在压缩日志,并发送到指定E-mail。

      Logrotate默认配置文件是/etc/logrotate.conf,其中第一行是:

include /etc/logrotate.d

说明包含了该目录下的配置,普通用户的配置也在这里,比如nginx日志切割 /etc/logrotate.d/nginx。Logrotate有许多可配置参数,也可使用man命令来查询:

1compress 通过gzip压缩转储以后的日志 2nocompress 不压缩 3copytruncate 用于还在打开中的日志文件,把当前日志备份并截断 4nocopytruncate 备份日志文件但是不截断 5create mode owner group 转储文件,使用指定的文件模式创建新的日志文件 6nocreate 不建立新的日志文件 7delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 8nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。 9errors address 专储时的错误信息发送到指定的Email 地址 10ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。 11notifempty 如果是空文件的话,不转储 12mail address 把转储的日志文件发送到指定的E-mail 地址 13nomail 转储时不发送日志文件 14olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 15noolddir 转储后的日志文件和当前日志文件放在同一个目录下 16prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行 17postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行 18daily 指定转储周期为每天 19weekly 指定转储周期为每周 20monthly 指定转储周期为每月 21rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 22tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v,~ 23size size 当日志文件到达指定的大小时才转储,bytes(缺省)KB(sizek)MB(sizem)

先看看centOS安装后的logrotate.conf部分内容:

1/var/log/wtmp { //用户登录和持续时间日志 2 monthly //按周切割 3 minsize 1M //最小达到1M 4 create 0664 root utmp //切割后日志文件属性 5 rotate 1 //保留副本 6}

简单明了。如您所料,include可以批量指定配置文件,典型应用都包含在/etc/logrotate.d/目录下,有:apache、linuxconf、syslog等。注意:include引入配置会覆盖同名默认配置

若干要点:
  1. 每个部分首括号可与其他语句同行,尾行括号必须单独成行

  2. prerotate和postrotate可指定转储前后(即切割前后)执行的linux脚本(endscript结束),如

    1/var/log/messages { 2 prerotate //转储之前脚本 3 /usr/bin/chattr -a /var/log/messages //去掉该文件-a属性 4 endscript //脚本结束 5 postrotate //转储后脚本 6 /usr/bin/kill -HUP syslogd //重新初始化系统日志守护程序 syslogd 7 /usr/bin/chattr +a /var/log/messages //添加-a属性,防止文件被覆盖 8 endscript 9}
  3. Logrotate的备份策略(以两个备份来说明,即rotate 2,文件error.log):原始文件error.log,经过一次转储,会生成error.log.1;第二次转储,生成error.log.2;第三次转储,error.log.n命名为error.log.n+1,同时生成新的error.log.1,删除error.log.n+1文件。

  4. 转储可以通过强制执行来观察工作过程

    logrotate -vf /etc/logrotate.d/nginx
    
  5. 日志切割的执行时间是由cron程配置决定的,可查看/etc/crontab文件(cron时间戳格式:分时日月周), 我的测试:针对10.47.*.*上的nginx日志进行按日切割,配置如下(/etc/logrotate.d/nginx文件):

  6. 1 /var/log/nginx/*.log { //注意:具体请以自己的nginx日志为准 2 daily //每天切割 3 dateext //%Y%m%d作为后缀 4 missingok //日志不存在,分析下一个 5 rotate 2 //保留两个备份 6 compress //转储之后压缩.tar.gz 7 notifempty //空文件不转储 8 create 640 nginx adm //新日志文件模式 9 sharedscripts //整个日志组运行一次的脚本 10 postrotate 11 [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` 12 //重启nginx,重新加载日志文件,防止不写 13 `cp -f /var/log/nginx/*.* /var/log/nginx/backup` 14 //自定义脚本,将旧日志copy到backup文件夹(backup要存在) 15 endscript 16 }
  7.  默认logrotate是通过crontab定期执行的,我们也可以手动执行查看结果:

    # logrotate -vf /data/log/nginx/access.log
    

    验证是否执行,查看cron的日志即可

    # grep logrotate /var/log/cron
    
  8. 使用logrotate管理nginx的日志,优点在于:

    11、不需要担心日志文件会将目录塞满,logrotate会保留特定个数文件; 2 32、每天的日志放在一个文件中,不需要一直往前翻,方便查阅;
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用