高效的log工具:Logrotate

高效的log工具:Logrotate,第1张

Logrotate的介绍

显而易见,Logrotate是基于CRON来运行的,其脚本是「/etc/cron.daily/logrotate」:

实际运行时,Logrotate会调用配置文件「/etc/logrotate.conf」:

这里的设置可以理解为Logrotate的缺省值,当然了,可以我们在「/etc/logrotate.d」目录里放置自己的配置文件,用来覆盖Logrotate的缺省值。

Logrotate的演示

按天保存一周的Nginx日志压缩文件,配置文件为「/etc/logrotate.d/nginx」:

如果你等不及CRON,可以通过如下命令来手动执行:

当然,正式执行前最好通过Debug选项来验证一下,这对调试也很重要:

BTW:类似的还有Verbose选项,这里就不多说了。

Logrotate的疑问

大家可能注意到了,我在前面Nginx的例子里声明日志文件的时候用了星号通配符,也就是说这里可能涉及多个日志文件,比如:access.log和error.log。说到这里大家或许就明白了,sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。

它们都是用来控制保存多少日志文件的,区别在于rotate是以个数为单位的,而maxage是以天数为单位的。如果我们是以按天来轮转日志,那么二者的差别就不大了。

前面我们说过,Logrotate是基于CRON运行的,所以这个时间是由CRON控制的,具体可以查询CRON的配置文件「/etc/crontab」,可以手动改成如23:59等时间执行:

如果使用的是新版CentOS,那么配置文件为:/etc/anacrontab。

以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,就必须重启服务,但为了高可用性,这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的方式,整个过程中日志文件的 *** 作句柄没有发生改变,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分日志数据。

BTW:MySQL本身在support-files目录已经包含了一个名为mysql-log-rotate的脚本,不过它比较简单,更详细的日志轮转详见「 Rotating MySQL Slow Logs Safely 」。

熟悉Apache的朋友可能会记得 cronolog ,不过Nginx并不支持它,有人通过mkfifo命令曲线救国,先给日志文件创建管道,再搭配cronolog轮转,虽然理论上没有问题,但效率上有折扣。另外,Debian/Ubuntu下有一个简化版工具savelog,有兴趣可以看看。

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

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

在Debian或Ubuntu上:

在Fedora,CentOS或RHEL上:

logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。

参数详解:

上面的模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的。

logrotate可以在任何时候从命令行手动调用。要调用为/etc/lograte.d/下配置的所有日志调用logrotate:

要为某个特定的配置调用logrotate,执行一次切割任务测试

即使轮循条件没有满足,我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件,‘-v’参数提供了详细的输出。

防止访问日志文件过大

logrotate工具对于防止因庞大的日志文件而耗尽存储空间是十分有用的。配置完毕后,进程是全自动的,可以长时间在不需要人为干预下运行。本教程重点关注几个使用logrotate的几个基本样例,你也可以定制它以满足你的需求。

使用:

logrotate CONF_FILE+

描述:

可自动轮转,压缩,删除,邮寄日志文件。可每天,每周,每月或日志文件达到一定大小时进行 *** 作。

通常logrotate是一个每天的cron计划,一般不会在一天内多次修改日志,除非轮转是基于日志大小的,

或者logrotate被多次运行,使用了-f(--force)项。

命令行上可指定任何多个配置文件。

后面的配置会覆盖前面的配置,所以配置文件的加载顺序很重要。

通常需要在一个配置文件中include其他配置文件,具体参见include指令用法。

如果在命令行上给出了一个目录,那么该目录下所有文件都将被用作配置文件。

如果没有参数,logrotate就打印版本等信息。如果在轮转日志时发生错误,会以非0状态退出。

选项:

-ddebug模式,隐含-v,不会对日志文件做实际 *** 作

-f, --force

强制轮转日志

-m, --mail <command>

邮寄日志时使用的命令

-s, --state <statefile>

指定另一个state文件

--usage

打印帮助

-v, --verbose

详细信息

配置文件

logrotate会读取每一个配置文件,配置文件中可对global和具体log文件配置。

本地配置(log文件配置)覆盖global配置,后来的配置覆盖先前的配置。

# sample logrotate configuration file注释行

compress轮转后进行压缩

/var/log/messages {指定日志文件路径

rotate 5保留5个轮转文件

weekly每周轮转

postrotate轮转之后执行的命令(在压缩旧日志之前)

/usr/bin/killall -HUP syslogd

endscript

}

"/var/log/httpd/access.log" /var/log/httpd/error.log {指定了两个日志文件

文件名中有空格,要用""

支持' " \的shell引用规则字符

rotate 5保留5个轮转文件

mail www@my.org解压后邮寄超过5次轮转的老日志文件,而不是删除

size 100k日志文件达到100K时就进行轮转

sharedscripts表示postrotate脚本在压缩了日志之后只执行一次

postrotate

/usr/bin/killall -HUP httpd

endscript

}

/var/log/news/* {所有/var/log/news/下的文件

通配符*,会轮转包括之前轮转的文件,需要olddir指令

或者*.log来指定只有.log后缀的文件

monthly每月轮转

rotate 2

olddir /var/log/news/old配合指定文件时的*通配符使用

missingok如果指定的目录不存在,logrotate会报错,此项用来关闭报错

postrotate

kill -HUP `cat /var/run/inn.pid`

endscript

nocompress不压缩

}

=====================================================

详细选项解释:

rotate COUNT

轮转COUNT次,也就是最多保留COUNT个轮转备份。

超出的被删除或邮寄。

设置为0,则不保存轮转的老日志。

start COUNT

轮转文件名基于这个数字。

例如,指定0时,原日志文件轮转的备份文件以.0为扩展名,如果指定9,就直接从.9开始跳过0-8

然后再继续向后轮转rotate指定的次数。

compress

默认使用gzip压缩老日志

nocompress

不压缩老日志

compresscmd

指定压缩命令,默认gzip

uncompresscmd

指定解压命令,默认gunzip

compressext

如果启用了压缩,指定在压缩了的日志文件上使用哪个扩展。默认随配置的压缩命令

compressoptions

可以传送命令行选项给压缩程序,默认的gzip使用-9选项(最大压缩率)

delaycompress

延迟到下次轮转时压缩之前的日志文件。

需要与compress项连用,当程序有时不能关闭写日志文件时可使用此项。

nodelaycompress

不延迟压缩

copy

拷贝日志文件,不修改原有文件。

给当前日志文件做快照,或其他工具需要截断或解析文件时,可使用此项

使用此项时,create项就没用了,因为老日志文件占着位置

nocopy

留下原日志文件而不复制

copytruncate

在创建了拷贝后截断原日志文件到0大小,而不是用移动就日志文件再创建新文件的方法。

可用于日志一些程序不关闭日志文件一直写的情况。

注意,在拷贝文件和截断文件时有一个非常小的时间片,所以可能会丢失日志信息。

使用此项时,create无效

nocopytruncate

创建拷贝后不截断原日志文件

create MODE OWNER GROUP

在轮转动作之后,postrotate脚本执行之前,立即使用刚轮转的日志文件名创建日志文件。

MODE 指定日志文件的权限(0660之类)

OWNER 指定日志文件的属主

GROUP 指定日志文件的属组

可省略任何上述属性,省略的属性从原文件继承,可使用nocreate项来关闭

nocreate

不创建新的日志文件

daily

每天轮转日志文件

weekly

如果当前的星期几比上次轮转的星期几少,或者过了一个多星期,就会发生轮转

通常是在每周的第一天轮转,如果logrotate不是每天运行的,会在第一次有机会时进行轮转。

monthly

一月中logrotate第一次运行时进行轮转(通常是一月的第一天)

yearly

如果当前年份不同于上次轮转的年份,则进行日志轮转

dateext

归档旧日志文件时,文件名添加YYYYMMDD形式日期,可用dateformat选项扩展配置。

nodateext

不使用dateext扩展名

dateformat FORMAT_STRING

使用strftime(3)类似的格式指定dateext的格式,只允许%Y %m %d和%s指定符。

默认为 -%Y%m%d。

注意:扩展中分割日志的字符也是日期格式的一部分,

系统时钟需要设置到2001-09-09之后,%s才能正确工作

extension EXT

日志文件可在轮转后使用指定的EXT扩展名。

如果使用压缩,通常EXT后还会加上压缩文件的扩展名,通常是.gz。

例如想把mylog.foo轮转为mylog.1.foo.gz而不是mylog.foo.1.gz

ifempty

默认项,即使日志是空的也进行轮转,覆盖notifempty项

notifempty

如果日志为空,则不进行轮转

include FILE_OR_DIRECTORY

读取include指令下的文件。

如果是目录,在继续处理包含的文件之前,按字母顺序读取目录下大部分文件(只读取普通文件)

目录或管道文件等,还有使用指定扩展名的文件不读取

用tabooext指令定义禁忌扩展名。

include指令不能出现在日志文件定义中。

tabooext [+] LIST

修改当前禁忌扩展名列表。

如果列表前使用了+,表示将LIST加到当前列表中,否则就替换当前列表。

默认包含:.rpmorig, .rpmsave, .v, .swp, .dpkg-dist, .dpkg-old, .dpkg-new, .disabled

mail ADDRESS

当日志轮转超过保留数时,多出的会mail到ADDRESS。

可在log定义中使用nomail指令来不邮寄该log

nomail

不邮寄日志

mailfirst

与mail指令连用,邮寄刚轮转的日志,而不是期满的日志(超出数量要被删除的)

maillast

默认项,与mail连用,邮寄超出rotate数量要被删除的日志。

maxage COUNT

删除COUNT天前的轮转备份。

只在轮转动作时检查日志文件的时间戳。

如果配置了maillast和mail指令,删除的轮转备份会被邮寄。

minsize SIZE

日志文件增长到超过SIZE bytes时进行轮转,但不会在额外指定的时间间隔之前(daily,weekly等)。

相关的size指令与其类似,但size与间隔指令互斥,不考虑时间而直接进行轮转。

而minsize指令要考虑大小和时间戳。

size SIZE

超过SIZE时轮转,SIZE默认单位是KB,可使用M,G来指定MB和GB。

shred

默认关闭

删除文件使用shred -u(销毁)而不是unlink()系统调用。

可确保删除日志后,文件不可读(对磁盘伤害大)。

shredcycles COUNT

调用shred在删除日志文件前覆写COUNT次,不使用此项时,就按shred默认次数覆写。

noshred

删除就文件时不使用shred

missingok

如果日志文件不存在,继续处理下一个文件而不产生报错信息。

nomissingok

默认项,如果日志文件不存在,就产生错误。

olddir DIRECTORY

轮转的日志放到DIRECTORY目录中,目录必须与日志文件在同一物理设备上,

如果没指定绝对路径,则假定该目录在与日志目录下。

noolddir

日志只在它们的当前目录中轮转。

sharedsctipts

通常prerotate和postrotate脚本为每一个轮转的日志运行,也就是说一个单独的脚本可能因为日志轮转定义

中匹配了多个文件时(例如/var/log/news/*),该脚本会运行多次。

指定此项,脚本只对所有匹配的日志文件统一执行一次。

如果匹配的日志都不需要轮转,脚本也不会执行。

如果脚本错误退出,剩下的动作也不会为任何日志执行。

隐含create项,可被nosharedscripts覆盖。

nosharedscripts

默认项

为每一个轮转的日志执行prerotate和postrotate

如果脚本错误退出,剩下的动作只不对影响到的日志执行。

prerotate/endscript

在prerotate和endscript之间的行(他俩自己各占一行),在日志文件被轮转之前并且有需要轮转时,才会执行。

该指令只能用于log文件定义中。

postrotate/endscript

在prerotate和endscript之间的行,在日志文件被轮转之后执行。

该指令只能用于log文件定义中。

firstaction/endscript

在firstaction和endscript之间的行,在轮转所有匹配了通配符的日志被轮转之前,

在prerotate执行之前,并且至少要有一个日志需要被轮转时,才会执行。

只能用于log文件定义中,如果脚本错误退出,就不再继续往下进行。

lastaction/endscript

在lastaction和endscript之间的行,在轮转了所有匹配的日志后,在postrotate执行之后,

并且至少要有一个日志被轮转了的情况下,才会执行。

只能用于log文件定义中,如果脚本错误退出,只显示一个错误信息作为最后的动作。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8144603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存