识别 syslogd 调试输出中的问题
每个设施每行只能有一个级别。
在 /etc/syslog.conf 中,每行只应声明一次工具,例如 kern。
例如,以下是 /etc/syslog.conf 中的错误条目:
kern.debug;kern.err;kern.notice /dev/console
这将产生以下 syslogd 调试输出:
7 X X X X X X X X X X X X X X X X X X X X X X X X CONSOLE: /dev/console
/etc/syslog.conf 中的正确条目是:
kern.debug /dev/console
在调试模式下运行 syslogd 时使用记录器测试特定的选择器 (facility.level)
例如,在单独的窗口中:
# logger -p auth.notice "testing auth.notice"
在调试模式下启动 syslogd 的窗口中,可以看到以下输出:
writemsg(2): Logging msg 'Sep 24 09:55:08 dwryder: [ID 702911 auth.notice] testing auth.notice' to FILE /var/adm/auth.log
解释 syslogd 调试输出
syslogd 调试输出的第一部分包含一些网络和系统配置:
# /usr/sbin/syslogd -d main(1): Started at time Tue Sep 23 17:00:39 2014 hnc_init(1): hostname cache configured 2037 entry ttl:1200 getnets(1): found 1 addresses, they are: 0.0.0.0.2.2 amiloghost(1): testing 10.135.88.55.2.2 conf_init(1): I am loghost cfline(1): (*.err;kern.notice;auth.notice /dev/sysmsg) cfline(1): (*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages) cfline(1): (auth.debug /var/adm/auth.log) cfline(1): (*.alert;kern.err;daemon.err operator) cfline(1): (*.alert root) cfline(1): (*.emerg *) cfline(1): (auth.debug /var/adm/authlog) cfline(1): (mail.debug /var/log/syslog) syslogd: version 1.105 Started: Tue Sep 23 17:00:39 2014 Input message count: system 0, network 0 # Outputs: 8
syslogd 调试输出的下一部分是 syslog 选择器 (facility.level) 及其相应操作(将记录消息的位置)的摘要:
------------------------ priority = [file, facility] ----------------------- 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 ------------------------------------------------- 5 3 3 3 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 X CONSOLE: /dev/sysmsg 7 3 2 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 X FILE: /var/adm/messages X X X X 7 X X X X X X X X X X X X X X X X X X X X FILE: /var/adm/auth.log 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 X USERS: operator 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 X USERS: root 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X WALL: X X X X 7 X X X X X X X X X X X X X X X X X X X X FILE: /var/adm/authlog X X 7 X X X X X X X X X X X X X X X X X X X X X X FILE: /var/log/syslog
有 25 列 (0-24)。
前 24 列对应于 /usr/include/sys/syslog.h 中描述的 syslog 工具 (0-23)。
例如,在 Solaris 10 中,这些是:
Facility(设施) | 说明 |
---|---|
0 | kern |
1 | user |
2 | |
3 | daemon |
4 | auth |
5 | syslog |
6 | lpr |
7 | news |
8 | uucp |
9 | reserved |
10 | reserved |
11 | reserved |
12 | reserved |
13 | audit |
14 | reserved |
15 | cron |
16 | local0 |
17 | local1 |
18 | local2 |
19 | local3 |
20 | local4 |
21 | local5 |
22 | local6 |
23 | local7 |
每列中的数字是为该设施报告的系统日志级别编号为 0-7(也在 /usr/include/sys/syslog.h 中描述):
Syslog Level | 说明 |
---|---|
0 | emerg |
1 | alert |
2 | crit |
3 | error |
4 | warning |
5 | notice |
6 | info |
7 | debug |
因此,以下行可以解码如下:
5 3 3 3 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 X CONSOLE: /dev/sysmsg
第 0 列设置为 5,它指定将记录 kern.notice。
第 4 列设置为 5,它指定将记录 auth.notice。
所有其他列都包含 3,对应于 *.err。
这些选择器生成的任何消息都将记录到控制台 (/dev/sysmsg)。
以上与 /etc/syslog.conf 中的以下条目一致:
*.err;kern.notice;auth.notice /dev/console
这是上面的另一行 syslogd 调试输出:
X X X X 7 X X X X X X X X X X X X X X X X X X X X FILE: /var/adm/auth.log
第 4 列设置为 7,它指定将记录 auth.debug。
所有其他列都包含 X,这意味着不会记录这些设施。
这些选择器生成的任何消息都将记录到 /var/adm/auth.log。
这是 /etc/syslog.conf 中的相应条目:
auth.debug /var/adm/auth.log
缺少输出文件
如果在 /etc/syslog.conf 中指定了输出文件,则该文件必须在 syslogd 启动之前存在。
否则,可能会在 syslogd 调试输出中看到以下错误:
cfline(1): (auth.debug /var/adm/auth.log) logerror(1): syslogd: /var/adm/auth.log: No such file or directory logerror_to_console(1): syslogd: /var/adm/auth.log: No such file or directory
或者
writemsg(3): Logging msg 'syslogd: /var/adm/auth.log: No such file or directory' to FILE /var/adm/messages
要解决此问题,请创建丢失的文件:
# touch /var/adm/auth.log
并重新启动 syslogd。
在调试模式下停止 syslogd 并在正常模式下重新启动
- 杀死 syslogd 调试进程或者使用 ^C 在它启动的窗口中停止它。
2.在正常模式下重新启动syslog:
在 Solaris 10 之前:
# /etc/init.d/syslog start
检查进程是否正在运行:
# ps -ef|grep syslog|egrep -v grep root 984 1 0 11:08:17 ? 0:00 /usr/sbin/syslogd
在 Solaris 10 及更高版本中:
# svcadm enable svc:/system/system-log:default
检查系统日志服务是否在线:
# svcs svc:/system/system-log:default STATE STIME FMRI online 16:12:21 svc:/system/system-log:default
本文说明了在调试模式下运行 syslog 守护程序的步骤。
- 停止 syslogd 守护进程:
# /etc/init.d/syslog stop ### Prior to Solaris 10 # svcadm disable svc:/system/system-log:default ### Solaris 10 and above
- 环境变量 SYSLOGD_DEBUG 影响调试模式下 syslog 的输出。
默认值为 1,它提供的输出最少。
将此变量设置为 5 可提供最多的输出。
例如:
# SYSLOGD_DEBUG=5 # export SYSLOGD_DEBUG
- 在调试模式下启动守护进程:
# /usr/sbin/syslogd -d
所有输出都将显示在屏幕上。
我们可能希望将输出重定向到文件。
此外,守护进程将在前台运行。