zoukankan      html  css  js  c++  java
  • 守护进程之出错记录

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

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

    26822401_1333274738RyQz

                                                      图13-1 BSD syslog设施

    有三种方法产生日志消息:

    (1)内核例程可以调用log函数。任何一个用户进程通过打开(open)然后读(read)/dev/klog设备就可以读取这些消息。

    (2)大多数用户进程(守护进程)调用syslog(3)函数以产生日志消息。这使消息发送至UNIX域数据报套接字/dev/log。

    (3)在此主机上的一个用户进程,或通过TCP/IP网络连接到此主机的其他主机上的一个用户进程可将日志消息发向UDP端口514。注意,syslog函数并不产生这些UDP数据报,而是要求产生此日志消息的进程进行显示的网络编程。

    关于UNIX域套接字以及UDP套接字的细节,请参阅《UNIX网络编程》。

    通常,syslog守护进程读取三种格式的日志消息。此守护进程在启动时读一个配置文件,一般其文件名为/etc/syslog.conf,该文件决定了不同种类的消息应送向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示,而警告消息则可记录到一个文件中。

    该设施的接口是syslog函数。

    #include <syslog.h>
    void openlog(const char *ident, int option, int facility);
    void syslog(int priority, const char *format, ...);
    void closelog(void);
    int setlogmask(int maskpri);
    返回值:前日志记录优先级屏蔽值

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

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

                                                       表13-1 openlog的option参数

    20120202090818133

    openlog的参数facility可以选取表13-2中列举的值。注意,Single Unix Specification只定义了facility参数值的一个子集,该子集是在一个给定的平台上典型地可用的。设置facility(设施)参数的目的是可以让配置文件说明,来自不同设施的消息将以不同的方式进行处理。如果不调用openlog,或者以facility为0来调用它,那么在调用syslog时,可将设施作为priority参数的一个部分进行说明。

                                                        表13-2 openlog的facility参数

    20120202090818385

    调用syslog产生一个日志消息。其priority参数是facility和level的组合,它们可选取的值分别列于表13-2和表13-3中。level值按优先级从最高到最低按序排列。

                               表13-3 syslog中的level(按序排列)

    20140120164228390

    format参数以及其他参数传至vsprintf函数以便进行格式化。在format中,每个%m都先被代换成对应于errno值的出错消息字符串(strerror)。

    setlogmask函数用于设置进程的记录优先级屏蔽字。它返回调用它之前的屏蔽字。当设置了记录优先级屏蔽字时,除非消息的优先级已在记录优先级屏蔽字中设置,否则消息不被记录。注意,试图将该屏蔽字设置为0并不产生任何作用。

    很多系统也提供logger(1)程序,以其作为向syslog设施发送日志消息的方法。logger命令本是为了用于以非交互方式运行但又要产生日志消息的shell脚本的。

    实例

    在一个(假定的)行式打印机假脱机守护进程中,可能包含有下面的调用序列:

    openlog("lpd", LOG_PID, LOG_LPR);
    syslog(LOG_ERR, "open error for %s: %m", filename);

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

    syslog(LOG_ERR | LOG_LPR, "open error for %s: %m", filename);

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

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

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

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

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

  • 相关阅读:
    Js获取或计算时间的相关操作
    SqlServer删除表中重复的记录并保留一条
    获取js文件后的参数
    谷歌浏览器官方下载地址
    ionic项目中实现发短信和打电话
    ui-router传递参数
    ng-options用法详解
    html5 localStorage(本地存储)
    cordova插件之Local Notification(本地通知)
    AngularJS $http service
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3544267.html
Copyright © 2011-2022 走看看