识别 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(设施)说明
0kern
1user
2mail
3daemon
4auth
5syslog
6lpr
7news
8uucp
9reserved
10reserved
11reserved
12reserved
13audit
14reserved
15cron
16local0
17local1
18local2
19local3
20local4
21local5
22local6
23local7

每列中的数字是为该设施报告的系统日志级别编号为 0-7(也在 /usr/include/sys/syslog.h 中描述):

Syslog Level说明
0emerg
1alert
2crit
3error
4warning
5notice
6info
7debug

因此,以下行可以解码如下:

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
更多: zhilu jiaocheng

缺少输出文件

如果在 /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 并在正常模式下重新启动

  1. 杀死 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
Solaris:如何在调试模式下启动 syslogd

本文说明了在调试模式下运行 syslog 守护程序的步骤。

  1. 停止 syslogd 守护进程:
# /etc/init.d/syslog stop                                   ### Prior to Solaris 10
# svcadm disable svc:/system/system-log:default             ### Solaris 10 and above
  1. 环境变量 SYSLOGD_DEBUG 影响调试模式下 syslog 的输出。
    默认值为 1,它提供的输出最少。
    将此变量设置为 5 可提供最多的输出。
    例如:
# SYSLOGD_DEBUG=5
# export SYSLOGD_DEBUG
  1. 在调试模式下启动守护进程:
# /usr/sbin/syslogd -d

所有输出都将显示在屏幕上。
我们可能希望将输出重定向到文件。
此外,守护进程将在前台运行。

日期:2020-09-17 00:15:23 来源:oir作者:oir