常用日志

/var/log/boot.log

启动的时候系统内核会检测并启动硬件,然后启动内核的功能。这些流程都会记录在 /var/log/boot.log 里。该文件只保留 本次启动的信息,不记录上一次启动的信息。

/var/log/cron

crontab 计划任务 日志。

/var/log/dmesg

CentOS 在启动时默认不显示 内核的硬件检测信息,都保存在该日志。

/var/log/lastlog

记录所有帐号最近一次登陆系统的信息

/var/log/maillog/var/log/mail/\*

邮件的往来信息,主要是 postfix (SMTP 协议提供者)与 dovecot(POP3 协议提供者)所产生的信息。

/var/log/messages

用于保存有价值的、非调试的、非关键的消息,即系统的普通活动日志。

/var/log/secure

用于追踪认证系统,所有与安全相关的消息,sudo login,SSH login 等其它登陆错误

/var/log/wtmp

成功登陆系统的帐号

/var/log/faillog

登陆失败的帐号

/var/log/httpd/

apache 服务日志

/var/log/samba/

samba 服务日志

日志的滚动

LOGROTATE

日志滚动的设计是为了简化日志管理的工作,控制无休止生成的大量日志。

日志滚动可以实现自动 滚动、压缩、删除、发邮件。滚动的频率要么是按 日、周、月,要么是日志 达到一定大小 时处理。

实现原理

logrotate 程序是依靠 cron 来实现计划任务的,系统一般把日志滚动作为计划任务来运行,通常每天进行一次。脚本大多位于 /etc/cron.daily/logrotate。如果需要更高的滚动频率,也可以把脚本放到 /etc/cron.hourly 目录。

当 logrotate 运行时,它会读取配置文件,以了解日志文件的位置、滚动频率、保留归档日志的数量。

日志滚动示意图

主配置文件

logrotate 通常由主配置文件 /etc/logrotate.conf 统一管理,它会用 include 语句把 /etc/logrotate.d/ 目录中的所有其它需要的配置文件全部包含进来。

/etc/logrotate.d 目录是专门为 /etc/logrotate.conf 规划出来的。每个以 RPM 包方式创建的服务,都会把其日志的配置文件,放到该目录。

配置文件指令

用几个例子解释各指令。

配置文件默认值:

weekly			# 每周滚动一次
rotate 4		# 保留 4 个日志文件
create			# 原日志更名后新建空日志
dateext			# 旧日志用日期做文件名
#compress	# 压缩旧日志

include /etc/logrotate.d	# 加载该目录下所有配置文件

/var/log/wtmp {			# 针对 /var/log/wtmp 该日志文件单独设定参数
    monthly						# 每月一次滚动
    create 0664 root utmp		# 新建文件的权限,用户,组
    minsize 1M					# 日志超过 1M 才进行滚动
    rotate 1					# 只保留一个日志文件
}
加载指定目录中的配置

include /etc/logrotate.d

滚动频率
每天

daily 每周滚动一次

每周

weekly 每周滚动一次

每月

monthly 每月滚动一次

每年

yearly 每年滚动一次

滚动条件判断
超过限定的大小

minsize 1M 日志超过 1M 才进行滚动,直到开始滚动时才会检查。与时间间隔不冲突。

size 10M 与时间间隔是互斥的。仅根据文件大小来判断是否滚动,只要文件大小满足,马上滚动,不考虑是否到达时间间隔。

空文件也滚动

ifempty 即使日志文件是空的,也要滚动。

如果有日志丢失也继续滚动

missingok

滚动前操作
全局滚动前操作
firstaction
......
......
endscript

介于 firstaction 和 endscript 之间的各行命令,会在所有日志滚动开始之前最先执行。

特定日志滚动前操作
prerotate
......
......
endscript

介于 prerotate 和 endscript 之间的各行命令,会在滚动开始之前执行,如修改日志属性。对于已加上隐藏属性的文件特别必要。

只能用于特定日志文件的定义中,如果日志文件有多个,这些命令会运行多次。

通常会在 prerotate 之前加上 sharedscripts ,以便所有文件只执行一次脚本,而不是多次。

滚动后操作
全局滚动后操作
lasstaction
......
......
endscript

介于 lastaction 和 endscript 之间的各行命令,会在所有日志滚动结束之后最后执行。

特定日志滚动后操作
postrotate
......
......
endscript

介于 postrotate 和 endscript 之间的各行命令,会在滚动完成之后执行,如重启某服务。对于已加上隐藏属性的文件特别必要。

只能用于特定日志文件的定义中,如果日志文件有多个,这些命令会运行多次。

通常会在 postrotate 之前加上 sharedscripts ,以便所有文件只执行一次脚本,而不是多次。

旧文件操作
保留

rotate 4 保留 4 个日志文件

压缩

compress 压缩 旧日志,默认用 gzip 压缩

delaycompress 延迟压缩。本次滚动产生的旧文件,要到下次滚动时才会压缩。因为有时有些程序暂时无法关闭日志文件,需要持续向日志文件写入一段时间。

compressext .xz 指定压缩文件的 后缀

compresscmd /usr/bin/xz 指定使用的 压缩命令

uncompresscmd /usr/bin/unxz 指定 解压缩命令

compressoptions -9 指定 压缩比,默认为 -9,即最大压缩比

nocompress 不压缩旧日志

复制

copy 生成旧文件副本,但 不修改旧文件 本身。使用该指令时,create 失效。

nocopy 不复制原始旧文件,会覆盖 copy

copytruncate 生成旧文件副本后,直接修改旧文件。使用该指令时,create 失效。

nocopytruncate 生成旧文件副本后,不要直接修改旧文件,会覆盖 copytruncate

重命名

dateext 旧日志 用日期做文件名,会在原文件名后面加上格式为 -20180609 的字符串。

dateformat -%Y-%m-%d-%s 需要与 dateext 配合使用,自定义日期格式。

只能使用 %Y%m%d%s,而且必须遵守年、月、日的先后顺序,因为 logrotate 会按第一个字段来排序,来判断哪个是旧的,再予以删除。

extension foo 指定在滚动日志时需要保留的后缀,mylog.foo 在滚动后会重命名为 mylog.1.foo.gz,而不是 mylog.foo.1.gz

移动

olddir /home/neo/logs 把旧日志文件移动到指定目录中滚动。

删除

maxage 100 超过 100 天的旧日志将被删除。只有在开始滚动日志时才会检查。如果配置了 mailmaillast,这些文件就会被做为附件发邮件给管理员。

shredshred -u 来删除文件,而不是用 unlink(),这样删除的比较彻底、安全。

新文件
新建

create 滚动后,新建 空日志

nocreate 滚动后,不要新建空日志,会覆盖 create

属性

create 0664 root utmp 新建空日志的 权限所有者属组

发邮件
给特定邮箱发邮件

mail imhawkz@gmail.com

邮件内容为刚刚滚动的日志

mailfirst

邮件内容为快要过期的文件

maillast

配置特定日志
日志绝对路径  {		# 可以用空格分隔多个日志
    参数设置1
	参数设置2
	执行脚本
	...
}

执行脚本部分可调用外部指令来执行额外的命令,需用 sharedscripts .... endscript 标签包围。

配置范例

只对 /var/log/ 内的 cron, maillog, messages, secure, spooler 这几个日志文件有效。

日志滚动每周一次,保留四个,滚动下来的日志不压缩,滚动完毕后获取 syslog 的 PID,用 kill -HUP 重启 syslogd。

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
    {
        sharedscripts
        prerotate
        	/usr/bin/chattr -a /var/log/messages
        endscript
        sharedscripts
        postrotate
            /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
            /usr/bin/chattr +a /var/log/messages
        endscript
    }

/bin/kill -HUP 会让 rsyslogd 重启并读取其配置文件。