「logrotate(8)」-

轮转、压缩、邮寄系统日志

命令语法格式

logrotate [-dv] [-f|–force] [-s|–state file] config_file …

命令描述

命令logrotate旨在简化对生成大量日志文件的系统的管理。它允许自动旋转,压缩,删除,邮寄日志文件。每个日志文件可以每天,每周,每月或当它变得太大时处理。

通常,由每日cron作业运行logrotate命令。它不会在一天内多次修改日志,除非该日志的标准基于日志的大小,并且logrotate每天运行多次,或者除非使用-f或–force选项。

可以在命令行上给出任意数量的配置文件。以后的配置文件可能会覆盖先前文件中给出的选项,因此列出logrotate配置文件的顺序非常重要。通常,应使用单个配置文件,然后其中包含(include)所需的任何其他配置文件的。有关如何使用include指令来完成此操作的更多信息,请参见下文。如果在命令行上给出了目录,则该目录中的每个文件都将用作配置文件。

如果没有给出命令行参数,logrotate将打印版本和版权信息,以及简短的使用摘要。如果在旋转日志时发生任何错误,logrotate将以非零状态退出。

命令行选项

-f, –force
告诉logrotate强制旋转,即使它不认为这是必要的。 有时,在将新条目添加到logrotate配置文件后,或者如果旧的日志文件已被手动删除,这将有用,因为将创建新文件,并且日志记录将正确继续。

-l <log_file>
告诉logrotate将详细输出记录到log_file中。 记录到该文件的详细输出与使用-v switch运行logrotate时相同。 每次logrotate执行时都会覆盖日志文件。

-m, –mail <command>
告诉logrotate在邮寄日志时使用哪个命令。 此command应接受两个参数:1)消息的主题,以及2)接收者。 然后,该命令必须读取标准输入上的消息,并将其邮寄给收件人。默认邮件命令是/bin/mail -s

-s, –state <statefile>
告诉logrotate使用备用状态文件。 如果logrotate作为各种日志文件集的不同用户运行,这将非常有用。 默认状态文件是/var/lib/logrotate/status

-d, –debug
打开调试模式,并隐含-v选项。 在调试模式下,不会对日志或logrotate状态文件进行任何更改。

-v, –verbose
打开详细模式。即在旋转期间显示消息。

-?, –help
显示帮助信息。

–usage
显示简短的使用信息。

配置文件格式

命令logrotate从配置文件中读取应该处理的日志文件的所有内容,这些配置文件是从命令行中指定的。每个配置文件都可以设置全局选项(本地定义覆盖全局选项,后面的定义覆盖之前的定义)并指定要旋转的日志文件。 一个简单的配置文件如下所示:

# sample logrotate configuration file

compress

/var/log/messages {
rotate 5

weekly

postrotate
/usr/bin/killall -HUP syslogd
endscript
}

“/var/log/httpd/access.log” /var/log/httpd/error.log {
rotate 5

mail www@my.org

size 100k

sharedscripts

postrotate
/usr/bin/killall -HUP httpd
endscript
}

/var/log/news/* {
monthly

rotate 2

olddir /var/log/news/old

missingok

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

nocompress
}

~/log/*.log {}

前几行设定了全局选项;在示例中,日志在旋转后会被压缩(compress)。请注意,只要行上的第一个非空白字符是“#”,注释就可以出现在配置文件中的任何位置。

通过空格( )和斜线(/),或可选等号(=)将值与指令分开。必须以strtoul(3)理解的格式指定数字值。

下一部分定义了如何处理日志文件/var/log/messages。在删除之前,日志将经历五周轮换。在旋转日志文件之后(但在压缩旧版本的日志之前),将执行/sbin/killall -HUP syslogd命令。

下一部分定义/var/log/httpd/access.log和/var/log/httpd/error.log的参数。每当它的大小超过100k时,每个都会轮转,旧的日志文件在经过5次轮转后被邮寄(未压缩)到www@my.org,而不是被删除。 sharedscripts意味着postrotate脚本将只运行一次(在旧日志被压缩之后),而不是每个被轮转的日志运行一次。请注意,日志文件名可以用引号括起来(如果名称包含空格,则需要引号)。适用普通Shell引用规则,支持“,”和“\”字符。

下一部分定义/var/log/news/中所有文件的参数。每个文件按月轮转。这被视为单个旋转指令,如果多个文件发生错误,则不会压缩日志文件。

最后一部分使用波“浪号展开”来轮转当前用户主目录中的日志文件。如果您的glob库支持波浪扩展,则此选项仅可用。 GNU glob确实支持这一点。

请谨慎使用通配符。如果指定*,则logrotate将旋转所有文件,包括先前旋转的文件。解决这个问题的方法是使用olddir指令或更精确的通配符(例如* .log)。

配置文件指令

以下是有关可能包含在logrotate配置文件中的指令的更多信息:

根据时间轮转

daily
日志文件每天都会轮换。

hourly
日志文件每小时轮换一次。 请注意,通常logrotate配置为每天由cron运行。 您必须更改此配置并每小时运行logrotate才能真正每小时轮换一次日志。

weekly
如果当前工作日小于上次轮换的工作日或者自上次轮换以来已过去一周以上,则会轮换日志文件。 这通常与在一周的第一天旋转日志相同,但如果每晚不运行logrotate,它会更好。

monthly
第一次运行logrotate时,日志文件会在一个月内轮换(通常在每月的第一天)。

yearly
如果当前年份与上次轮换不同,则会轮换日志文件。

根据大小轮转

size size
仅当日志文件长度大于size字节时,才会轮换日志文件。 如果大小后跟k,则假定大小以千字节为单位。 如果使用M,则大小以兆字节为单位,如果使用G,则大小为千兆字节。因此100,100k,100M,100G都是有效的。

maxsize size
即使在额外指定的时间间隔(daily, weekly, monthly, or yearly)之前,日志文件在大于size字节时也会轮换。 相关size选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件被旋转而不考虑最后的旋转时间。 使用maxsize时,将考虑日志文件的大小和时间戳。

minsize size
日志文件在大于size字节时会轮换,但不会在额外指定的时间间隔(每日,每周,每月或每年)之前轮换。 相关size选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件被旋转而不考虑最后的旋转时间。 使用minsize时,会考虑日志文件的大小和时间戳。

压缩

compress
旧版本的日志文件默认使用gzip(1)进行压缩。 另见nocompress。

nocompress
旧版本的日志文件未压缩。 另见compress。

compresscmd
指定用于压缩日志文件的命令。 默认值为gzip(1)。 另见compress。

uncompresscmd
指定用于解压缩日志文件的命令。 默认值为gunzip(1)。

compressext
如果启用了压缩,则指定在压缩日志文件上使用的扩展名。 默认值遵循已配置的压缩命令的默认值。

compressoptions
如果正在使用命令行选项,则可以将命令行选项传递给压缩程序。 对于gzip(1),默认值为“-6”(以速度为代价偏向于高压缩)。如果使用其他压缩命令,则可能需要更改compressoptions以匹配。

delaycompress
将先前日志文件的压缩推迟到下一个循环周期。这仅在与compress组合使用时才有效。 当某些程序无法被告知关闭其日志文件时可以使用它,因此可能会继续写入先前的日志文件一段时间。

nodelaycompress
不要将先前日志文件的压缩推迟到下一个循环周期(这会覆盖delaycompress选项)。

复制

copy
制作日志文件的副本,但不要更改原始文件。 例如,可以使用此选项创建当前日志文件的快照,或者某些其他程序需要截断或解析文件时使用此选项。 使用此选项时,create选项将不起作用,因为旧的日志文件保持不变。

nocopy
请勿复制原始日志文件,并将其保留在原位。(这会覆盖复制选项)。

copytruncate
创建副本后,将原始日志文件截断为零大小,而不是移动旧日志文件并选择创建新日志文件。 当某些程序无法被告知关闭其日志文件时可以使用它,因此可以继续永久地写入(追加)到前一个日志文件。 请注意,复制文件和截断文件之间的时间片非常小,因此某些日志记录数据可能会丢失。 使用此选项时,create选项将不起作用,因为旧的日志文件保持不变。

nocopytruncate
创建副本后,请勿截断原始日志文件(这将覆盖copytruncate选项)。

权限

create mode owner group, create owner group
在旋转之后(在运行postrotate脚本之前),立即创建日志文件(与刚刚旋转的日志文件同名)。 mode以八进制指定日志文件的模式(与chmod(2)相同);owner指定将拥有日志文件的用户名;group指定日志文件将属于的组。 可以省略任何日志文件属性,在这种情况下,新文件的那些属性将使用与原始日志文件相同的值来表示省略的属性。 可以使用nocreate选项禁用此选项。

nocreate
不会创建新的日志文件(这会覆盖create选项)。

createolddir mode owner group
如果olddir指令指定的目录不存在,则创建该目录。 mode以八进制指定olddir目录的模式(与chmod(2)相同),owner指定将拥有olddir目录的用户名,group指定olddir目录将属于的组。 可以使用nocreateolddir选项禁用此选项。

nocreateolddir
目录olddir不存在时,logrotate不会创建。

扩展名

extension ext
具有ext扩展名的日志文件可以在旋转后保留它。 如果使用compress,则在ext之后出现压缩扩展(通常为.gz)。 例如,您有一个名为mylog.foo的日志文件,并希望将其旋转到mylog.1.foo.gz,而不是mylog.foo.1.gz。

dateext
存档旧版本的日志文件,添加日期扩展名,如YYYYMMDD,而不是简单地添加数字。 可以使用dateformat和dateyesterday选项配置扩展名。

dateformat format_string
使用与strftime(3)函数类似的表示法指定dateext的扩展名。 仅允许%Y %m %d %H %M %S %V %s说明符。 默认值为-%Y%m%d除了每小时,它使用-%Y%m%d%H作为默认值。 请注意,将日志名称与扩展名分隔开的字符也是dateformat字符串的一部分。 系统时钟必须在2001年9月9日之后设置,以便%s正常工作。 请注意,此格式生成的日期戳必须是词法可排序的(即,首先是年份,然后是月份,然后是当天。例如,2001/12/01是好的,但01/12/2001不是,尽管01/11/2002较晚,但是排序会靠前)。 这是因为在使用rotate选项时,logrotate会对所有旋转的文件名进行排序,以找出哪些日志文件较旧并应删除。

dateyesterday
使用昨天来创建日期文本扩展名,而不是今天的日期,以便旋转的日志文件在其名称中的日期与其中的时间戳相同。

addextension ext
日志文件在轮换后被赋予最终扩展名ext。 如果原始文件已经以ext结尾,则扩展名不会重复,而只是移动到最后,即filename和filenameext都将被旋转到filename1.ext。 如果使用压缩,则在ext之后出现压缩扩展(通常为.gz)。

发送邮件

mail address
当轮转的日志不存在时,它会邮寄到address地址。 如果特定日志不应生成邮件,则可以使用nomail指令。

nomail
不要将旧日志文件邮寄到任何地址。

mailfirst
使用mail命令时,邮件刚刚轮换的文件,而不是即将到期的文件。

maillast
使用mail命令时,请发送即将到期的文件,而不是刚刚轮换的文件(这是默认设置)。

执行脚本

postrotate/endscript
在旋转日志文件后,将执行postrotate和endscript之间的行(两者必须单独出现在行上)(使用/bin/sh)。 这些指令可能只出现在日志文件定义中。 通常,日志文件的绝对路径作为第一个参数传递给脚本。 如果指定了sharedscripts,则将整个模式传递给脚本。 另见prerotate。 有关错误处理,请参阅sharedscripts和nosharedscripts。

prerotate/endscript
在prerotate和endscript之间的行(两者必须单独出现在行上)在日志文件旋转之前执行(使用/bin/sh),并且只有在实际旋转日志时才执行。 这些指令可能只出现在日志文件定义中。 通常,日志文件的绝对路径作为第一个参数传递给脚本。 如果指定了sharedscripts,则将整个模式传递给脚本。 另见postrotate。 有关错误处理,请参阅sharedscripts和nosharedscripts。

firstaction/endscript
在运行prerotate脚本之前,只有当至少一个日志文件被旋转时,才会执行firstaction和endscript之间的行(两者都必须单独出现在行上)(使用/bin/sh) 日志实际上会被轮换。 这些指令可能只出现在日志文件定义中。 整个模式作为第一个参数传递给脚本。 如果脚本退出时出错,则不进行进一步处理。 另见lastaction。

lastaction/endscript
在运行postrotate脚本之后,在所有与通配模式匹配的日志文件被轮换之后,lastaction和endscript之间的行(两者都必须单独出现在行上)执行(使用/bin/sh)并且仅在至少一个日志已旋转。 这些指令可能只出现在日志文件定义中。 整个模式作为第一个参数传递给脚本。 如果脚本退出时出错,则只显示错误消息(因为这是最后一个操作)。 另见firstaction。

preremove/endscript
在preremove和endscript之间的行(两者必须单独出现在行上)在删除日志文件之前执行一次(使用/bin/sh)。 logrotate将传递即将删除的文件名。 另见firstaction。

其他指令

ifempty
即使它是空的,也要旋转日志文件,覆盖notifempty选项(ifempty是默认值)。

notifempty
如果日志为空,请不要旋转日志(这会覆盖ifempty选项)。

include file_or_directory
读取作为参数给出的文件,就好像它包含在include指令出现的位置一样。 如果给出了目录,则在继续处理包含文件之前,将按字母顺序读取该目录中的大多数文件。唯一被忽略的文件是:不是常规文件的文件(例如目录和命名管道);文件名以禁用扩展或模式之一结尾的文件,禁用的扩展和模式由tabooext或taboopat指令指定。

minage count
不要旋转小于<count>天的日志。

maxage count
删除早于<count>天的旋转日志。 仅在要旋转日志文件时检查年龄。 如果配置了maillast和mail,则文件将邮寄到配置的地址。

missingok
如果缺少日志文件,请继续执行下一个日志文件而不发出错误消息。 另见nomissingok指令。

nodateext
不要使用日期扩展名归档旧版本的日志文件(这会覆盖dateext选项)。

nomissingok
如果日志文件不存在,则发出错误。 这是默认值。

noolddir
日志在它们通常驻留的目录中轮换(这将覆盖olddir选项)。

nosharedscripts
为每个被轮换的日志文件运行prerotate和postrotate脚本(这是默认值,并覆盖sharedscripts选项)。 日志文件的绝对路径作为第一个参数传递给脚本。 如果脚本以错误退出,则不会仅对受影响的日志执行其余操作。

olddir directory
日志将移动到目录directory中以进行轮换。 除非使用copy,copytruncate,renamecopy选项,否则该directory必须与正在旋转的日志文件位于同一物理设备上。除非指定了绝对路径名,否则假定该directory相对于保存日志文件的目录。 使用此选项时,所有旧版本的日志都会在directory中结束。 noolddir选项可以覆盖此选项。

rotate count
日志文件在被删除或邮寄到mail指令中指定的地址之前会被轮换计数次数。 如果count为0,则删除旧版本而不是旋转。 默认值为0。

renamecopy
通过向其添加“.tmp”扩展名,将日志文件重命名为同一目录中的临时文件名。 之后,运行postrotate脚本并将日志文件从临时文件名复制到最终文件名。 这允许使用olddir指令将旋转的日志文件存储在不同的设备上。 最后,删除临时文件名。

sharedscripts
通常,为每个旋转的日志运行prerotate和postrotate脚本,并将日志文件的绝对路径作为第一个参数传递给脚本。 这意味着可以为匹配多个文件的日志文件条目多次运行单个脚本(例如/var/log/news/*示例)。 如果指定了sharedscripts,则无论有多少日志与通配符模式匹配,脚本都只运行一次,并将整个模式传递给它们。 但是,如果模式中的任何日志都不需要旋转,则根本不会运行脚本。 如果脚本以错误退出,则不会对任何日志执行其余操作。 此选项会覆盖nosharedscripts选项,并隐含create选项。

shred
使用shred -u而不是unlink()删除日志文件。 这应确保日志在计划删除后无法读取; 这是默认关闭。 另见noshred。

noshred
删除旧日志文件时不要使用shred。 另见shred。

shredcycles count
要求GNU shred(1)在删除之前覆盖日志文件计数次数。 如果没有此选项,将使用shred的默认值。

start count
这是用作旋转基础的数字。 例如,如果指定0,则在从原始日志文件中旋转日志时,将使用.0扩展名创建日志。 如果指定9,则将使用.9创建日志文件,跳过0-8。 文件仍将按照rotate指令指定的次数旋转。

su user group
旋转在此user和group下设置的日志文件,而不是使用默认用户/组(通常为root)。 user指定用于旋转的用户名,group指定用于旋转的组。 如果您在此处指定的用户/组,没有足够的权限来创建具有您在create指令中指定的所有权的文件,则会导致错误。

tabooext [+] list
当前禁忌扩展名列表已更改(有关禁忌扩展名的信息,请参阅include指令)。 如果“+”在扩展列表之前,则会扩充当前禁忌扩展名列表,否则将替换它。 在启动时,禁忌扩展名列表包含:.rpmsave, .rpmorig, ~, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf-new, .rpmnew, .swp, .cfsaved, .rhn-cfg-tmp-*

taboopat [+] list
当前的禁忌glob模式列表已更改(有关禁忌扩展和模式的信息,请参阅include指令)。 如果“+”在模式列表之前,则会增加当前禁忌模式列表,否则将替换它。 启动时,禁忌模式列表为空。

相关文件

/var/lib/logrotate/status
默认的状态文件。

/etc/logrotate.conf
配置选项。

相关手册

gzip(1)

https://github.com/logrotate/logrotate

参考文献

  • man 8 logrotate, Version 3.11.0-0.1

更新日志

  • 10/24/2018 创建文章