Solaris学习笔记:关于Solaris的syslog机制
网络整理 - 06-30
syslog机制负责发送记录系统内核及工具所产生的信息由syslog()调用syslogd守护进程和配置文件/etc/nf组成当系统内核及工具产生信息时通过调用syslog()把信息送往syslogdsyslogd再根据/etc/nf中的配置要求将这些信息分别作如下处理
记录到系统日志中
输出到系统控制台上
转发给指定的用户
通过网络转发给其它主机上的syslogd
通过nf的配置我们可以灵活地对信息的发送和保存进行控制
syslogd进程在系统启动时由/etc/rcd/Ssyslog启动如果需要手工启动或停止syslogd可以使用命令
# /etc/initd/syslog start | stop
/etc/nf文件中的一项配置记录由选项(selector)和动作(action)两个部分组成两者间用tab制表符进行分隔而选项又由一个或多个形如类型级别格式的保留字段组合而成各保留字段间用分号分隔
保留字段中的类型代表信息产生的源头可以是
kern 由kernel产生的信息
user 由用户进程产生的信息对那些由程序或不在此列出的工具产生的信息其缺省类型都是user;
mail 邮件系统产生的信息
daemon 系统守护进程的信息如inftpdtelnetd
auth 由login su getty等进行身份认证时产生的信息
syslog 由syslogd自己内部产生的信息
lpr 行打印spooling系统的信息
news USENET 网络新闻系统的信息
uucp UUCP系统信息
cron cron和at工具信息
local 保留为local使用
mark syslogd内部产生的时间戳信息
* 除mark之外的所有其它类型(此符号不可用以代表所有级别)
保留字段中的级别代表信息的重要性可以是
emerg 紧急处于Panic状态通常应广播到所有用户
alert 告警当前状态必须立即进行纠正例如系统数据库崩溃
crit 关键状态的警告例如硬件故障
err 其它错误
warning 警告
notice 注意非错误状态的报告但应特别处理
info 通报信息
debug 调试程序时的信息
none 通常调试程序时用指示带有none级别的类型产生的信息无需送出如*debug;mailnone表示调试时除邮件信息外其它信息都送出
动作域指示信息发送的目的地可以是
/filename 日志文件由绝对路径指出的文件名此文件必须事先建立
@host 远程主机
user user 指定用户如果指定用户已登录那么他们将收到信息
* 所有用户所有已登录的用户都将收到信息
我们来看看/etc/nf文件中的实例
……
*err;kerndebug;daemonnotice;mailcrit /var/adm/messages
……
这行中的action就是我们常关心的那个/var/adm/messages文件输出到它的信息源头selector是
*err 所有的一般错误信息
kerndebug 核心产生的调试信息
daemonnotice 守护进程的注意信息
mailcrit 邮件系统的关键警告信息
于是我们对/var/adm/messages中的东东怎么来的大致清楚一点了再看下面(不理会那个注释符号#)
……
# if a nonloghost machine chooses to have authentication messages
# sent to the loghost machine uncomment out the following line:
#authnotice ifdef(LOGHOST /var/log/authlog @loghost)
……
这里涉及Solaris下的loghost和m宏解释器loghost好理解就是在局域网内多台SUN机器中指定一台作为loghost大家的syslogd有水就都往它上面灌具体谁是loghost在/etc/hosts中定义
……
host loghost
host
……
m负责解释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 clients IP address and TCP port number
along with the name of the service using the syslog()
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/initd/inetsvc找到inetd那行改为
/usr/sbin/inetd s t &
前面看到daemonnotice已经包括在nf中action是/var/adm/messages如果action不想变那么就不用做修改了
重启一下syslogd:
# /etc/initd/syslog stop
# /etc/initd/syslog start
重启一下inetd
# /etc/initd/inetsvc stop
# /etc/initd/inetsvc start
试验一下结果开一个窗口监视有没有新的message来
# tail f /var/adm/messages
从另一台机器上telnet或ftp上来上面的监视窗口中应该有输出(^C 终止监视)
……
Jun :: host inetd[]: [ID daemonnotice] ftp[] from
Jun :: host inetd[]: [ID daemonnotice] telnet[] from
Jun :: host inetd[]: [ID daemonnotice] ftp[] from
对软件开发者来说可以参考关于syslog()的有关资料将你的软件中的信息进行适当的syslog()调用以输出到所希望的地方