Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2321325
  • 博文数量: 318
  • 博客积分: 8752
  • 博客等级: 中将
  • 技术积分: 4944
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 07:56
文章分类

全部博文(318)

文章存档

2019年(1)

2017年(2)

2016年(12)

2015年(2)

2014年(1)

2013年(17)

2012年(22)

2011年(9)

2010年(37)

2009年(33)

2008年(44)

2007年(43)

2006年(95)

分类: LINUX

2009-02-10 14:20:26

syslogd守护进程根据/etc/syslog.conf中的配置信息实现消息转发和处理。下面是该配置文件的具体信息:

# 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;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron
# Everybody gets emergency messages
*.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
local7.*                                                /var/log/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守护进程

 

1215

系统保留

local0local7

1623

保留给系统本地使用

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.noticemail.infomail.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

只选择优先级为infonoticewarning的消息

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的两行。

因为syslog消息能够用来实施拒绝服务攻击,所以除非syslogd-r标志启动,否则它不会接受来自其他机器的日志消息。默认情况下,syslogd也会拒绝充当第三方消息转发器,从一台网络主机来的消息不会再被发给另一台网络主机。使用-h标志能够取消这一功能。(如果您想让这些选项始终都被启用,那么对于RHELFedora,可以在脚本/etc/rc.d/init.d/syslog中加上这些标志,对于DebianUbuntu,可以在脚本/etc/init.d/sysklogd里加上这些标志。)
 
syslog(),openlog(),closelog()

    这里面的三个函数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函数写日志就行了。

阅读(2885) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~