syslog 和 logrotate
syslogd
简介
syslogd 是 Unix 和类 Unix 系统中用于系统日志记录的标准守护进(daemon),它是系统日志(syslog)协议的主要实现之一。
基本功能
日志收集:接收来自系统内核、应用程序和其他进程的日志消息
日志分类:根据设施(facility)和优先级(priority)对日志进行分类
日志分发:根据配置将日志消息写入本地文件或转发到远程服务器
日志过滤:可以基于各种条件过滤日志消息
主要特性
设施分类:将日志分为 auth, cron, daemon, kern, lpr, mail, news, syslog, user, uucp, local0-local7等不同类别
日志分级:优先级从高到低为:emerg > alert > crit > err > warning > notice > info > debug
灵活配置:通过 /etc/syslog.conf文件配置
网络支持:可以通过 UDP 514 端口接收和发送远程日志
配置文件
典型的 syslogd 配置文件包含如下格式的规则:
facility.priority action
注意事项
每条规则通常占一行
以#开头的行是注释,会被忽略
facility
facility | 说明 |
auth | 安全/授权消息 |
cron | 系统守护进程 |
daemon | 系统守护进程 |
kern | 内核消息 |
lpr | 打印子系统 |
| 邮件系统 |
news | USENET 新闻子系统 |
syslog | syslogd 内部消息 |
user | 通用用户级消息 |
uucp | UUCP 子系统 |
local0-local7 | 本地使用的设施 |
priority
priority | 说明 |
emerg | 系统不可用 |
alert | 需要立即采取行动 |
crit | 严重条件 |
err | 错误条件 |
warning | 警告条件 |
notice | 正常但重要的事件 |
info | 信息性消息 |
debug | 调试级别消息 |
示例配置
# 将所有设施的info及以上级别的消息记录到/var/log/messages*.info /var/log/messages# 将kern设施的debug及以上级别的消息记录到/var/log/kern.logkern.debug /var/log/kern.log# 将mail设施的err及以上级别的消息记录到/var/log/mail.errmail.err /var/log/mail.err# 将所有设施的warning及以上级别的消息转发到远程服务器192.168.1.100*.warning @@192.168.1.100:514# 将所有设施的debug消息丢弃*.debug /dev/null
logrotate
简介
logrotate 是一个 Linux/Unix 系统上的日志管理工具,用于自动轮转(rotate)、压缩、删除和邮寄日志文件,防止日志文件过大占用过多磁盘空间
基本功能
日志轮转:按时间或大小自动创建新的日志文件
日志压缩:可配置对旧日志进行压缩以节省空间
日志清理:删除过期的日志文件
日志邮寄:可选将日志通过邮件发送(不常用)
脚本执行:轮转前后可执行自定义脚本
工作原理
logrotate 通常作为 cron 作业定期运行(通常是每天),检查日志文件是否满足轮转条件,执行配置的操作。
配置文件
典型的 logrotate配置文件包含如下格式的规则:
# 全局配置DIRECTIVES # 指令# 局部配置log_file {DIRECTIVES # 指令}include xxxx # logrotate 支持从文件夹加载配置
注意事项
每个 DIRECTIVES 通常占一行
以#开头的行是注释,会被忽略
局部指令会覆盖全局指令
示例配置
daily # 按天轮询rotate 2 # 最多备份2个日志文件create # 备份后新建日志notifempty # 日志文件为空时不备份nomail # 不发送日志到邮件olddir /var/log/backup/ # 将日志备份到指定目录createolddir # 当 olddir 指定的目录不存在时自动创建它missingok # 日志文件不存在时不报错dateext # 在备份后日志文件名后添加时间compress # 使用 gzip 压缩备份的日志# 针对 /var/log/messages 文件的单独配置
/var/log/messages {maxsize 2M}# 包含指定目录下的配置文件或者指定的配置文件
include /etc/logrotate.d
指令说明
compress
使用 gzip 压缩旧的日志文件。可以减少磁盘占用。
compresscmd
指定用于压缩日志文件的命令。默认是 gzip。
uncompresscmd
指定用于解压缩日志文件的命令。默认是gzip。
compressext
如果启用了压缩,则指定要对压缩日志文件使用的扩展名。缺省值与配置的压缩命令相同。
compressoptions
如果正在使用压缩程序,可以将命令行选项传递给压缩程序。gzip(1)的默认值是“-6”(以牺牲速度为代价偏向于高压缩)。如果使用不同的压缩命令,可能需要更改压缩选项以匹配。
copy
创建日志文件的副本,但不要更改原始文件。当其他实用程序需要截断或解析该文件时可以使用此选项来创建当前日志文件的快照。当使用此选项时,create选项将不起作用,因为旧的日志文件将保留在原位。
copytruncate
在创建副本后,将原始日志文件截断到零大小,而不是移动旧的日志文件并创建一个新文件。当某些程序无法被告知关闭其日志文件,从而可能永远继续写入(追加)到以前的日志文件时,可以使用它。请注意,在复制文件和截断文件之间有一个非常小的时间片,因此可能会丢失一些日志数据。当使用此选项时,create选项将不起作用,因为旧的日志文件将保留在原位。
create
create mode owner group
在旋转之后(在运行postrotate脚本之前)立即创建日志文件(与刚刚旋转的日志文件名称相同)。mode以八进制指定日志文件的权限(与chmod(2)相同),owner指定拥有日志文件的用户名,group指定日志文件所属的组。任何日志文件属性都可以被省略,在这种情况下,新文件的这些属性将使用与原始日志文件中被省略属性相同的值。可以使用nocreate选项禁用此选项。
createolddir
createolddir mode owner group
如果olddir指令指定的目录不存在,则创建该目录。mode以八进制指定olddir目录的模式(与chmod(2)相同),owner指定将拥有olddir目录的用户名,group指定olddir目录所属的组。可以使用nocreateolddir选项禁用此选项。
daily
按天轮询日志文件
dateext
更新旧版本的日志文件,添加日期扩展名,如YYYYMMDD,而不是简单地添加数字。扩展可以使用dateformat和dateyesterday选项进行配置。
dateformat
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月1日是可以的,但2001年1月12日就不行,因为2002年1月11日排序较低。这是因为在使用rotate选项时,logrotate会对所有旋转的文件名进行排序,以找出哪些日志文件较旧,应该删除。
dateyesterday
使用昨天的日期而不是今天的日期来创建日期文本扩展名,以便旋转的日志文件的名称中有一个与其中的时间戳相同的日期。
delaycompress
将前一个日志文件的压缩推迟到下一个旋转周期。这只有在与compress结合使用时才有效果。当某些程序无法被告知关闭其日志文件,因此可能会在一段时间内继续写入前一个日志文件时,可以使用它。
extension
extension ext
带ext扩展名的日志文件可以在轮换后保留。如果使用压缩,压缩扩展名(通常是.gz)出现在ext之后。例如,您有一个名为mylog的日志文件。我想把它旋转到mylog.1.foo.gz而不是mylog.foo.1.gz。
hourly
日志文件每小时轮换一次。请注意,logrotate通常被配置为每天由cron运行。您必须更改此配置并每小时运行logrotate才能真正每小时轮换日志。
addextension
addextension ext
日志文件在旋转后被赋予最终扩展名ext。如果原始文件已经以ext结尾,则扩展名不会重复,而只是移动到末尾,即filename和filenameext都将旋转到filename.1ext。如果使用压缩,ext之后会出现压缩扩展名(通常是.gz)。
ifempty
即使日志文件为空,也会轮换它,覆盖 notifempty选项(ifempty是默认值)。
include
include file_or_directory
指定包含其他配置文件,如果是目录,则包含目录下的所有配置文件
mail address
将日志发送到指定的地址
mailfirst
当使用mail命令时,将发送刚刚旋转的文件,而不是即将过期的文件。
maillast
当使用mail命令时,发送即将过期的文件,而不是刚刚轮换的文件(这是默认值)。
minage
minage count
请勿旋转小于count天的日志。
maxage
maxage count
删除超过<count>天的旋转日志。只有在要旋转日志文件时才检查时间。如果配置了mailast和mail,则将文件发送到配置的地址。
maxsize
maxsize size
当日志文件的大小超过size字节时,即使在额外指定的时间间隔(每天、每周、每月或每年)之前,也会轮换日志文件。相关的大小选项与时间间隔选项相似,只是它与时间间隔选项相互排斥,并且它会导致日志文件被旋转,而不考虑上次旋转的时间。当使用maxsize时,会同时考虑日志文件的大小和时间戳。
minsize
minsize size
当日志文件的大小超过size字节时,将轮换日志文件,但不会在额外指定的时间间隔(每天、每周、每月或每年)之前轮换。相关的大小选项与时间间隔选项相似,只是它与时间间隔选项相互排斥,并且它会导致日志文件被旋转,而不考虑上次旋转的时间。当使用minsize时,会同时考虑日志文件的大小和时间戳。
missingok
如果缺少日志文件,则继续执行下一个日志文件,而不会发出错误消息。参见nomissingok。
monthly
日志文件每月旋转一次,通常是每月的第一天。
nocompress
旧版本的日志文件未被压缩。另请参阅compress
nocopy
不要复制原始日志文件并将其留在原位。(这将覆盖copy选项)。
nocopytruncate
不要在创建副本后就地截断原始日志文件(这会覆盖copytruncate选项)。
nocreate
不会创建新的日志文件(这会覆盖create选项)。
nocreateolddir
当olddir目录不存在时,logrotate不会创建该目录。
nodelaycompress
不要将前一个日志文件的压缩推迟到下一个循环周期(这将覆盖delaycompress选项)。
nodateext
不要在旧的日志文件名添加时间(这会覆盖dateext选项)。
nomail
不要通过邮件发送日志。
nomissingok
如果日志文件不存在,则发出错误。这是默认值
noolddir
日志将在它们原来的目录中轮换(这将覆盖olddir选项)。
nosharedscripts
为每个被旋转的日志文件运行private和postrotate脚本(这是默认设置,并覆盖sharedscripts选项)。日志文件的绝对路径作为第一个参数传递给脚本。如果脚本退出时出现错误,则仅对受影响的日志执行其余操作。
noshred
删除旧的日志文件时,不要使用shred功能。参见shred。
notifempty
如果日志为空,请勿旋转日志(这覆盖了Ifempty 选项)
olddir
olddir directory
日志被移动到目录中进行轮换。除非使用了copy、copytruncate或renamecopy选项,否则该目录必须与要旋转的日志文件位于同一物理设备上。除非指定了绝对路径名,否则假定该目录是相对于保存日志文件的目录的。当使用此选项时,所有旧版本的日志结束在目录。这个选项可以被noolddir选项覆盖。
postrotate/endscript
在旋转日志文件后执行的命令
prerotate/endscript
在旋转日志文件前执行的命令
firstaction/endscript
只有当至少有一个日志被实际旋转之前执行的命令。这些指令只能出现在日志文件定义中。整个模式作为第一个参数传递给脚本。如果脚本退出并出现错误,则不会进行进一步处理。参见lastaction。
lastaction/endscript
在postrotate脚本运行之后,并且只有在至少一个日志被旋转之后执行的命令。这些指令只能出现在日志文件定义中。整个模式作为第一个参数传递给脚本。如果脚本退出时出现错误,则只显示一条错误消息(因为这是最后一个操作)。参见firstaction。
preremove/endscript
在删除日志文件之前执行的命令
rotate
rotate count
日志文件在被删除或邮寄到邮件指令中指定的地址之前将被旋转计数次。如果count为0,旧版本将被删除而不是旋转。默认为0。
renamecopy
日志文件通过添加“.tmp”扩展名被重命名为同一目录下的临时文件名。之后,运行postrotate脚本,并将日志文件从临时文件名复制到最终文件名。这允许使用olddir指令在不同的设备上存储轮换的日志文件。最后,临时文件名被删除。
size
size size
只有当日志文件的大小超过size字节时,才会轮换日志文件。如果size后面跟着k,则假定大小以千字节为单位。如果使用M,则以兆为单位,如果使用G,则以千兆为单位。所以100号、100k号、100M号和100G号都是有效的。
sharedscripts
通常,对每个被旋转的日志运行私有和后旋转脚本,并将日志文件的绝对路径作为脚本的第一个参数传递给该脚本。这意味着一个脚本可能会为匹配多个文件的日志文件条目运行多次(例如/var/log/news/*示例)。如果指定了sharedscripts,则无论有多少日志与通配符模式匹配,脚本都只运行一次,并且将整个模式传递给它们。但是,如果模式中的日志都不需要旋转,则根本不会运行脚本。如果脚本退出时出现错误,则不会对任何日志执行其余操作。该选项覆盖nosharedscripts选项并暗示创建选项。
shred
使用shred -u而不是unlink()删除日志文件。这将确保日志在计划删除后不可读;默认情况下是关闭的。参见noshred。
shredcycles
shredcycles count
要求GNU shred(1)在删除日志文件之前覆盖日志文件计数。如果没有这个选项,将使用shred的默认值。
start
start count
这是用来作为旋转基数的数。例如,如果指定0,则在从原始日志文件旋转日志时,将以.0扩展名创建日志。如果指定9,将使用.9创建日志文件,跳过0-8。文件仍然会按照rotate指令指定的次数旋转。
su
su user group
旋转在该用户和组下设置的日志文件,而不是使用默认用户/组(通常是root)。User表示用于旋转的用户名,group表示用于旋转的组。如果您在这里指定的用户/组没有足够的权限来创建具有您在create指令中指定的所有权的文件,则会导致错误。
tabooext
tabooext [+] list
当前禁忌扩展列表被更改(参见include指令获取禁忌扩展的信息)。如果a +在扩展列表之前,则增加当前禁忌扩展列表,否则将替换当前禁忌扩展列表。在启动时,禁忌扩展列表,v, .cfsaved, .disabled, .dpkg-bak, .dpkg-del, .dpkg-dist, .dpkg-new, .dpkg-old, . rnn -cfg-tmp-*, .rpmnew, .rpmsave, .swp, .ucf-dist, .ucf-new, .ucf-old, ~
taboopat
taboopat [+] list
当前的禁忌全局模式列表被更改(有关禁忌扩展和模式的信息,请参阅include指令)。如果a +在模式列表之前,则增加当前禁忌模式列表,否则替换当前禁忌模式列表。在启动时,禁忌模式列表为空。
weekly
weekly [weekday]
日志文件每个工作日轮换一次,或者如果日期比上次轮换提前至少7天(同时忽略确切的时间)。工作日的解释如下:0表示周日,1表示周一,…, 6表示星期六;特殊值7表示每7天,与工作日无关。如果省略weekday参数,默认为0。
yearly
按年轮换日志文件