分类: LINUX
2014-02-10 11:03:34
原文地址:linux日志机制syslogd总结 作者:lwchsz
1. BSD syslogd的组成结构:
从上图可以看到相关的日志文件主要来源于三种途径:
(1) 内核:
许多内核例程调用log函数产生log消息,另外klogd守护进程能够监听并得到内核消息,并发送给syslogd进程。
(2) 许多用户进程直接调用syslog函数产生日志消息。
(3) 来自于TCP/IP网络连接的日志消息。该消息可能来自于自身的某个用户进程或者其它网络主机上的一个用户进程。端口是514.
我们主要讨论第二种情况下产生的日志消息。跟syslog相关的主要以下三个函数:
openlog:
ident主要被用于加在日志消息中,一般是用某个程序名来代替。如cron, inetd等。
option则是许多选项的位屏蔽,常见的选项见下表:
facility参数设置的目的是可以通过配置文件对不同设施的消息将以不同的方式进行处理。常见的facility见下表:
openlog(“dhcp6c”, LOG_NDELAY|LOG_PID, LOG_DAEMON);
syslog:
priority参数可以是facility与level的组合,其中level可取的值如下表:
syslog(LOG_ERR, “open error for %s: %m”, filename)
syslog(LOG_ERR|LOG_LPR, “open error for %s: %m”, filename)
format则是格式化的出错消息字符串。
setlogmask: 用来设置记录日志的优先级,即只记录指定优先级的日志消息。
setlogmask(LOG_ERR) ----- 仅仅记录ERR级别的日志消息
setlogmask(LOG_UPTO(LOG_ERR))----- 记录ERR以及之前的所有日志消息
syslogd配置文件:(/etc/syslog.conf)
主要用来控制如何处理facility|priority的log消息,如存放到某个指定的文件中,或者发送到指定的log服务器,
2. 内核消息日志的显示以及printk函数的日志级别:
从前面的图2-1中可以看到,函数printk先将消息打印到环形缓冲区_logbuf中,并将消息传给控制台进行显示,控制台驱动程序然后根据控制台的日志级别显示日志消息。
常见的日志级别如下表:(数字越低,代表级别越高!)
跟日志级别相关的几个常量:
#defineconsole_loglevel (console_printk[0]) 控制台的日志级别,凡是优先级高于这个值的消息将在控制台上显示。它的初始值是default_console_loglevel,这个值可以通过klogd –cn(n为设置的级别)进行修改,不过要注意的是在修改之前,必须先杀掉klogd进程。 #define default_message_loglevel (console_printk[1]) 默认消息日志级别,当printk没定义优先级时使用这个值 #define minimum_console_loglevel (console_printk[2]) 最小控制台日志级别,控制台日志级别可被设置的最小值 #define default_console_loglevel (console_printk[3]) 默认的控制台日志级别,这个值可以通过sys_syslog系统调用进行修改。 Ps:这四个常量值可以通过/proc/sys/kernel/printk文件进行查看和修改。可以通过以下方式修改当前的日志级别: echo 8 > /proc/sys/kernel/printk