命令行手册

Man » logrotate 在线手册 - logrotate 手册页的详细在线文档

🌍
logrotate - 轮转、压缩并邮件发送系统日志

概要

logrotate [--force] [--debug] [--state file] [--skip-state-lock] [--wait-for-state-lock] [--verbose] [--log file] [--mail command] config_file [config_file2 ...]

描述

logrotate 旨在简化生成大量日志文件的系统的管理。

它允许自动轮转、压缩、删除和邮件发送日志文件。每个日志文件可以每天、每周、每月或在日志文件变得太大时进行处理。

通常,logrotate 作为每日 cron 任务运行。除非日志的轮转标准基于日志的大小,并且 logrotate 每天运行多次,或者除非使用 -f 或 --force 选项,否则 logrotate 不会修改日志文件。

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

如果未给出命令行参数,logrotate 将打印版本和版权信息,以及简短的使用摘要。如果在轮转日志时发生任何错误,logrotate 将以非零状态退出,尽管状态文件将被更新。

选项

-f, --force

强制 logrotate 进行轮转,即使它认为这没有必要。有时,在向 logrotate 配置文件添加新条目后,或如果手动删除了旧日志文件,这很有用,因为新的文件将被创建,并且日志记录将正确继续。

-d, --debug

启用调试模式,这意味着不会对日志进行任何更改,并且 logrotate 状态文件不会更新。仅打印调试消息。

-s, --state statefile

告诉 logrotate 使用其他状态文件。如果 logrotate 正在为不同的日志文件集作为不同的用户运行,这很有用。为了防止并行执行,logrotate 默认情况下会对状态文件进行加锁。如果无法获取状态文件的锁,logrotate 将以值 3 退出。默认状态文件是 /var/lib/logrotate/status。如果给定 /dev/null 作为状态文件,则 logrotate 将不会尝试锁定或写入状态文件。


--skip-state-lock
不锁定状态文件,例如,如果不支持或禁止锁定。

--wait-for-state-lock
等待另一个 logrotate 进程释放状态文件的锁。 此选项可能会导致 logrotate 无限期地等待。 请谨慎使用。

-v, --verbose
启用详细模式,例如,在轮换时显示消息。

-l, --log file
告诉 logrotate 将详细输出记录到 log\_file 中。 记录到该文件的详细输出与使用 -v 选项运行 logrotate 时显示的相同。 每次 logrotate 执行时,日志文件都会被覆盖。

-m, --mail command
告诉 logrotate 使用哪个命令来发送日志。 此命令应接受以下参数:

1 使用 '-s subject' 给出的消息的主题
2 收件人。

该命令必须从标准输入读取消息,并将其发送给收件人。 默认邮件命令是 /usr/bin/mail。

--usage
打印简短的使用说明。

-?, --help
打印帮助消息。

--version
显示版本信息。

配置文件

logrotate 从命令行中指定的配置文件系列中读取有关它应该处理的所有日志文件的信息。 每个配置文件可以设置全局选项(本地定义会覆盖全局定义,并且后面的定义会覆盖前面的定义)。全局选项不会影响之前的 include 指令。一个简单的配置文件如下所示:

# 示例 logrotate 配置文件
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 _
size 100k
sharedscripts
postrotate
/usr/bin/killall -HUP httpd
endscript
}

/var/log/news/* {
monthly
rotate 2
olddir /var/log/news/old
missingok
sharedscripts
postrotate
kill -HUP $(cat /var/run/inn.pid)
endscript
nocompress
}

~/log/*.log {}

配置文件的前几行设置全局选项;在示例中,日志在轮换后会被压缩。 请注意,注释可以出现在配置文件的任何位置,只要该行的第一个非空白字符是 #。

值与指令之间用空格和/或可选的 = 分隔。 数字必须以 strtoul(3) 可以理解的格式指定。

配置文件的下一部分定义了如何处理日志文件 /var/log/messages。 该日志将在经过五次每周轮换后被删除。 在日志文件轮换之后(但在压缩旧版本的日志文件之前),将执行命令 /usr/bin/killall -HUP syslogd。

下一部分定义了 /var/log/httpd/access.log 和 /var/log/httpd/error.log 的参数。 每当它们的大小超过 100 千字节时,它们就会被轮换,并且旧的日志文件将被发送(未压缩)到 _,而不是被删除。 sharedscripts 意味着 postrotate 脚本只会为该部分运行一次,而不是为每个轮换的日志文件运行一次。 请注意,日志文件名可以放在引号中(如果名称包含空格,则需要引号)。 正常的 shell 引用规则适用,支持 ', ", 和 \ 字符。


下一节定义了 /var/log/news 中所有文件的参数。每个文件每月进行一次轮转。

最后一部分使用波浪线扩展来轮转当前用户主目录中的日志文件。只有当您的 glob 库支持波浪线扩展时,此功能才可用。GNU glob 支持此功能。

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

请注意,默认情况下,当使用 systemd(1) 时,logrotate.service 文件中设置了 ProtectSystem=full 选项。这会阻止 logrotate 修改 /etc 和 /usr 中的日志。

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

配置文件指令

这些指令可以包含在 logrotate 配置文件中:

轮转

rotate count

日志文件将被轮转 count 次,然后被删除或通过 mail 指令中指定的地址发送。如果 count 为 0,则旧版本将被删除而不是轮转。如果 count 为 -1,则旧日志不会被删除,但会受到 maxage 的影响(谨慎使用,可能会浪费性能和磁盘空间)。默认值为 0。

olddir directory

日志文件将被移动到 directory 中进行轮转。目录必须位于与正在轮转的日志文件相同的物理设备上,除非使用 copy、copytruncate 或 renamecopy 选项。目录被假定为相对于包含日志文件的目录,除非指定了绝对路径。当使用此选项时,所有旧版本的日志都将位于 directory 中。此选项可以被 noolddir 选项覆盖。

noolddir

日志文件将在其通常所在的目录中进行轮转(这将覆盖 olddir 选项)。

su user group

使用指定的 user 和 group 来轮转日志文件,而不是使用默认的 user/group(通常是 root)。user 指定用于轮转的用户,group 指定用于轮转的组(请参阅“用户和组”部分以获取更多信息)。如果您在此处指定的 user/group 没有足够的权限来创建具有您在 create 指令中指定的权限的文件,则会导致错误。如果 logrotate 以 root 权限运行,建议使用 su 指令来轮转位于非特权用户直接或间接控制的目录中的文件。

频率

hourly 日志文件将每小时轮转一次。请注意,通常 logrotate 配置为通过 cron 每天运行(或通过 logrotate.timer 使用 [systemd]({filename}../../systemd)(1))。您必须更改此配置,并以每小时的频率运行 logrotate,才能真正地每小时轮转日志。

daily   日志文件每天轮换一次。

weekly [weekday]
日志文件每周轮换一次,或者自上次轮换以来,日期至少提前 7 天(忽略确切时间)。星期几的解释如下:0 表示星期日,1 表示星期一,...,6 表示星期六;特殊值 7 表示每 7 天轮换一次,无论星期几。如果省略 weekday 参数,则默认为 0。

monthly
日志文件在当月 logrotate 首次运行时进行轮换(通常是在当月的第 1 天)。

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

size size
仅当日志文件增长到超过 size 字节时才进行轮换。如果 size 后跟 k,则大小单位为千字节。如果使用 M,则大小单位为兆字节,如果使用 G,则大小单位为千兆字节。因此,size 100、size 100k、size 100M 和 size 100G 都是有效的。此选项与时间间隔选项互斥,并且它会导致日志文件在未考虑上次轮换时间的情况下进行轮换,如果它在时间标准之后指定,则最后一个指定的选项优先。

文件选择

missingok
如果日志文件丢失,则继续处理下一个文件,而不发出错误消息。请参阅 nomissingok。

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

ignoreduplicates
忽略对日志文件的后续匹配。

ifempty
即使日志文件为空,也进行轮换,从而覆盖 notifempty 选项(ifempty 是默认设置)。

notifempty
如果日志文件为空,则不进行轮换(这会覆盖 ifempty 选项)。

minage count
不要轮换日志文件,除非日志文件至少有 <count> 天的历史。

maxage count
删除超过 <count> 天的已轮换日志。仅当日志文件即将被轮换时才检查其年龄。rotate -1 不会阻止删除。如果配置了 maillast 和 mail,则将文件发送到配置的地址。

minsize size
当日志文件增长到超过 size 字节时进行轮换,但不能在另外指定的时间间隔(daily、weekly、monthly 或 yearly)之前进行轮换。相关的 size 选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件在未考虑上次轮换时间的情况下进行轮换,如果它在时间标准之后指定,则最后一个指定的选项优先。当使用 minsize 时,日志文件的尺寸和时间戳都会被考虑。

maxsize size
即使在另外指定的时间间隔(daily、weekly、monthly 或 yearly)之前,当日志文件增长到超过 size 字节时也进行轮换。相关的 size 选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件在未考虑上次轮换时间的情况下进行轮换,如果它在时间标准之后指定,则最后一个指定的选项优先。当使用 maxsize 时,日志文件的尺寸和时间戳都会被考虑。

tabooext [+] list

当前禁用的文件扩展名列表已更改(有关禁用文件扩展名的信息,请参阅 include 指令)。如果列表前面有一个 + 符号,则当前禁用的文件扩展名列表将被扩展,否则将被替换。在启动时,禁用的文件扩展名列表为: ,v, .bak, .cfsaved, .disabled, .dpkg-bak, .dpkg-del, .dpkg-dist, .dpkg-new, .dpkg-old, .dpkg-tmp, .new, .old, .orig, .rhn-cfg-tmp-*, .rpmnew, .rpmorig, .rpmsave, .swp, .ucf-dist, .ucf-new, .ucf-old, ~

taboopat [+] list

当前禁用的模式列表已更改(有关禁用文件扩展名和模式的信息,请参阅 include 指令)。如果列表前面有一个 + 符号,则当前禁用的模式列表将被扩展,否则将被替换。在启动时,禁用的模式列表为空。

文件和文件夹

create mode owner group, create owner group

日志轮转后(在执行 postrotate 脚本之前),会创建一个新的日志文件(与刚刚轮转的日志文件具有相同的名称)。mode 指定日志文件的模式(以八进制表示,与 chmod(2) 相同),owner 指定将拥有该日志文件的用户,group 指定日志文件所属的组(有关详细信息,请参阅“用户和组”部分)。可以省略任何日志文件属性,在这种情况下,新文件的这些属性将使用原始日志文件中的相同值。可以使用 nocreate 选项禁用此选项。

nocreate

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

createolddir mode [owner [group]], createolddir [owner [group]]

如果 olddir 指令中指定的目录不存在,则会创建该目录。mode 指定 olddir 目录的模式(以八进制表示,与 chmod(2) 相同),owner 指定将拥有 olddir 目录的用户,group 指定 olddir 目录所属的组(有关详细信息,请参阅“用户和组”部分)。如果未指定 mode,则假定为 0755。可以使用 nocreateolddir 选项禁用此选项。

nocreateolddir

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

copy   复制日志文件,但不更改原始文件。此选项可用于创建当前日志文件的快照,或者当其他实用程序需要截断或解析该文件时。当使用此选项时,create 选项将不起作用,因为旧日志文件将保留在原位置。copy 选项允许使用 olddir 指令将轮转的日志文件存储在不同的设备上。

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

copytruncate

在创建副本后,就地将原始日志文件截断为零大小,而不是移动旧日志文件并可选地创建新文件。当无法通知某些程序关闭其日志文件,并且它可能会继续无限期地写入(追加)到先前的日志文件时,可以使用此选项。请注意,在复制文件和截断文件之间存在一个非常小的时刻,因此可能会丢失一些日志数据。如果使用此选项,则 create 选项将不起作用,因为旧日志文件会保留在原位。copytruncate 选项允许使用 olddir 指令将轮换的日志文件存储在不同的设备上。copytruncate 选项隐含 norenamecopy。

nocopytruncate

在创建副本后,不要截断原始日志文件(这会覆盖 copytruncate 选项)。

renamecopy

日志文件将在同一目录中重命名为临时文件名,方法是在文件名中添加“.tmp”扩展名。之后,将运行 postrotate 脚本,并将日志文件从临时文件名复制到最终文件名。最后,删除临时文件名。renamecopy 选项允许使用 olddir 指令将轮换的日志文件存储在不同的设备上。renamecopy 选项隐含 nocopytruncate。

norenamecopy

不要重命名和复制原始日志文件(这会覆盖 renamecopy 选项)。

shred

使用 shred -u 删除日志文件,而不是 unlink()。这应该可以确保在计划删除日志文件后,日志文件将无法读取;默认情况下,此功能处于关闭状态。请参阅 noshred。

noshred

删除旧日志文件时,不要使用 shred。请参阅 shred。

shredcycles count

要求 GNU shred(1) 在删除日志文件之前对其进行 count 次覆盖。如果没有此选项,将使用 shred 的默认设置。

allowhardlink

轮换具有多个硬链接的文件;默认情况下,此功能处于关闭状态。目标文件可能会被清空,例如使用 shred 或 copytruncate。谨慎使用,尤其是在以 root 用户身份轮换日志文件时。

noallowhardlink

不要轮换具有多个硬链接的文件。请参阅 allowhardlink。

压缩

compress

默认情况下,旧版本的日志文件使用 gzip(1) 进行压缩。请参阅 nocompress。

nocompress

旧版本的日志文件不进行压缩。请参阅 compress。

compresscmd

指定用于压缩日志文件的命令。默认值为 gzip(1)。请参阅 compress。

uncompresscmd

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

compressext

指定启用压缩时,要在压缩的日志文件中使用的扩展名。默认值遵循已配置压缩命令的扩展名。

compressoptions

可以传递命令行选项给压缩程序,如果正在使用压缩程序。对于 gzip(1),默认值为“-6”(偏向于高压缩,但牺牲了速度)。如果您使用不同的压缩命令,则可能需要更改 compressoptions 以进行匹配。


delaycompress

将上一个日志文件的压缩推迟到下一个轮转周期。这只有在使用 compress 选项时才有效。当某些程序无法被告知关闭其日志文件,并且可能继续在一段时间内向之前的日志文件写入时,可以使用此选项。

nodelaycompress

不要将上一个日志文件的压缩推迟到下一个轮转周期(这会覆盖 delaycompress 选项)。

文件名

extension ext

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

addextension ext

日志文件在轮转后将获得最终的扩展名 ext。如果原始文件已经以 ext 结尾,则扩展名不会重复,而是简单地移动到末尾,也就是说,filename 和 filenameext 都会被轮转到 filename.1ext。如果使用压缩,则压缩扩展名(通常为 .gz)将出现在 ext 之后。

start count

这是用作轮转基数的数字。例如,如果您指定 0,则日志将以 .0 扩展名创建,然后从原始日志文件轮转。如果您指定 9,日志文件将以 .9 扩展名创建,跳过 0-8。文件仍会轮转指定的 rotate 指令次数。

dateext

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

nodateext

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

dateformat format_string

使用类似于 strftime(3) 函数的语法来指定 dateext 的扩展名。仅允许使用 %Y %m %d %H %M %S %V %s 和 %z 规范。默认值为 -%Y%m%d,但对于每小时轮转,默认值为 -%Y%m%d%H。请注意,分隔日志名称和扩展名的字符也是 dateformat 字符串的一部分。系统时钟必须设置为 2001 年 9 月 9 日之后,%s 才能正常工作。请注意,dateformat 生成的日期戳必须是可按字典顺序排序的(即,首先是年份,然后是月份,然后是日期。例如,2001/12/01 是可以的,但 01/12/2001 就不行,因为 01/11/2002 将排序更低,但它实际上是晚于)。这是因为在使用 rotate 选项时,logrotate 会对所有轮转的文件名进行排序,以找出哪些日志文件较旧,应该删除。

dateyesterday

使用昨天的日期而不是今天的日期来创建 dateext 扩展名,以便轮转的日志文件具有与其内部时间戳相同的日期。


datehourago

使用“小时前”而不是当前日期来创建 dateext 扩展,以便轮换的日志文件在其名称中包含与其中时间戳相同的小时数。 适用于每小时轮换。

邮件

mail address

当日志文件轮换并从系统中删除时,将其通过邮件发送到指定的地址。 如果不需要为特定日志生成邮件,可以使用 nomail 指令。

nomail 不为任何日志文件生成邮件。

mailfirst

使用 mail 命令时,发送刚轮换的文件,而不是即将过期的文件。

maillast

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

附加配置文件

include file_or_directory

读取作为参数给定的文件,并将其作为内联内容包含在出现 include 指令的位置。 如果给定的是一个目录,则大多数在该目录中的文件将按字母顺序读取,然后再继续处理包含该指令的文件。 忽略的文件是不属于常规文件(例如目录和命名管道)以及文件名以 tabooext 或 taboopat 指令中指定的禁用的扩展名或模式结尾的文件。 给定的路径可以以 ~/ 开头,使其相对于执行用户的家目录。 出于安全原因,配置文件不能是组可写或世界可写的。

脚本

sharedscripts

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

nosharedscripts

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

firstaction
script
endscript

该脚本在与通配符模式匹配的所有日志文件在轮换之前运行,并且仅当至少有一个日志文件将实际轮换时才运行,然后再运行 prerotate 脚本。 这些指令只能出现在日志文件定义中。 整个模式作为第一个参数传递给脚本。 如果脚本以错误退出,则不会进行任何进一步的处理。 请参阅 lastaction 和脚本部分。


lastaction
script
endscript

该脚本在所有匹配通配符模式的日志文件旋转完毕、执行 postrotate 脚本之后,并且至少有一个日志文件被旋转后执行一次。这些指令只能出现在日志文件定义中。整个模式将作为脚本的第一个参数传递给脚本。如果脚本以错误退出,则只会显示一条错误消息(因为这是最后的操作)。另请参见 firstaction 和 SCRIPTS 部分。

prerotate
script
endscript

该脚本在日志文件及其旧日志旋转之前执行,并且仅当日志文件将被实际旋转时才执行。这些指令只能出现在日志文件定义中。通常,日志文件的绝对路径作为脚本的第一个参数传递给脚本。如果指定了 sharedscripts,则整个模式将传递给脚本。另请参见 postrotate 和 SCRIPTS 部分。另请参见 sharedscripts 和 nosharedscripts 以了解错误处理。

postrotate
script
endscript

该脚本在日志文件旋转之后、但在日志文件被压缩之前执行。这些指令只能出现在日志文件定义中。通常,日志文件的绝对路径作为脚本的第一个参数传递给脚本,并且最终旋转的日志文件的绝对路径作为脚本的第二个参数传递给脚本。如果指定了 sharedscripts,则整个模式将作为第一个参数传递给脚本,并且省略第二个参数。另请参见 prerotate 和 SCRIPTS 部分。另请参见 sharedscripts 和 nosharedscripts 以了解错误处理。

preremove
script
endscript

该脚本在删除日志文件之前执行一次。logrotate 将要删除的文件的名称作为脚本的第一个参数传递给脚本。另请参见 firstaction 和 SCRIPTS 部分。

SCRIPTS

从起始关键字(例如,prerotate)到 endscript(这两者都必须单独出现在一行中)之间的行将被执行(使用 /bin/sh)。该脚本继承了 logrotate 进程的一些特性,包括 stderr、stdout、当前目录、环境和 umask。脚本以调用用户的身份和组身份运行,而与任何 su 指令无关。如果指定了 --log 标志,则文件描述符 3 是日志文件。当前工作目录是不确定的。

用户和组

用户和组标识符首先尝试使用文本表示形式进行解析,然后在失败的情况下,使用数值进行解析。

文件

/var/lib/logrotate/status   默认状态文件。
/etc/logrotate.conf         配置选项。

参阅

chmod(2), gunzip(1), gzip(1), mail(1), shred(1), strftime(3), strtoul(3), [https://github.com/logrotate/logrotate]

作者

Erik Troan, Preston Brown, Jan Kaluza.

[https://github.com/logrotate/logrotate]