syslog机制负责发送、记录系统内核及工具所产生的信息,由syslog()调用、syslogd守护进程和配置文件/etc/syslog.conf组成。当系统内核及工具产生信息时,通过调用syslog(),把信息送往syslogd,syslogd再根据/etc/syslog.conf中的配置要求,将这些信息分别作如下处理:
1.记录到系统日志中;
2.输出到系统控制台上;
3.转发给指定的用户;
4.通过网络转发给其它主机上的syslogd。
通过syslog.conf的配置,我们可以灵活地对信息的发送和保存进行控制。
syslogd进程在系统启动时由/etc/rc2.d/S74syslog启动。如果需要手工启动或停止syslogd,可以使用命令:
# /etc/init.d/syslog start | stop
/etc/syslog.conf文件中的一项配置记录由“选项”(selector)和“动作”(action)两个部分组成,两者间用tab制表符进行分隔。而“选项”又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段间用分号分隔。
保留字段中的“类型”代表信息产生的源头,可以是:
kern 由kernel产生的信息;
user 由用户进程产生的信息。对那些由程序或不在此列出的工具产生的信息,其缺省类型都是“user”;
mail 邮件系统产生的信息;
daemon 系统守护进程的信息,如in.ftpd、telnetd;
auth 由login, su, getty等进行身份认证时产生的信息;
syslog 由syslogd自己内部产生的信息;
lpr 行打印spooling系统的信息;
news USENET 网络新闻系统的信息;
uucp UUCP系统信息;
cron cron和at工具信息;
local0-7 保留为local使用;
mark syslogd内部产生的时间戳信息;
* 除mark之外的所有其它类型(此符号不可用以代表所有级别)。
保留字段中的“级别”代表信息的重要性,可以是:
emerg 紧急,处于Panic状态。通常应广播到所有用户;
alert 告警,当前状态必须立即进行纠正。例如,系统数据库崩溃;
crit 关键状态的警告。例如,硬件故障;
err 其它错误;
warning 警告;
notice 注意;非错误状态的报告,但应特别处理;
info 通报信息;
debug 调试程序时的信息;
none 通常调试程序时用,指示带有none级别的类型产生的信息无需送出。如*.debug;mail.none表示调试时除邮件信息外其它信息都送出。
“动作”域指示信息发送的目的地。可以是:
/filename 日志文件。由绝对路径指出的文件名,此文件必须事先建立;
@host 远程主机;
user1, user2 指定用户。如果指定用户已登录,那么他们将收到信息;
* 所有用户。所有已登录的用户都将收到信息。
我们来看看/etc/syslog.conf文件中的实例:
……
*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages
……
这行中的“action”就是我们常关心的那个/var/adm/messages文件,输出到它的信息源头“selector”是:
*.err - 所有的一般错误信息;
kern.debug - 核心产生的调试信息;
daemon.notice - 守护进程的注意信息;
mail.crit - 邮件系统的关键警告信息
于是我们对/var/adm/messages中的东东怎么来的大致清楚一点了。再看下面(不理会那个注释符号“#”):
……
# if a non-loghost machine chooses to have authentication messages
# sent to the loghost machine, un-comment out the following line:
#auth.notice ifdef(‘LOGHOST’, /var/log/authlog, @loghost)
……
这里涉及Solaris下的loghost和m4宏解释器。loghost好理解,就是在局域网内多台SUN机器中指定一台作为loghost,大家的syslogd有水就都往它上面灌。具体谁是loghost在/etc/hosts中定义:
……
192.168.1.11 host1 loghost
192.168.1.22 host2
……
m4负责解释ifdef,它的事迹这里就不去深究了(要考SA的兄弟姐妹们可要去看啊,有题的),反正上面那个ifdef的意思就是:如果本机是loghost,那么信息送到/var/log/authlog中,否则送到@后的主机上。
下面作为一个示例,看看如何使用syslog机制来对telnet登录进行记录。
Telnet和ftp等许多网络服务是通过inetd来提供的。因此先检查一下inetd使用了什么类型和级别的syslog调用:
# man inetd
……
-t Instructs inetd to trace the incoming
connections for all of its TCP services. It does this by
logging the client’s IP address and TCP port number,
along with the name of the service, using the syslog(3)
facility. UDP services can not be traced. When tracing is
enabled, inetd uses the syslog facility code ``daemon’’
and ``notice’’ priority level.
……
就是说,启动带-t选项的inetd,它才会调用syslog来记录TCP服务的细节,类型是daemon,级别是notice。于是先修改inetd的启动脚本/etc/init.d/inetsvc,找到inetd那行,改为:
/usr/sbin/inetd -s -t &
前面看到,daemon.notice已经包括在syslog.conf中,action是/var/adm/messages。如果action不想变,那么就不用做修改了。
重启一下syslogd:
# /etc/init.d/syslog stop
# /etc/init.d/syslog start
重启一下inetd:
# /etc/init.d/inetsvc stop
# /etc/init.d/inetsvc start
试验一下结果。开一个窗口监视有没有新的message来:
# tail -f /var/adm/messages
从另一台机器上telnet或ftp上来。上面的监视窗口中应该有输出(^C 终止监视):
……
Jun 18 12:08:42 host1 inetd[755]: [ID 317013 daemon.notice] ftp[759] from 192.168.1.88 1082
Jun 18 12:09:13 host1 inetd[755]: [ID 317013 daemon.notice] telnet[760] from 192.168.1.88 1083
Jun 18 12:11:22 host1 inetd[755]: [ID 317013 daemon.notice] ftp[771] from 192.168.1.88 1084
对软件开发者来说,可以参考关于syslog()的有关资料,将你的软件中的信息进行适当的syslog()调用,以输出到所希望的地方.