需要在执行期间记录消息的应用程序可以使用 syslog API。使用此接口的方式不止一种,这里只介绍其中一种。我强烈建议您查阅 openlog、syslog 和 closelog 函数的手册页。
openlog 调用接受三个参数。第一个参数是指向以 null 结尾的字符串的指针,用于标识消息的来源。这通常是程序名称。注意:这通常不是 argv[0]。argv[0] 字符串经常包含路径信息,这些信息只会使系统日志变得混乱。保持简短和简单。
第二个参数是一个整数,用于指定日志记录的选项。在 syslog.h 文件中定义了常量。这些是LOG_CONS, LOG_NDELAY, LOG_PERROR和LOG_PID。我不会描述所有这些,但我会提到它们可以与按位OR运算符 (|) 组合,并且LOG_PID以标准方式在日志中包含进程 ID,这通常很有用。此外,如果您的进程不是守护进程,您可能需要LOG_PERROR选项,该选项将导致 syslog 消息转储到 STDERR 以及 syslogd。这在前景进程中可能很有用。
第三个参数是“facility”(工具),如上所述。 syslog.h 文件定义了用于此处的常量,这些常量对应于 syslog.conf 文件中选择器的 facility 部分。这些是LOG_AUTHPRIV, LOG_CRON, LOG_DAEMON, LOG_LOCALn(其中n是 0 到 7 的数字,包括 0 和 7)和LOG_USER。此列表仅包括您可能在应用程序中使用的那些工具。有关其他工具,请参阅手册页。如果您不是系统的管理员,请咨询系统管理员以了解使用哪个工具。我建议LOG_DAEMON如果您正在编写守护进程,以及LOG_USER对于非守护进程。
syslog 调用实际上发送消息。它接受不定数量的参数,但您必须至少提供两个。第一个是优先级。有定义的值与 syslog.conf 文件中的级别匹配,包含在 syslog.h 文件中。这些是(按严重程度降序排列)LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO和LOG_DEBUG。同样,如果您不是系统的管理员,请咨询您的管理员以确定为要生成的各种消息使用哪个级别。我的个人意见(这只是我的意见;至关重要的是您咨询您的管理员)是LOG_CRIT及以上级别的消息应保留给需要系统管理员采取行动的情况。除非它会影响操作系统和标准系统组件的平稳运行,否则它不值得使用LOG_CRIT或更高版本。
在应用程序或业务功能级别,LOG_ERROR表示需要注意以维持应用程序正常运行的情况。LOG_WARNING报告其他异常情况(可以等待处理的情况)。LOG_NOTICE用于“已处理”或“预期”的异常(另一个判断调用)。LOG_INFO用于正常的系统操作消息。最后,LOG_DEBUG保留给“额外”消息,顾名思义,旨在帮助调试程序。
第二个参数是 printf 样式的格式字符串。与 printf 一样,syslog 可以使用带有格式字符串的变量参数,指定如何显示后续参数。格式标志与 printf 标志相同:有关详细信息,请参阅 printf 手册页。注意一个例外:syslog 添加了一个 printf 未提供的附加格式字符串。%m标志将被与当前值相关的字符串消息替换errno变量(这是字符串strerror将返回)。
最后一个函数 closelog 关闭程序的日志记录,应在程序终止之前调用。