系统在运行中可能会产生许多事件,这些事件都会通过日志消息的形式交给日志守护进程。日志守护进程会对这些日志消息进行筛选、分类,然后存放到指定的日志文件中。
RHEL5.3使用的日志服务是syslog(不同发行版本使用的日志服务可能会不同),这是一个标准的日志服务程序,不仅可以记录本地系统产生的消息,还可以记录多个联网的服务器、交换机和路由器等设备的日志。
【日志服务配置文件】
为了了解syslogd日志服务的工作方式,可以查看其配置文件。
[root@localhost ~]# cat /etc/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
上面是系统默认的日志服务syslog的配置文件,以“#”开头的为注释行。
配置文件中的有效行都有一个固定的格式,每一个有效行都以服务、级别(其格式为设备.级别)组成的选择域开始,以文件作为结尾。
【设备】
设备是用于描述消息来源的标识符,即用于筛选某一个应用程序或进程发送的日志消息。
常见的设备及其说明:
kern:来自内核的消息。
mail:来自邮件系统的消息。
auth:与用户登录、验证密码有关的消息。
authpriv:同auth一样,当记录消息时,将消息记录到只有相关用户能读取的文件内。
cron:来自cron任务调度程序的消息。
news:与网络新闻协议NNTP相关的消息。
deamon:某些系统守护进程产生的消息。
lpr:与打印机相关的消息。
mark:定时发送消息的时标进程。
ftp:与ftp守护进程有关的消息。
ntp:与网络时间协议相关的消息。
uucp:与uucp子系统相关的消息。
local0-local7:7种本地类型的消息。
除了以上设备外,还有一些不常见的其他设备(例如使用@表示的主机等)。
提示:如果使用的设备名称为星号“*”,则表示来自所有设备的消息。
【消息级别】
级别是消息的重要标识,借助消息级别,日志守护进程syslogd可以判断消息是否重要。配置文件中可以使用的日志消息级别及其说明:
debug:程序调试级别,除非调试程序,否则不要将日志记录设置为此级别,因为大量的消息会很快充满磁盘。
info:信息消息。
notice:正常但值得引起注意的消息。
warning:警告的消息。
err:错误的消息。
crit:严重的错误消息。
alert:必须要立即采取措施的情况。
emerg:紧急情况,系统可能会无法使用。这个消息会发送给所有正在使用系统的用户。
none:程序中未给出选择的伪级别。
在上面的日志消息级别中,从上到下,情况越来越严重,危险等级越来越高。在配置文件中使用消息级别时,只需要指定消息的最低级别即可。例如指定最低消息级别为err,日志服务筛选时,将会筛选所有危险等级大于和等于此级别的消息。
提示:用户在设置日志消息等级时,通常不要使用err以下的级别,否则可能大量的消息很快就会充满整个磁盘,并且还会引起系统性能下降。
【选择域】
选择域由一个或多个设备和消息级别组成,用于筛选多个设备的消息。
【动作】
动作主要将匹配设备、日志消息级别及选择域的日志消息放入相应的日志文件中。动作位于有效行的行尾,通常是一个文件,例如系统日志文件/var/log/messages。
【工作原理】
日志守护进程的工作原理:日志服务syslogd从应用程序中发送过来的消息中,按配置文件定义的规则进行筛选,将符合条件的日志消息写入配置文件相应的日志文件中。
(1)下面是配置文件中比较典型的两行内容,以此解析:
*.info;mail.none;authpriv.none;cron.none /var/log/messages cron.* /var/log/cron
第1行将所有消息中级别大于info的消息,来自邮件程序、用户验证、系统任务调度程序cron的未定义级别的消息都放入系统日志文件/var/log/messages中。
第2行将所有来自系统任务调度程序cron的消息放入日志文件/var/log/cron中。
(2)syslogd日志服务是一个标准的日志服务器程序,也可以将日志消息发送给其他日志服务器。
例如将日志消息发送到其他日志服务器的配置项如下:
mail.* @192.168.1.10
日志消息记录了系统或应用程序的运行情况,因此管理员有必要时常查看日志,以便获得系统及应用程序过去的运行情况信息。
Linux系统中几乎所有的日志消息都使用了一个固定的格式:
time hostname process version:information
这个固定格式中使用了两种字段分隔符,前面4个字段之间使用的分隔符是空格,最后两个字段之间使用的是冒号“:”。各字段含义如下:
time:产生日志消息的时间。
hostname:产生日志消息的主机名。
process:产生日志的应用程序。如果记录的是应用程序产生的日志,还会记录应用程序的PID。
version:产生此日志的应用程序或系统服务的版本号。
information:日志内容。
例如,查看当前系统中的日志:
[root@localhost ~]# cat /var/log/messages Dec 11 15:34:27 localhost syslogd 1.4.1: restart. Dec 11 15:41:06 localhost kernel: EXT3 FS on sda3, internal journal Dec 11 15:59:38 localhost kernel: VMCIUtil: Updating context id from 0xffffffff to 0xf42d9147 on event 0. Dec 11 19:47:57 localhost kernel: VMCIUtil: Updating context id from 0xf42d9147 to 0xf42d9147 on event 0.
Linux系统提供了一个产生日志消息的命令logger,该命令的功能是提交一条日志消息给日志服务进程。日志服务进程会对日志消息进行筛选,然后写入日志文件。
一个典型的例子:编写与系统相关的脚本时,使用logger命令提交日志消息,让syslogd获取并保存到相应的日志文件中。这样做的目的是将脚本的日志写入系统日志中,以便于日志监视程序并将其及时反馈给管理员。
【命令格式】
logger [option] message
【常用选项】
i:使用logger的PID作为消息的PID。
p:使用指定的选择域。
t:使用指定进程的名称。
【用法示例】
当编写一段较为重要的脚本时,可以使用logger命令将自定义的脚本提示消息写入日志消息中。
例如使用logger命令写入一条日志消息:
[root@localhost ~]# logger -i -p local1.err -t test.sh "This is a test message." [root@localhost ~]# tail -1 /var/log/messages Dec 13 09:11:50 localhost test.sh[30643]: This is a test message.
使用日志更新机制,将日志按时间进行整理,这样就可以解决日志文件过长的问题。这种日志更新机制就是日志轮循。
大多数UNIX和Linux系统中都安装有日志轮循工具,这些工具能够自动更新系统中的日志。在RHEL5.3中,使用的日志轮循工具是logrotate。默认情况下,logrotate以一个工作周为周期,备份旧的日志文件,删除过期的日志文件,并更换一个长度为零的日志文件,以便于日志守护进程重新记录日志。
在系统日志目录/var/log中,有许多logrotate轮循日志时产生的文件。查看系统日志目录中的日志文件如下:
[root@localhost ~]# ls /var/log/ acpid conman.old maillog rpmpkgs spooler.1 anaconda.log cron maillog.1 rpmpkgs.1 spooler.2 anaconda.syslog cron.1 maillog.2 rpmpkgs.2 spooler.3 anaconda.xlog cron.2 maillog.3 rpmpkgs.3 tallylog audit cron.3 messages samba wtmp boot.log cups messages.1 scrollkeeper.log wtmp.1 boot.log.1 dmesg messages.2 secure Xorg.0.log boot.log.2 faillog messages.3 secure.1 Xorg.0.log.old boot.log.3 gdm pm secure.2 yum.log btmp lastlog ppp secure.3 conman mail prelink spooler
在上面的日志文件中,“*.1”、“*.2”、“*.3”等为logrotate按时间顺序产生的日志文件。
日志轮循工具logrotate是通过系统计划任务的方式调度的,可以使用以下命令查看其计划任务的文件:
[root@localhost ~]# ls /etc/cron.daily/ 0anacron cups makewhatis.cron prelink tmpwatch 0logwatch logrotate mlocate.cron rpm [root@localhost ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
从上面的命令输出可以看出,日志轮循程序logrotate每天都会检查其配置文件中的配置,以决定是否要在当天进行日志轮循工作。
提示:通常logrotate只会轮循已经配置过的日志文件。如果要轮循未配置的日志文件,可以修改其配置文件/etc/logrotate.conf,或在目录/etc/logrotate.d中添加新日志文件的轮循方案。
日志监视软件,能够将重要的信息从日志文件中筛选出来,并将这些重要的日志信息汇总产生一个“报表”,及时地将这些“报表”交给管理员,管理员通过这些“报表”就可以获取系统和应用程序的详细信息。
在Linux系统中,有许多优秀的日志监视软件。其中最流行的日志监视软件主要有两个:Logwatch和Swatch。其中Logwatch是REHL5.3中默认安装的日志监视软件。
默认情况下,RHEL5.3中的日志监视软件Logwatch会统计每天产生的日志信息,并以邮件的形式将统计后的日志信息发送给root用户。root用户只需要通过查看这些邮件就可以了解系统一整天的基本情况。
有时候管理员需要立即查看所有日志文件,这是可以使用Logwatch立即扫描日志文件产生监视信息:
[root@localhost ~]# logwatch --print ################### Logwatch 7.3 (03/24/06) #################### Processing Initiated: Fri Dec 13 10:05:09 2013 Date Range Processed: yesterday ( 2013-Dec-12 ) Period is day. Detail Level of Output: 0 Type of Output: unformatted Logfiles for Host: localhost.localdomain ################################################################## --------------------- Cron Begin ------------------------ Attempt to use crontab by unauthorized users: li : 1 Time(s) zhu : 2 Time(s) ---------------------- Cron End ------------------------- --------------------- pam_unix Begin ------------------------ remote: Unknown Entries: session closed for user zhu: 4 Time(s) session opened for user zhu by (uid=0): 4 Time(s) authentication failure; logname= uid=0 euid=0 tty=pts/0 ruser= rhost=192.168.1.10 user=zhu: 1 Time(s) bad username []: 1 Time(s) session closed for user li: 1 Time(s) session opened for user li by (uid=0): 1 Time(s) ---------------------- pam_unix End ------------------------- --------------------- Connections (secure-log) Begin ------------------------ Failed logins: User zhu: 192.168.1.10: 1 Time(s) User Login's: li : 1 Time(s) zhu : 4 Time(s) Userhelper executed applications: root -> system-config-securitylevel.py as root: 2 Time(s) **Unmatched Entries** login: pam_succeed_if(remote:auth): error retrieving information about user login: FAILED LOGIN 2 FROM 192.168.1.10 FOR , User not known to the underlying authentication module ---------------------- Connections (secure-log) End ------------------------- --------------------- Disk Space Begin ------------------------ Filesystem Size Used Avail Use% Mounted on /dev/sda2 3.8G 2.3G 1.4G 64% / /dev/sda3 9.8G 153M 9.1G 2% /home /dev/sda1 46M 11M 34M 24% /boot ---------------------- Disk Space End ------------------------- ###################### Logwatch End #########################