系统日志文件
本节介绍初级管理(LPIC-1)考试 102 的 1.111.3 主题的内容。这个主题的权值为 3。
在本节中,学习如何配置和管理系统日志,包括以下任务:
- 管理日志记录的信息的类型和级别
- 自动地轮替日志文件并进行存档
- 扫描日志文件来了解值得注意的活动
- 监视日志文件
- 调查日志文件中报告的问题
Linux 系统上的系统日志功能可以记录系统日志和捕捉内核消息。日志记录可以在本地系统上执行,也可以发送到远程系统。可以通过 /etc/syslog.conf 配置文件细致地控制日志记录的级别。日志记录由 syslogd
守护进程执行,这个守护进程通常通过 /dev/log 套接字接收输入,见清单 20。
清单 20. /dev/log 是一个套接字
ian@pinguino:~$ ls -l /dev/log srw-rw-rw- 1 root root 0 2007-07-05 15:42 /dev/log |
对于本地日志记录,主要文件常常是 /var/log/messages,但是在大多数系统中还使用其他许多文件,而且可以对这些文件进行定制。例如,可能希望对来自邮件系统的消息使用单独日志文件。
syslog.conf 文件是 syslogd 守护进程的主要配置文件。日志记录基于设施和优先级两方面。定义的设施是 auth(或 security)、authpriv、cron、daemon、ftp、kern、lpr、mail、mark、news、syslog、user、uucp 以及 local0 到 local7。应该使用关键字auth
而不是 security
,关键字 mark
只供内部使用。
优先级如下(按升序排列):
- debug
- info
- notice
- warning(或 warn)
- err(或 error)
- crit
- alert
- emerg(或 panic)
括号中的关键字(warn、error 和 panic)现在已经废弃了。
syslog.conf 中的条目指定日志记录规则。每个规则有一个选择符字段和一个动作字段,它们由一个或多个空格或制表符分隔。选择符字段标识应用这个规则的设施和优先级,动作字段标识对于这个设施和优先级应该采用的日志记录动作。默认的行为是执行指定级别和所有更高级别的动作,但是也可以将日志记录限制在特定的级别。每个选择符由设施和优先级组成(由点号分隔)。对于一个给定的动作,可以指定多个设施,它们之间由逗号分隔。对于一个给定的动作,可以指定多个设施/优先级对,它们之间由分号分隔。清单 21 显示一个简单的 syslog.conf 示例。
清单 21. syslog.conf 示例
# Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log |
注意:
- 与许多配置文件一样,以 # 开头的行和空行被忽略。
- 可以使用 * 表示所有设施或所有优先级。
- 特殊的优先级关键字
none
表示对于这个设施不应该用这个动作记录日志。 - 文件名前面的连字符(比如这个示例中的 -/var/log/maillog)表示日志文件不应该在每次写操作之后进行同步。如果这么做,在系统崩溃时可能会丢失信息,但是对性能有好处。
动作常常被称为 “日志文件”,但是它们不一定是真实的文件。表 9 描述了可能的日志文件。
动作 | 用途 |
---|---|
常规文件 | 指定完整的路径名,以斜线(/)开头。如果在前面加上连字符(-),就会省略每次日志输入之后的文件同步。如果发生系统崩溃,这可能会导致信息丢失,但是可以提高性能。 |
命名管道 | 可以使用 fifo 或命名管道作为日志消息的目标,设置方法是在文件名前面加一个管道符(|)。在启动(或重新启动)syslogd 之前必须使用 mkfifo 命令创建 fifo。有时候使用 fifo 进行调试。 |
终端和控制台 | 一个终端,比如 /dev/console。 |
远程机器 | 要想将消息转发给另一个主机,应该在主机名前面加一个 at(@)符号。注意,接收主机并不向外转发消息。 |
用户的列表 | 要接收消息的用户的逗号分隔的列表(要求用户已经登录)。这里常常包含根用户。 |
登录的每个用户 | 指定星号(*),就会使用 wall 命令通知登录的每个用户。 |
可以在优先级前面加上 !,这表示这个动作不应该应用于这个级别和更高级别。还可以在前面加上 =,这表示这个规则只应用于这个级别;加 != 表示规则应用于除这个级别之外的所有级别。清单 22 给出一些示例,syslog.conf 的手册页提供了更多示例。
清单 22. syslog.conf 示例
# Store all kernel messages in /var/log/kernel. # Send critical and higher ones to remote host pinguino and to the console # Finally, Send info, notice and warning messages to /var/log/kernel-info # kern.* /var/log/kernel kern.crit @pinguino kern.crit /dev/console kern.info;kern.!err /var/log/kernel-info # Store all mail messages except info priority in /var/log/mail. mail.*;mail.!=info /var/log/mail |
由于日志消息的数量可能很大,所以需要能够控制日志文件的大小。这需要使用 logrotate
命令,这个命令通常作为 cron 作业运行。本章后面的 调度作业 一节将讨论 cron 作业。logrotate
命令的运行原理是,定期备份日志文件并开始一个新的日志。保留几代备份,当一个日志到达最后一代时,可以将它存档。例如,可以将它发送给存档用户。
使用 /etc/logrotate.conf 配置文件指定日志应该如何轮替和存档。可以为不同的日志文件指定不同的频率,比如每天、每周或每月,还可以控制代的数量以及何时或是否将副本发送给存档用户。清单 23 给出一个 /etc/logrotate.conf 文件示例。
清单 23. /etc/logrotate.conf 示例
# rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we'll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0664 root utmp rotate 1 } # system-specific logs may be configured here |
logrotate.conf 文件的开头是全局选项。这些是默认设置,如果在别的地方没有指定更特定的设置,就使用这些默认设置。在这个示例中,日志文件每周轮替一次,并保留 4 周的备份。在日志文件轮替时,自动创建一个新的日志文件来替代旧文件。注意,logrotate.conf 文件可以包含来自其他文件的设置。在这个示例中,包含了 /etc/logrotate.d 中的所有文件。
这个示例还包含专门针对 /var/log/wtmp 和 /var/log/btmp 的规则,指定它们每月轮替一次。如果文件不存在,那么并不发出错误消息。创建一个新文件,并只保留一个备份。
在这个示例中,当备份到达最后一代时,就会删除它,因为没有指定其他的处理方法。
注意:/var/log/wtmp 和 /var/log/btmp 文件分别记录成功和不成功的登录尝试。与大多数日志文件不同,这些文件不是纯文本文件。可以使用 last
或 lastb
命令查看它们的内容。关于这些命令的细节,请参考手册页。
日志文件还可以在达到特定的大小时进行备份,还可以通过编写脚本在备份操作之前或之后运行命令。清单 24 给出一个更复杂的示例。
清单 24. 另一个 logrotate 配置示例
/var/log/messages { rotate 5 mail logsave@pinguino size 100k postrotate /usr/bin/killall -HUP syslogd endscript } |
在这个示例中,/var/log/messages 在到达 100KB 之后轮替。保留五个备份,最旧的备份被发送到 logsave@pinguino。postrotate
引入一个脚本,这个脚本在完成轮替之后向 syslogd 守护进程发送一个 HUP 信号,从而重新启动 syslogd 守护进程。endscript
语句用于终止脚本,对于 prerotate
脚本也需要这个语句。更完整的信息参见 logrotate 手册页。
日志文件条目常常带时间戳,并包含报告消息的进程的主机名和进程名。清单 25 显示 /var/log/messages 中的几行,包含来自 gconfd、ntpd、init 和 yum 的条目。
清单 25. 日志文件条目示例
Jul 5 15:28:24 lyrebird gconfd (root-2832): Exiting Jul 5 15:31:06 lyrebird ntpd[2063]: synchronized to 87.98.219.90, stratum 2 Jul 5 15:31:06 lyrebird ntpd[2063]: kernel time sync status change 0001 Jul 5 15:31:24 lyrebird init: Trying to re-exec init Jul 5 15:31:24 lyrebird yum: Updated: libselinux.i386 2.0.14-2.fc7 Jul 5 15:31:24 lyrebird yum: Updated: libsemanage.i386 2.0.3-4.fc7 Jul 5 15:31:25 lyrebird yum: Updated: cups-libs.i386 1.2.11-2.fc7 Jul 5 15:31:25 lyrebird yum: Updated: libXfont.i386 1.2.9-2.fc7 Jul 5 15:31:27 lyrebird yum: Updated: NetworkManager.i386 0.6.5-7.fc7 Jul 5 15:31:27 lyrebird yum: Updated: NetworkManager-glib.i386 0.6.5-7.fc7 |
可以使用分页阅读程序(比如 less
)扫描日志文件,还可以使用 grep
搜索特定的日志条目(比如来自主机 lyrebird 的内核消息),见清单 26。
清单 26. 扫描日志文件
[root@lyrebird ~]# less /var/log/messages [root@lyrebird ~]# grep "lyrebird kernel" /var/log/messages | tail -n 9 Jul 5 15:26:46 lyrebird kernel: Bluetooth: HCI socket layer initialized Jul 5 15:26:46 lyrebird kernel: Bluetooth: L2CAP ver 2.8 Jul 5 15:26:46 lyrebird kernel: Bluetooth: L2CAP socket layer initialized Jul 5 15:26:46 lyrebird kernel: Bluetooth: RFCOMM socket layer initialized Jul 5 15:26:46 lyrebird kernel: Bluetooth: RFCOMM TTY layer initialized Jul 5 15:26:46 lyrebird kernel: Bluetooth: RFCOMM ver 1.8 Jul 5 15:26:46 lyrebird kernel: Bluetooth: HIDP (Human Interface Emulation) ver 1.2 Jul 5 15:26:59 lyrebird kernel: [drm] Initialized drm 1.1.0 20060810 Jul 5 15:26:59 lyrebird kernel: [drm] Initialized i915 1.6.0 20060119 on minor 0 |
有时候需要监视日志文件。例如,可能希望捕捉一个不经常发生的事件。在这种情况下,可以使用 tail
命令和 -f
选项跟踪 日志文件。清单 27 给出一个示例。
清单 27. 跟踪日志文件更新
[root@lyrebird ~]# tail -n 1 -f /var/log/messages Jul 6 15:16:26 lyrebird syslogd 1.4.2: restart. Jul 6 15:16:26 lyrebird kernel: klogd 1.4.2, log source = /proc/kmsg started. Jul 6 15:19:35 lyrebird yum: Updated: samba-common.i386 3.0.25b-2.fc7 Jul 6 15:19:35 lyrebird yum: Updated: procps.i386 3.2.7-14.fc7 Jul 6 15:19:36 lyrebird yum: Updated: samba-client.i386 3.0.25b-2.fc7 Jul 6 15:19:37 lyrebird yum: Updated: libsmbclient.i386 3.0.25b-2.fc7 Jul 6 15:19:46 lyrebird gconfd (ian-3267): Received signal 15, shutting down cleanly Jul 6 15:19:46 lyrebird gconfd (ian-3267): Exiting Jul 6 15:19:57 lyrebird yum: Updated: bluez-gnome.i386 0.8-1.fc7 |
当在日志文件中发现问题时,需要注意产生这个问题的时间、主机名和进程。如果消息提供的信息足以判断问题的原因,那么就解决问题。如果信息不够充分,那么可能需要更新 syslog.conf,为适当的设施记录更多的消息。例如,可能需要显示警告消息之外的信息性消息,甚至是调试级消息。您的应用程序还可能有其他可以使用的设施。
最后,如果需要在日志文件中放上标志,帮助您了解在调试活动的哪个阶段记录了哪些消息,那么可以在终端窗口或 shell 脚本中使用 logger
命令,根据 syslog.conf 中的规则将选择的消息发送给 syslog 守护进程。