分类: LINUX
2009-02-10 14:20:26
syslogd守护进程根据/etc/syslog.conf中的配置信息实现消息转发和处理。下面是该配置文件的具体信息:
# Log all kernel messages to the console. # Log anything (except mail) of level info or higher. # The authpriv file has restricted access. # Log all the mail messages in one place.
# Everybody gets emergency messages # Save news errors of level crit and higher in a special file. # Save boot messages also to boot.log |
在syslog.conf文件中以#开头的是注释行,配置行的语法格式为:[消息类型][TAB分隔符][处理方案]。
1.消息类型
消息类型包括facility和level两个部分,这两个部分以"."隔开,如:
mail.* -/var/log/maillog |
表示facility为mail,而level是所有级别。处理方案是将消息记录在/var/log/maillog日志文件中。表8.2所示为facility可以使用的字段。
表8.2 facility字段
facility取值 |
值 |
说 明 |
kern |
0 |
内核日志信息 |
user |
1 |
用户日志信息 |
mail |
2 |
邮件系统日志信息 |
daemon |
3 |
系统守护进程日志信息 |
auth |
4 |
安全管理日志信息 |
syslog |
5 |
syslogd守护进程的日志信息 |
lpr |
6 |
打印服务日志信息 |
news |
7 |
新闻组服务日志信息 |
uucp |
8 |
uucp系统日志信息 |
cron |
9 |
守护进程cron的日志信息 |
authpriv |
10 |
私有的安全管理日志信息 |
ftp |
11 |
ftp守护进程 |
|
12~15 |
系统保留 |
local0~local7 |
16~23 |
保留给系统本地使用 |
level给出的级别代表着信息的重要性,表8.3所示为level中的级别信息。
表8.3 level字段
level取值 |
值 |
说 明 |
emerg |
0 |
系统不可用,出现这一情况的话,应该通知所有用户,因为这表示系统出现了严重的问题 |
alert |
1 |
警告事件,必须立即采取行动纠正的事件 |
crit |
2 |
关键事件,例如硬件出现故障 |
err |
3 |
其他错误事件 |
warning |
4 |
警告事件 |
notice |
5 |
应该注意的事件,需要特别处理 |
info |
6 |
通报信息 |
debug |
7 |
调试程序时产生的信息 |
在syslog.conf中,可以使用*表示任何facility和任意的level。通过指定facility和level的取值,可以使facility在大于或等于该优先级的时候才记录相关日志信息。对于level,还可以使用none参数,表示不包含任何优先级别。例如,*.*表示任何facility的任何优先级的信息。*.emerg表示任何facility的大于或高于emerg优先级的信息。
2.处理方案
处理方案中指定的字段可以为如下的内容。
普通文件:使用文件的绝对路径来指明日志文件所在位置。
管道文件:在syslogd中支持使用管道文件(FIFO),在管道文件路径名前加"|",表示将所得信息写入管道中。
终端设备:通过将信息写入/dev/console中,可以在终端显示相关信息。
其他主机:syslogd支持将信息发往网络中的其他主机的syslogd守护进程,以实现集中管理,格式为"@hostname"。
用户列表:syslogd守护进程支持将日志信息发给某些指定的用户。
所有登录用户:可以用*表示所有登录的用户。在获得日志信息时,syslogd守护进程会自动将信息发送给登录用户。
下面选取前面给出的syslog.conf中的一条配置来解释其意义。具体配置如下:
cron.* /var/log/cron |
配置中的facility为cron,表示记录守护进程cron的信息。level为*,表示记录所有优先级别的信息,并将日志信息记录到/var/log/cron文件中。在Linux系统
中,往往把各种日志文件保存在/var/log目录中。
(点击查看大图)图8.5 日志文件保证目录 |
在syslog.conf文件中,这些级别指定了最低程度的重要性,只有重要性大于(包括)它的消息才会被记录下来。例如,来自电子邮件系统的一条警告级消息和mail.warning匹配,也同样和mail.notice、mail.info、mail.debug、*.warning、*.notice、*.info和*.debug匹配。如果syslog.conf文件指定了mail.info消息应该被记录到某个日志文件中,那么mail.warning消息也将被记录到该文件中。
Linux版的syslog对基本语法做了改进,它也允许在优先级前面加上字符=和!,分别表示“仅此优先级”和“除此优先级及其以上级别”的意思。表10.5给出了一些例子。
表10.5 在syslog.conf中限定优先级的例子
选 择 符 |
含 义 |
mail.info |
选择与邮件相关的、优先级为info或者更高的消息 |
mail.=info |
只选择优先级为info的消息 |
mail.info;mail.!err |
只选择优先级为info、notice和warning的消息 |
mail.debug;mail.!=warning |
选择除warning之外的所有优先级 |
action字段说明如何处理一则消息。表10.6列出了可以选择的处理方法。
表10.6 syslog的动作
动作(Action) |
含 义 |
filename |
把消息写入本地机器上的一个文件里 |
@hostname |
把消息转发给主机hostname上的syslogd |
@ipaddress |
把消息转发给IP地址为ipaddress的主机 |
| fifoname |
把消息写入有名管道fifonamea |
user1,user2,… |
如果用户登录到了系统上,那么就把消息写在用户的屏幕上 |
* |
把消息写给目前已经登录的所有用户 |
a. 参考info mkfifo了解更多的信息。
如果采取了filename(或者fifoname)这样的动作,那么文件名应该用绝对路径。如果您指定了一个不存在的文件名,那么在首次有消息送到这个文件的时候,syslod会创建它。您可以在filename动作之前加一个短划线“-”,表示在写完每条日志记录项后,不应该对文件系统执行sync。执行sync有助于在发生崩溃的时候尽可能多地保留日志信息,但是从磁盘吞吐上来看,代价又太大。
如果用的是hostname而不是IP地址,那么主机名必须能通过DNS或者NIS这样的转换机制解析出来。
虽然一个selector可以包含多个设备(facility)和级别,但是却不能提供多个动作。为了把一则消息发送到两个地方(比如,到本地文件和到中央日志主机),您可以在配置文件中包含具有相同Selector的两行。
这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
通常,syslog守护进程读取三种格式的记录消息。此守护进程在启动时读一个配置文件。一般来说,其文件名为/etc/syslog.conf,该文件决定了不同种类的消息应送向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示,而警告消息则可记录到一个文件中。该机制提供了syslog函数,其调用格式如下
#include
void openlog (char*ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();
调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident 一般是程序的名称(例如 ,cron ,ine 等)
程序的用法示例代码如下:
#include
int main(int argc, char **argv)
{
openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
syslog(LOG_DEBUG,
"This is a syslog test message generated by program '%s'\n",
argv[0]);
closelog();
return 0;
}
编译生成可执行程序后,运行一次程序将向/var/log/message文件添加一行信息如下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'
openlog及closelog函数说明
此函数原型如下:
void openlog(const char *ident, int option, int facility);
此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
openlog的第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数option是下列值取与运算的结果:LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID,各值意义请参考man openlog手册:
LOG_CONS
Write directly to system console if there is an error while sending to system logger.
LOG_NDELAY
Open the connection immediately (normally, the connection is opened when the first message is logged).
LOG_NOWAIT
Don’t wait for child processes that may have been created while logging the message. (The GNU C library does not create a
child process, so this option has no effect on Linux.)
LOG_ODELAY
The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called. (This is the default, and need
not be specified.)
LOG_PERROR
(Not in SUSv3.) Print to stderr as well.
LOG_PID
Include PID with each message.
第三个参数指明记录日志的程序的类型。
syslog函数及参数
syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
void syslog(int priority, const char *format, ...);
第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。
如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。