从目前的情况来看,Syslog(系统日志)这一历史悠久的日志系统仍旧占据着最主流的地位。由于与类 UNIX平台之间的渊源,Syslog是在实际应用环境中最容易获得的日志系统。 同时,还有很多的基于Syslog的扩展产品存在,这其中也包括大量基于UNIX平台构建内核的网络硬件设备,这些设备往往都内置了Syslog功能支 持,例如Cisco路由器就是如此。
一、 配置syslog守护进程
syslog是Linux系统默认的日志守护进 程。默认的syslog配置文件是/etc/syslog.conf文件。syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定 一个存放地点。现在,我们先看看syslog.conf文件的配置行格式(这个文件里的每一个配置行都是同样的格式),然后再看一个完整的syslog配 置文件。syslog配置行的格式如下所示:
mail.*/var/log/mail
这一行由两个部分组成。第一个部分是一个或多个“选择条件”;上例中的选择条件是“mail”。选择条件后面跟一些空格字符,然后是一个“操作动作”;上例中的操作动作是:/var/log/mail
1选择条件
选择条件本身分为两个字段,之间用一个小数点(.)分隔。前一字段是一项服务,后一字段是一个优先级。选择条件其实是对消息类型的一种分类,这种分类便 于人们把不同类型的消息发送到不同的地方。在同一个syslog配置行上允许出现一个以上的选择条件,但必须用分号(;)把它们分隔开。上面给出的例子里 只有一个选择条件“mail”。大家可以在我们后面给出的那个完整的syslog配置文件示例里看到同时有多个选择条件的配置行。
2 优先级
优先级是选择条件的第二个字段,它代表消息的紧急程度。对一个应用程序来说,它发出的哪些消息属于哪一种优先级是由 当初编写它的程序员决定的,应用程序的使用者只能接受这样的安排——除非打算重新编译系统应用程序。表2按严重程度由低到高的顺序列出了所有可能的优先 级。
不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优 先级的消息以及所有更紧急的消息类型都将包括在内。比如说,如果某个选择条件里的优先级是“warning”,它实际上将把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在内。
3优先级限定符
syslog允许人们使用三 种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!)。熟悉规则表达式的读者应该对这三种限定符不会感到陌生。星号(*)的含义是“把本项服务 生成的所有日志消息都发送到操作动作指定的地点”。就像它在规则表达式里的作用一样,星号代表“任何东西”。在前面给出的例子里,“mail.*”将把所 有优先级的消息都发送到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类 型的消息发送到指定地点。
等号(=)的含义是“只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点”。比如说,可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当你只需要发送特定优先级别的消息时,就要使用等号限定符。
就像它在编程时的用法一样,等号意味着等于且仅等于。叹号(!)的含义是“把本项服务生成的所有日志消息都发送到操作动作指定的地点,但本优先级的消息 不包括在内”。比如说,这条syslog配置行将把除info优先级以外的所有消息发送到/var/log/mail文件里:
mail.*;mail.!info/var/log/mail
在这个例子里,“mail.*”将发送所有的消息,但“mail.!info”却把info优先级的消息排除在外。就像它在编程时的用法一样,叹号意味着“非”。
4 操作动作
日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。syslog配置文件并不复杂,既容易阅读又容易操作使用。这个文件里的注释都非常有用,应该好好读读它们。
二、 建立一个中央日志服务器
1建立中央日志服务器前的准备工作
配置良好的网络服务(DNS和NTP)有助于提高日志记录工作的精确性。在默认情况下,当有其他机器向自己发送日志消息时,中央日志服务器将尝试解析该 机器的FQDN(fullyqualifieddomainname,完整域名)。(你可以在配置中央服务器时用“-x”选项禁止它这样做。)如果 syslog守护进程无法解析出那个地址,它将继续尝试,这种毫无必要的额外负担将大幅降低日志记录工作的效率。类似地,如果你的各个系统在时间上不同 步,中央日志服务器给某个事件打上的时间戳就可能会与发送该事件的那台机器打上的时间戳不一致,这种差异会在你对事件进行排序分析时带来很大的困扰;对网 络时间进行同步有助于保证日志消息的时间准确性。如果想消除这种时间不同步带来的麻烦,先编辑/etc/ntp.conf文件,使其指向一个中央时间源, 再安排ntpd守护进程随系统开机启动就可以了。
2配置一个中央日志服务器
只须稍加配置,就可以用syslog实现一个中央日志服务器。任何一台运行syslog守护进程的服务器都可以被配置成接受来自另一台机器的消息,但这 个选项在默认情况下是禁用的。在后面的讨论里,如无特别说明,有关步骤将适用于包括SUSE和RedHat在内的大多数Linux发行版本。我们先来看看 如何激活一个syslog服务器接受外来的日志消息:
1. 编辑/etc/sysconfig/syslog文件。
在“SYSLOGD_OPTIONS”行上加“-r”选项以允许接受外来日志消息。如果因为关于其他机器的DNS记录项不够齐全或其他原因不想让中央日志 服务器解析其他机器的FQDN,还可以加上“-x”选项。此外,你或许还想把默认的时间戳标记消息(–MARK–)出现频率改成比较有实际意义的数 值,比如240,表示每隔240分钟(每天6次)在日志文件里增加一行时间戳消息。日志文件里的“–MARK–”消息可以让你知道中央日志服务器上的 syslog守护进程没有停工偷懒。按照上面这些解释写出来的配置行应该是如下所示的样子:
SYSLOGD_OPTIONS=”-r-x-m240″
2.重新启动syslog守护进程。修改只有在syslog守护进程重新启动后才会生效。如果你只想重新启动syslog守护进程而不是整个系统,在RedHat机器上,执行以下两条命令之一:
/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart
/e
tc/rc.d/init.d/syslogrestart
3.如果这台机器上运行着iptables防火墙或TCPWrappers,请确保它们允许514号端口上的连接通过。syslog守护进程要用到514号端口。
4为中央日志服务器配置各客户机器
让客户机把日志消息发往一个中央日志服务器并不困难。编辑客户机上的/etc/syslog.conf文件,在有关配置行的操作动作部分用一个“@”字符指向中央日志服务器,如下所示:
另一种办法是在DNS里定义一个名为“loghost”的机器,然后对客户机的syslog配置文件做如下修改(这个办法的好处是:当你把中央日志服务器换成另一台机器时,不用再修改每一个客户机上的syslog配置文件):
接下来,重新启动客户机上的syslog守护进程让修改生效。让客户机在往中央日志服务器发送日志消息的同时继续在本地进行日志工作仍有必要,起码在调试客户机的时候不必到中央日志服务器查日志,在中央日志服务器出问题的时候还可以帮助调试。
总结:日志系统承担着整个信息基础设施中感觉器官的作用,一个完善的、工作良好的体系需要在正确的地点部署日志采集工具。后边笔者会介绍syslog的增强版本syslog-ng。
基本的一些概念:
1)syslog的日志为8个等级,从0到7,详细的信息,man syslog就可以了.默认是info.
2)我们的系统日志在/var/log/下面,像messages,secure等等,这里要说明的,不是你的操作系统就会写入到对映的日志里
也就是说只有想写日志信息到里面,要通过syslog系统函数来操作.
3)syslog日志系统提供远程日志写入功能,即A机器开放syslog的服务,并开放远程syslog功能,B机器可以将自己的日志信息写入到A机器的日志系统
4)syslog提供facility使用户自定义的来操纵程序写日志.
特殊玩法:
1)如何将消息写入到syslog的日志系统?
可以用logger命令,syslog的日志等级有8个,默认是info,这时你用syslog为debug(最低)来写日志,syslog服务是不会写日志的.
比如:
cat /etc/syslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
[root@umail180 etc]# logger -p debug “hello this is a test”
-p选项来指定优先级,logger的默认优先为是info.指定info或更高的优先级都可以被syslog所接收.
*.info;mail.none;authpriv.none;cron.none这里的*表示所有的facility,而none表示对映的facility不被接收
2)如何将命令的执行结果写入到syslog的日志系统?
可以用initlog命令.例如:
initlog -c “cat /etc/passwd”
-c选项后面要指定command
这时会把cat /etc/passwd的结果写入到/var/log/message.
其中initlog在sysinit中就有调用,它记录了整个sysinit脚本的启动引导过程,这样我们才会在messages里看到它的引导信息
3)实现syslog的远程写日志功能.
服务端:
这里要打开/etc/sysconfig/syslog文件
更改SYSLOGD_OPTIONS=”-m 0″
为SYSLOGD_OPTIONS=”-m 0 -r ”
重启syslog服务即可,注意更改/etc/sysconfig/syslog和/etc/syslog都要重启syslog服务,因为/etc/init.d/syslog脚本在启动时要加载这两个文件.
默认是开放514的udp端口
netstat -anp|grep syslog
udp 0 0 0.0.0.0:514 0.0.0.0:* 3425/syslogd
客户端:
vi /etc/syslog.conf
增加一条策略,如下:
*.info @umail180
这里的*代表所有的facility,也就是说所有的级别为info的写日志操作都将写入到远程的umail180服务器,这里的umail180是主机名
有两点要重点说明:
第一点,写本地syslog,和写远程的syslog是两回事,相互不影响
例如: 你有两条策略:
*.info /var/log/messages
*.info @umail180
它是即写/var/log/messages,又写umail180的syslog
说明 :系统是先接收到recv请求, 再去写文件,然后调用fsync同步内存到磁盘.最后它调用sendto函数发送到192.168.7.178这台服务器的514端口
这时在服务端会收到请求.并写到syslog指定facility的文件中.
第二点,syslog的服务端收到请求,会根据facility将信息写到对映的文件中,这样有利于信息的汇集和管理
例如:
在其它服务器登录这台客户端
当然这时本地的syslog会收到请求,会根据syslog.conf文件的facility将信息写入到/var/log/secure中.
而如果你有也想将信息写入到远程服务器,例如采用下面的配置:
authpriv.* /var/log/secure
*.info @umail180
同样远程服务器将收到本地syslog的sendto请求,它将跟据请求的facility,写入的对映的文件中.比如/var/log/secure
这时在远程的/var/log/secure中也记录了一份登录客户端的日志信息.
4)想记录那些鸟人在我服务器上的所有操作,可以用syslog实现吗?
答案是可以的.但要说明白似乎要走些弯弯.
首先并不是所有的操作都会写入到日志中,即使你把级别调到最高也是如此
问题就在于,真正涉及到写syslog的日志的操作,只能是调用syslog函数,而调用syslog函数的命令我们刚才见到两个,logger和initlog
它们各有用处.像ls和cp这种命令是不会调用syslog函数,所以即使你将级别调整到debug,也是无用的.
那好.如何解决上面的问题,先说initlog,我在不调用initlog的情况下,能用syslog记录它的运行结果吗?
这样就可以.
initlog -c /bin/bash
这时/var/log/message就记录下它操作的结果.如果是rpm -qa,那就会有一大批的信息.
但遗憾的是,它会丢了PROMPT.就是PS1那一大堆东西.但所有的命令都有效.
再来说说logger.这里有一点要区分,logger只是写信息到syslog的日志中,它是不执行那些信息的.
这里要执行命令,也要将命令写到syslog中,再根据syslog的远程功能,发送到远端的syslog服务器.
在日志中将是这样的结果:
Jun 2 16:12:52 umail180 bash[24371]: ls –color=tty -l
Jun 2 16:13:30 umail180 bash[24371]: hacker
Jun 2 16:13:40 umail180 bash[24371]: ls –color=tty
Jun 2 16:13:43 umail180 bash[24371]: cd /usr/src/
Jun 2 16:13:43 umail180 bash[24371]: ls –color=tty
Jun 2 16:13:46 umail180 bash[24371]: cd redhat/
Jun 2 16:13:47 umail180 bash[24371]: ls –color=tty
Jun 2 16:28:11 umail180 bash[24371]: cd SOURCES/
Jun 2 16:28:11 umail180 bash[24371]: ls –color=tty
Jun 2 16:
28:13 umail180 bash[24371]: ifconfig eth0
Jun 2 16:28:14 umail180 bash[24371]: ls –color=tty
Jun 2 16:28:15 umail180 bash[24371]: clear
这里要改下bash的源程序:
简单说下bash的运行流程:
主程序文件是shell.c,它会做一些profile中的设定,包括PS1等等,最后它会运行eval.c中的reader_loop函数,
这个函数接收这些操作指令.再调用execute_command函数执行之,当然它后面非常复杂,这里只要把
这些指令接收进来,再调用syslog函数写到syslog服务的日志中就OK了.至于后面怎么执行,那不是我们关心的.
我改了两个地方:
eval.c中的reader_loop函数,大概在143行插入了:print_to_syslog(current_command);
print_to_syslog是我自定义的函数.
这个函数,我加到了print_cmd.c源程序中.
如下:
print_to_syslog(command)
COMMAND *command;
{
command_string_index = 0;
openlog (“bash”, LOG_PID, LOG_LOCAL5);
syslog (LOG_INFO, “%s\n”, make_command_string(command));
closelog();
}
这里的openlog的LOG_LOCAL5是facility,这个是在syslog.conf中自定义的.
这里的syslog是系统函数,所以要在print_cmd.c文件中加入头文件syslog.h.
把bash的源程序再./configure;make;make install就行了.
最后把想要监控的用户的bash指定到新的bash文件就可以了.
例如在 syslog.conf中添加下面的样子:
local5.* @umail180
在远端的syslog服务器中添加和上面对映的就行了.
local5.* /var/log/operator
呵呵.这样你就可以坐在电脑前看着/var/log/operator,欣赏所有服务器上操作者的表演了.
有关于概念上的学习,man查看下syslog和syslog.conf,还有 openlog
这些都是很有用的.