守护进程之出错记录


与守护进程有关的一个问题是如何处理出错消息。因为它没有控制终端,所以不能只是简单地写到标准出错上。在很多工作站上,控制台设备运行一个窗口系统,所以我们不希望所有守护进程都写到控制台设备上。我们也不希望每个守护进程将它自己的出错消息写到一个单独的文件中。对系统管理人员而言,如果要关心哪一个守护进程写到哪一个记录文件中,并定期地检查这些文件,那么一定会使他感到头痛。所以,需要有一个集中的守护进程出错记录设施

自4.2BSD以来,BSD syslog设施得到了广泛的应用。大多数守护进程使用这一设施。图13-1显示了syslog设施的详细组织结构。

openlog( *ident, option, syslog( priority, * closelog( setlogmask(

调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是也选择的——它只是关闭曾被用于与syslog守护进程通信的描述符。

调用openlog使我们可以指定一个ident,将它加至每则日志消息中。ident一般是程序的名称(例如,cron、inetd等)。option参数是指定许多选项的位屏蔽。表13-1说明了可用的option(选项)。若某选项在Single UNIX Specification的openlog定义中已包括,则其XSI列用一个墨点表示。

                                                   表13-1 openlog的option参数

, filename

第一个调用将ident字符串设置为程序名,指定打印该进程ID,并且将系统默认的facility设定为行式打印机系统。对syslog的调用指定一个出错状态和一个消息字符串。如若不调用openlog,则第二个调用的形式可能是:

syslog(LOG_ERR | LOG_LPR, , filename);

其中,将priority参数指定为level和facility的组合。

除了syslog,很多平台还提供它的一种变体处理可变参数列表。

#include <syslog.h><stdarg.h>
 vsyslog( priority,   *format, va_list arg);

大多数syslog实现将使消息短时间处于队列中。如果在此段时间中到达了重复消息,那么syslog守护进程将不把它写到日记记录中,而是打印输出一条消息,类似于“上一条消息重复了N次”。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

相关内容