有两个syslog函数,一个是内核中的(man 2 syslog,sys_syslog),一个是libc的函数(man 3 syslog)。
前者int syslog(int type, char *bufp, int len);用于操作内核printk的打印缓存。封装的libc函数为klogctl。
http://linux.die.net/man/2/syslog
syslog, klogctl - read and/or clear kernel message ring buffer; set console_loglevel
它可以读、写、清除、设置内核打印缓冲区。
后者syslog和openlog等结合使用,输出的log被syslogd所监听到。
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
openlog可以设置具体的log类别,如LOG_LOCAL0 through LOG_LOCAL7、LOG_DAEMON、LOG_KERN等。
如果想向对应的log文件写log,则在syslog的第一个参数priority使用如(LOG_CRIT | LOG_LOCAL7)等方式,打印到LOG_LOCAL7对应的log文件。
Sysklogd分syslogd和klogd。
syslogd支持 both internet and unix domain sockets。
klogd通过/proc/kmsg,或者通过sys_syslog读内核消息。syslogd是通过klogd来读取系统内核信息。
In Linux there are two potential sources of kernel log information: the /proc file system and the syscall (sys_syslog) interface, although ultimately they are one and the same. Klogd is designed to choose whichever source of information is the most appropriate. It does this by first checking for the presence of a mounted /proc file system. If this is found the /proc/kmsg file is used as the source of kernel log information. If the proc file system is not mounted klogd uses a system call to obtain kernel messages. The command line switch (-s) can be used to force klogd to use the system call interface as its messaging source.
1> 所有系统信息是输出到ring buffer中去的.dmesg所显示的内容也是从ring buffer中读取的.(printk)
2> LINUX系统中/etc/init.d/sysklogd会启动2个守护进程:Klogd&&Syslogd。不一定的。
3> klogd是负责读取内核信息的,有2种方式:
sys_syslog
klogd对/proc/kmsg进行读取
4> Klogd的输出结果会传送给syslogd进行处理,syslogd会根据/etc/syslog.conf的配置把log信息输出到/var/log/下的不同文件中. 不清楚。
http://linux.die.net/man/8/syslogd
http://book.51cto.com/art/200912/168763.htm
syslogd [ -a socket ] [ -d ] [ -f config file ] [ -h ] [ -l hostlist ] [ -m interval ] [ -n ] [ -p socket ] [ -r ] [ -s domainlist ] [ -S ] [ -v ] [ -x ]
-f 读配置文件
配置文件中:
! 取反
* 任意
样例一、
# Sample syslog.conf
mail.*;mail.!=info
/usr/adm/mail
news.info;news.!crit
/usr/adm/news
样例二、
!* ---------------???
local6.err %/var/log/publog 10485760 666 ------------- 文件大小 和 权限。
!|AUTH|FP_CP_TABLE|
*.debug %/var/log/debug_trace 20971520 666
12.2.2 syslog配置
syslog的配置文件为/etc/syslog.conf,在该文件中指定了syslog记录日志的信息来源、信息类型以及保存位置。下面是该文件内容的一个实例。
- # Log all kernel messages to the console.
- # Logging much else clutters up the screen.
- # kern.* /dev/console
- # Log anything (except mail) of level info or higher.
- # Don't log private authentication messages!
- # 把除邮件、授权和定时任务以外的其他info级别的信息 记录到/var/log/messages日志文件中
- * .info;mail.none;authpriv.none;cron.none /var/log/messages
- # The authpriv file has restricted access.
- # 把所有授权信息记录到/var/log/secure日志文件中
- authpriv.* /var/log/secure
- # Log all the mail messages in one place.
- # 把所有级别的邮件信息记录到/var/log/maillog日志文件中
- mail.* -/var/log/maillog
- # Log cron stuff
- # 把所有级别的定时任务信息记录到/var/log/cron日志文件中
- cron.* /var/log/cron
- # Everybody gets emergency messages
- # 把emerg级别的信息发送给所有登录用户
- * .emerg *
- # Save news errors of level crit and higher in a special file.
- uucp,news.crit /var/log/spooler
- # Save boot messages also to boot.log
- # 把所有的系统启动信息记录到/var/log/boot.log日志文件中
- local7.* /var/log/boot.log
该文件以井号"#"为注释符,其中每一行的语法格式为:
- [消息来源.消息级别] [动作]
其中,[消息来源.消息级别]和[动作]之间以Tab键进行分隔,同一行syslog配置中允许出现多个[消息来源.消息级别],但必须要使用分号";"进行分隔,例如:
- mail.*; cron.* /var/log/test.log
其中消息来源表示发出消息的子系统,如表12.3列出了syslog中的所有消息来源。
表12.3 syslog消息来源及说明
消 息 来 源 | 说 明 | 消 息 来 源 | 说 明 |
authpriv | 安全/授权信息 | | 邮件子系统 |
cron | 定时任务 | news | 网络新闻子系统 |
daemon | 守护进程 | syslog | syslogd内部产生的信息 |
ftp | ftp守护进程 | user | 一般用户级别信息 |
kern | 内核信息 | uucp | UUCP子系统 |
lpr | 打印机子系统 | local0-local7 | 本地用户 |
优先级代表消息的紧急程度,如表12.4所示按级别由高到低列出了syslog的所有消息级别及说明。
表12.4 syslog消息级别及说明
消 息 级 别 | 说 明 | 消 息 级 别 | 说 明 |
emerg | 最紧急的消息 | warning | 警告消息 |
alert | 紧急消息 | notice | 普通但重要的消息 |
crit | 重要消息 | info | 通知性消息 |
err | 出错消息 | debug | 调试级的消息——消息量最多 |
Syslog消息级别是向上匹配的,也就是说如果指定了一个消息级别,那么指定级别及比该指定级别更高级的消息都会被包括进去。例如,warning表示所有大于或者等于warning级别的消息都会被处理,包括emerg、alert、crit、err和warning。如果指定的是debug级别,那么所有级别的消息都会被处理。消息级别越低,消息的数量就越多。如果只想匹配某个确定级别的消息,而不希望包括更高级别的消息,可以使用等号"="进行指定。例如希望处理cron的notice级别的消息:
- cron.=notice /var/log/test.log
除此之外,syslog还支持两个特殊的消息级别关键字:"*"和none。其中"*"表示匹配所有来源或级别的消息;none表示忽略所有消息。
[动作]是用于指定消息的处理方式。Syslog支持把消息保存到日志文件中、发送给指定的用户、显示在终端上或者通过网络发送到另外一台syslog服务器上进行处理。如表12.5中列出了Syslog中所有可用的动作及其说明。
表12.5 syslog动作说明
动 作 | 说 明 |
文件名 | 将消息保存到指定的文件中 |
@主机名或IP地址 | 转发消息到另外一台syslog服务器上进行处理 |
* | 把消息发送到所有用户的终端上 |
/dev/console | 把消息发送到本地主机的终端上 |
| 程序 | 通过管道把消息重定向到指定的程序 |
用户名列表 | 把消息发送给指定的用户, 用户名以逗号“,”进行分隔 |