12.2 syslog日志
syslog是一个被UNIX和Linux广泛使用的日志系统,Linux系统中大部分的日志文件都是通过它进行管理的。本节将对syslog的功能及配置、日志文件的查看和管理,以及syslog中默认配置的日志文件进行介绍。
12.2.1 syslog简介
syslog是一个历史悠久的日志系统,几乎所有的UNIX和Linux操作系统都是采用syslog进行系统日志的管理和配置。Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息。这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。而执行这个过程的程序就是syslog。syslog可以根据信息的来源以及信息的重要程度将信息保存到不同的日志文件中,例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。在默认的syslog配置下,日志文件通常都保存在“/var/log”目录下。syslog的守护进程为syslogd,系统启动时,默认会自动运行syslogd守护进程,如图12.5所示。
图12.5 syslog守护进程
如果要手工启动,可以使用如下命令:
/sbin/syslogd
在修改syslog配置后,需要重新启动syslogd守护进程才能使新的配置生效。其命令如下所示。
# killall -HUP syslogd
Red Hat Enterprise Linux
5.2安装后默认就已经在syslog中定义了一些日志文件,这些日志的位置以及它们的说明如表12.2所示。
表12.2 默认配置syslog日志
日 志 文 件
说 明
/var/log/message
系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure
与安全相关的日志信息
/var/log/maillog
与邮件相关的日志信息
/var/log/cron
与定时任务相关的日志信息
/var/log/spooler
与UUCP和news设备相关的日志信息
/var/log/boot.log
守护进程启动和停止相关的日志消息
12.2.2 syslog配置
syslog的配置文件为/etc/syslog.conf,在该文件中指定了syslog记录日志的信息来源、信息类型以及保存位置。下面是该文件内容的一个实例。
# 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级别的信息记录到/var/log/messages日志文件中
*
.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
# 把所有授权信息记录到/var/log/secure日志文件中
authpriv.* /var/log/secure
# Log all the mail messages in one place.
# 把所有级别的邮件信息记录到/var/log/maillog日志文件中
mail.* -/var/log/maillog
# Log cron stuff
# 把所有级别的定时任务信息记录到/var/log/cron日志文件中
cron.* /var/log/cron
# Everybody gets emergency messages
# 把emerg级别的信息发送给所有登录用户
* .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
# 把所有的系统启动信息记录到/var/log/boot.log日志文件中
local7.*
/var/log/boot.log
该文件以井号“#”为注释符,其中每一行的语法格式为:
[消息来源.消息级别] [动作]
其中,[消息来源.消息级别]和[动作]之间以Tab键进行分隔,同一行syslog配置中允许出现多个[消息来源.消息级别],但必须要使用分号“;”进行分隔,例如:
mail.*;
cron.* /var/log/test.log
其中消息来源表示发出消息的子系统,如表12.3列出了syslog中的所有消息来源。
表12.3 syslog消息来源及说明
消 息 来 源
说 明
消 息 来 源
说 明
authpriv
安全/授权信息
邮件子系统
cron
定时任务
news
网络新闻子系统
daemon
守护进程
syslog
syslogd内部产生的信息
ftp
ftp守护进程
user
一般用户级别信息
kern
内核信息
uucp
UUCP子系统
lpr
打印机子系统
local0-local7
本地用户
优先级代表消息的紧急程度,如表12.4所示按级别由高到低列出了syslog的所有消息级别及说明。
表12.4 syslog消息级别及说明
消 息 级 别
说 明
消 息 级 别
说 明
emerg
最紧急的消息
warning
警告消息
alert
紧急消息
notice
普通但重要的消息
crit
重要消息
info
通知性消息
err
出错消息
debug
调试级的消息——消息量最多
Syslog消息级别是向上匹配的,也就是说如果指定了一个消息级别,那么指定级别及比该指定级别更高级的消息都会被包括进去。例如,warning表示所有大于或者等于warning级别的消息都会被处理,包括emerg、alert、crit、err和warning。如果指定的是debug级别,那么所有级别的消息都会被处理。消息级别越低,消息的数量就越多。如果只想匹配某个确定级别的消息,而不希望包括更高级别的消息,可以使用等号“=”进行指定。例如希望处理cron的notice级别的消息:
cron.=notice /var/log/test.log
除此之外,syslog还支持两个特殊的消息级别关键字:“*”和none。其中“*”表示匹配所有来源或级别的消息;none表示忽略所有消息。
[动作]是用于指定消息的处理方式。Syslog支持把消息保存到日志文件中、发送给指定的用户、显示在终端上或者通过网络发送到另外一台syslog服务器上进行处理。如表12.5中列出了Syslog中所有可用的动作及其说明。
表12.5 syslog动作说明
动 作
说 明
文件名
将消息保存到指定的文件中
@主机名或IP地址
转发消息到另外一台syslog服务器上进行处理
*
把消息发送到所有用户的终端上
/dev/console
把消息发送到本地主机的终端上
| 程序
通过管道把消息重定向到指定的程序
用户名列表
把消息发送给指定的用户,用户名以逗号“,”进行分隔
12.2.3 配置实例
下面将以一个配置实例演示对syslog进行配置的步骤。但是在进行配置前需要先介绍一下logger命令。该命令可以模拟产生各类的syslog消息,从而测试syslog配置是否正确。logger命令的格式如下所示。
logger [-isd] [-f file] [-p pri] [-t tag] [-u
socket] [message ...]
例如,要模拟daemon emerg的消息,可以使用如下命令:
logger -p daemon.emerg “test info”
现在,假设要在syslog中添加对kern.emerg消息的处理,把该消息保存到/var/log/
kern_test.log日志文件中,步骤如下所述。
(1)修改配置文件。打开/etc/syslog.conf,在文件中添加如下内容并保存。
#syslog测试
kern.info /var/log/kern_test.log
(2)使修改生效。执行如下命令使修改后的配置生效。
# killall -HUP syslogd
(3)测试修改的效果。执行如下命令模拟kern.info消息。
logger kern.info "test info"
# cat /var/log/kern_test.log
Sep 8 21:40:30 demoserver kernel:
test info
12.2.4 清空日志文件内容
随着系统运行时间越来越长,日志文件的大小也会随之变得越来越大。如果长期让这些历史日志保存在系统中,将会占用大量的磁盘空间。用户可以直接把这些日志文件删除,但删除日志文件可能会造成一些意想不到的后果。为了能释放磁盘空间的同时又不影响系统的运行,可以使用echo命令清空日志文件的内容,命令格式如下所示。
echo > 日志文件
例如要清空/var/log/message日志文件的内容,可以使用如下命令:
# echo > /var/log/message
12.2.5 图形化日志工具——系统日志查看器
Red Hat
Linux中提供了一个图形化的日志查看工具——系统日志查看器。在该工具中默认可以查看syslog中所配置的日志文件,用户也可以通过该工具打开其他日志文件,如图12.6所示。
除了查看日志外,系统日志查看器还可以利用查看菜单中的过滤器选项对日志进行过滤显示,如图12.7所示。
图12.6 系统日志查看器
图12.7 日志过滤
12.3 其 他 日 志
除syslog以外,Linux系统中还提供了大量的其他日志文件,在这些日志文件中也记录了非常重要的日志信息。在本节中将会对其中常用的dmesg、wtmp、btmp、.bash_history等系统日志文件以及应用程序日志进行介绍。
12.3.1 dmesg日志:记录内核日志信息
日志文件/var/log/dmesg中记录了系统启动过程中的内核日志信息,包括系统的设备信息,以及在启动和操作过程中系统记录的任何错误和问题的信息。下面是该文件内容的一个截取。
Linux version 2.6.18-92.el5
(brewbuilder@hs20-bc2-3.build.redhat.com) (gcc version 4.1.2
20071124 (Red Hat 4.1.2-41)) #1 SMP Tue Apr
29 13:16:12 EDT 2008
BIOS-provided physical RAM map:
//
BIOS物理内存匹配
BIOS-e820: 0000000000000000 -
000000000009fc00
(usable) //可用内存
BIOS-e820: 000000000009fc00 -
00000000000a0000 (reserved) //保留内存
BIOS-e820: 00000000000f0000 -
0000000000100000 (reserved)
BIOS-e820: 0000000000100000 -
000000001fff0000 (usable)
BIOS-e820: 000000001fff0000 -
000000001fff3000 (ACPI NVS)
BIOS-e820: 000000001fff3000 -
0000000020000000 (ACPI data)
BIOS-e820: 00000000fec00000 -
0000000100000000 (reserved)
0MB HIGHMEM available. //高级内存为0MB
511MB LOWMEM available.
//低级内存为511MB
found SMP MP-table at 000f5470
Memory for crash kernel (0x0 to 0x0) notwithin
permissible range
disabling kdump
//禁用kdump
Using x86 segment limits to approximate NX
protection
On node 0 totalpages: 131056
DMA zone: 4096 pages, LIFO
batch:0
Normal zone: 126960 pages, LIFO
batch:31
DMI 2.3 present.
Using APIC driver
default //默认使用APIC驱动
ACPI: RSDP (v000
IntelR ) @ 0x000f6f80
ACPI: RSDT (v001 IntelR AWRDACPI 0x42302e31 AWRD
0x00000000) @ 0x1fff3000
ACPI: FADT (v001 IntelR AWRDACPI 0x42302e31 AWRD
0x00000000) @ 0x1fff3040
ACPI: MADT (v001 IntelR AWRDACPI 0x42302e31 AWRD
0x00000000) @ 0x1fff7180
ACPI: DSDT (v001 INTELR AWRDACPI 0x00001000 MSFT
0x0100000d) @ 0x00000000
可以通过该日志文件来判断某些硬件设备在系统启动过程中是否被正确识别。例如,用户新添加了一个磁盘,如果该磁盘设备能被Linux系统正确识别,那么在dmesg日志文件中应该能够看到它的信息,如下所示。
Probing IDE interface ide0...
hda: Maxtor 6Y080L0, ATA DISK drive
//原有的硬盘
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
Probing IDE interface ide1...
hdc: MAXTOR STM3160212A, ATA
DISK drive //新添加的硬盘
ide1 at 0x170-0x177,0x376 on irq 15
hda: max request size: 128KiB
hda: Host Protected Area detected.
current capacity is 152729956 sectors (78197 MB)
native capacity is 160086528 sectors (81964
MB)
hda: Host Protected Area disabled.
hda: 160086528 sectors (81964 MB) w/2048KiB Cache,
CHS=65535/16/63, UDMA(100)
hda: cache flushes supported
hda: hda1 hda2 <
hda5 hda6 hda7 hda8 hda9 hda10 hda11 hda12 hda13
>
hdc: max request size: 512KiB
hdc: 312581808 sectors (160041
MB) w/2048KiB Cache, CHS=19457/255/63, UDMA(33)
//硬盘大小为160041MB
hdc: cache flushes supported
hdc: hdc1[DM]
ide-floppy driver 0.99.newide
可以看到,新添加磁盘型号为MAXTOR
STM3160212A,对应的设备文件名为/dev/hdc,大小为160041MB。
12.3.2 用户登录日志
/var/log/wtmp和/var/log/btmp是Linux系统上用于保存用户登录信息的日志文件。其中wtmp用于保存用户成功登录的记录,而btmp则用于保存用户登录失败的日志记录,它们为系统安全审计提供了重要的信息依据。这两个文件都是二进制的,无法直接使用文本编辑工具打开,必须通过last和lastb命令进行查看。如果查看成功的用户登录记录,可以使用如下命令:
# last
//用户sam于9月9日10点10分从客户端192.168.7.174登录服务器,且尚未退出登录
sam pts/3 192.168.7.174 Tue
Sep 9
10:10 still logged
in
//
用户kelvin于9月8日20点01分从客户端192.168.6.217登录服务器,现已经退出,
登录时间持续3分钟19秒
kelvin pts/3 192.168.6.217 Mon
Sep 8
20:01 -
23:20 (03:19)
ken
pts/3 192.168.6.217 Mon Sep 8
19:49 -
19:59 (00:10)
sam pts/4 :0.0 Mon Sep 8
16:41 still logged
in
sam pts/3 172.30.11.221 Mon
Sep 8
11:05 -
17:25 (06:19)
ken
pts/2 demoserver Mon Sep 8
10:47 still
logged
in
//用户sam于9月8日10点45分从本地登录服务器,且尚未退出登录
sam pts/1 :0.0 Mon Sep 8
10:45 still logged
in
sam :0 Mon Sep 8
10:38 still logged
in
sam :0 Mon Sep 8 10:38 -
10:38 (00:00)
sam pts/1 :0.0 Mon Sep 8
10:37 - 10:38 (00:00)
sam :0 Mon Sep 8 10:37 -
10:38 (00:00)
sam :0 Mon Sep 8 10:37 - 10:37 (00:00)
//系统上一次重启的时间为9月8日10点35分
reboot system
boot 2.6.18-92.el5 Mon Sep 8
10:35 (23:35)
wtmp begins Mon Sep 8 10:35:25
2008 // wtmp文件自9月8日10点35分开始记录
// 登录日志
每行输出结果中都包括登录用户名、机器名或IP、尝试登录时间、运行时间等信息,其中still
logged in表示该登录会话依然存在,用户并未退出登录。如果要查看不成功的用户登录记录,可使用如下命令:
# lastb
//用户ken于9月8日23点08分试图登录系统失败
ken pts/5 demoserver Mon Sep 8 23:08 - 23:08 (00:00)
sam pts/5 demoserver Mon Sep 8 21:28 - 21:28 (00:00)
Kelvin pts/5 demoserver Mon Sep 8 21:07 - 21:07 (00:00)
sam pts/5 demoserver Mon Sep 8 21:07 - 21:07 (00:00)
pts/2 demoserver Mon Sep 8 10:47 - 10:47 (00:00)
//btmp文件自9月8日10点47分开始记录日志
btmp begins Mon Sep 8 10:47:23
2008
系统管理员应该定期查看上述两个日志文件,检查是否有某些非法用户登录系统或者尝试登录系统,以确保系统安全。
12.3.3 用户操作记录
默认情况下,在每个用户的主目录下都会有一个.bash_history的文件,在该文件中保存了该用户输入的所有命令的记录,管理员可以通过该文件查看某个用户到底做过什么操作。例如要查看sam用户的操作记录,如下所示。
# cat /home/sam/.bash_history
su –
root //用户输入的每一条命令在文件中都作为一行日志被记录下来
iostat -t -d -k -p
man iostat
iostat -d -k -x 1
100 //用户曾经执行iostat命令
sar -s
...省略部分输出内容...
man sar
sar -n DEV 2
100 //用户曾经执行sar命令
man sar
telnet
localhost //用户曾经telnet本机
cd /media/RHEL_5.2\ i386\ DVD/
ls
cd Server/
su – root //用户曾经执行su切换到root
由文件内容可以看到,用户输入的每一条命令都会被作为一行日志在文件中被记录下来。系统管理员应该定期查看该文件,检查用户是否进行了一些非法操作。
12.3.4 应用日志
除了系统日志以外,Linux系统中的应用软件也有自己的日志文件。由于不同的应用软件都会有特殊的日志格式,限于篇幅原因,在这里不能逐一进行介绍,一般情况下这些日志都会存放于软件安装目录下的logs目录下。作为系统管理员,应该清楚如何使用这些日志文件,以便在软件出现故障时能快速找到有效的信息支持。例如,下面是Apache软件错误日志的一个内容截取。
//警告信息,进程id文件/usr/local/apache2/logs/httpd.pid被覆盖,上一次关闭可能是非正常的
[Mon Aug 11 22:27:34 2008] [warn] pid file
/usr/local/apache2/logs/httpd.pid overwritten -- Unclean shutdown
of previous Apache run?
[Mon Aug 11 22:27:34 2008] [notice] Apache/2.2.9
(Unix) configured -- resuming normal operations
//尝试执行目录/usr/local/apache2/cgi-bin/中的脚本
[Mon Aug 11 22:27:40 2008] [error] [client
127.0.0.1] attempt to invoke directory as script:
/usr/local/apache2/cgi-bin/
[Mon Aug 11 22:27:40 2008] [error] [client
127.0.0.1] attempt to invoke directory as script:
/usr/local/apache2/cgi-bin/
[Mon Aug 11 22:27:41 2008] [error] [client
127.0.0.1] attempt to invoke directory as script:
/usr/local/apache2/cgi-bin/
[Mon Aug 11 22:27:41 2008] [error] [client
127.0.0.1] attempt to invoke directory as script:
/usr/local/apache2/cgi-bin/
//接收到SIGHUP信号,准备重启Apache
[Mon Aug 11 22:29:12 2008] [notice] SIGHUP
received. Attempting to restart
httpd: Could not reliably determine the server's
fully qualified domain name, using 127.0.0.1 for ServerName
[Mon Aug 11 22:29:12 2008] [notice] Apache/2.2.9
(Unix) configured -- resuming normal operations
[Mon Aug 11 22:29:14 2008] [error] [client
127.0.0.1] attempt to invoke directory as script:
/usr/local/apache2/cgi-bin/
// 找不到文件/usr/local/apache2/htdocs/cgi-bin
[Mon Aug 11 22:29:40 2008] [error] [client
127.0.0.1] File does not exist:
/usr/local/apache2/htdocs/cgi-bin
[Mon Aug 11 22:29:43 2008] [error] [client
127.0.0.1] File does not exist:
/usr/local/apache2/htdocs/favicon.ico
[Mon Aug 11 22:30:01 2008] [error] [client
127.0.0.1] attempt to invoke directory as script:
/usr/local/apache2/cgi-bin/
关于Apache日志更多的说明,请参考16.3.6节的内容。