linux日志机制syslogd总结
- 格式:docx
- 大小:193.08 KB
- 文档页数:15
1linux日志机制syslogd总结
3.int main(int argc, char **argv)
4.{
5. syslog(LOG_ERR|LOG_USER,"test - %m/n");
6. openlog("SyslogTest", LOG_CONS | LOG_PID, 0);
7. syslog(LOG_DEBUG,"This is a syslog test message generated by program '%s'/n",argv[0]);
8. closelog();
9. return 0;
10.}
执行结果:#cat /var/log/syslog
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
Sysklogd 日志记录器是由两个守护进程(klogd、syslogd)和一个配置文件(syslog.conf)组成。Klogd不使用配置文件,它负责截获内核消息,既可以独立使用也可以作为syslogd的客户端运行。Syslogd默认使用/etc/syslog.conf作为配置文件,它负责截获应用程序消息,还可以截获klogd向其转发的内核消息。支持internet/unix domain sockets 的特性使得这两个工具可以用于记录本地和远程的日志。
printk 函数可根据不同的日志级别对消息进行分类显示。我们通常用宏定义来指示日志级别,例如:KERN_INFO,它可被添加到一些打印语句的前面,是一个可以使用的消息日志级别。表示日志级别的宏会展开为一个字符串,在编译时由预处理器将它和消息文本拼接在一起。
在头文件
KERN_EMERG:用于紧急事件消息,它们一般是系统崩溃之前提示的消息
KERN_ALERT:用于需要立即采取动作的情况
KERN_CRIT:临界状态,通常涉及严重的硬件或软件操作失败
KERN_ERR:用于报告错误状态。设备驱动程序会经常使用KERN_ERR 来报告来自硬件的问题。
KERN_W ARNING:对可能出现问题的情况进行警告,但这类情况通常不会对系统造成严重问题。
KERN_NOTICE:有必要进行提示的正常情形。许多与安全相关的状况用这个级别进行汇报
KERN_INFO:提示性信息,很多驱动程序在启动的时候已这个级别来打印出他们找到的硬件信息
KERN_DEBUG:用于调试信息
每个字符串(以宏的形式展开)表示一个尖括号中的整数,整数值的范围为0~7,数值越小,优先级就越高。
未指定优先级的printk语句采用的默认级别是DEFAULT_MESSAGE_LOGLEVEL,这个宏在kernel/printk.c中被指定为一个整数。
根据日志级别,内核可能会把消息打印到当前控制台上,这个控制台可以使一个字符模式的终端、一个串口打印机或一个并口打印机。当优先级小于console_loglevel这个整数变量的值,消息才会显示出来,而且每次输出一行。
如果系统同时运行了klogd、syslogd,则无论console_loglevel为何值,内核消息都会最佳到/var/log/messages中。如果klogd没有运行,则消息不会传递到用户空间,这种情况下只能查看/proc/kmsg文件(使用dmesg命令即可轻松做到)。
Console_loglevel 的初始值是DEFAULT_CONSOLE_LOGLEVEL,而且可以通过sys_syslog系统调用进行修改。调用klogd 时可以指定–c 开关项来修改这个变量(klogd –c 8)。注意,要修改当前值,必须首先杀掉klogd,然后用新的-c选项重新启动它。(ps –ef 可查看所有进程;kill (pid)杀掉指定PID的进程)。
我们也可以通过对文本文件/proc/sys/kernel/printk的访问来读取和修改控制台的日志级别。这个文件包含了4个整数,分别是:当前的日志级别,未明确指定日志级别时的默认消息级别;最小允许的日志级别;引导时的默认日志级别。向该文件中写入单个整数,将会把当前日志级别修改为这个值。如:
echo 8 > /proc/sys/kernel/printk