Mik*_*kel 32
从 C 程序登录的标准方法是syslog
.
首先包含头文件:
#include <syslog.h>
Run Code Online (Sandbox Code Playgroud)
然后在程序的早期,您应该通过调用来配置 syslog openlog
:
openlog("programname", 0, LOG_USER);
Run Code Online (Sandbox Code Playgroud)
第一个参数是标识或标签,它会自动添加到每条消息的开头。将您的程序名称放在这里。
第二个参数是您要使用的选项,或0
用于正常行为的选项。完整的选项列表在man 3 syslog
. 您可能会发现有用的是LOG_PID
,它使 syslog 还在日志消息中记录进程 ID。
然后,每次你想写一条日志消息时,你调用syslog
:
syslog(LOG_INFO, "%s", "Message");
Run Code Online (Sandbox Code Playgroud)
第一个参数是优先级。从优先级范围DEBUG
(最重要的), EMERG
(仅用于紧急情况)用DEBUG
,INFO
和ERR
为最常用。请参阅man 3 syslog
您的选择。
第二个和第三个参数是格式和消息,就像 printf 一样。
出现在哪个日志文件中取决于您的系统日志设置。
使用默认设置,它可能会进入/var/log/messages
.
您可以通过使用该范围内的设施之一设置自定义日志文件LOG_LOCAL0
来LOG_LOCAL7
。
您可以通过更改来使用它们:
openlog("programname", 0, LOG_USER);
Run Code Online (Sandbox Code Playgroud)
到
openlog("programname", 0, LOG_LOCAL0);
Run Code Online (Sandbox Code Playgroud)
或者
openlog("programname", 0, LOG_LOCAL1);
Run Code Online (Sandbox Code Playgroud)
等等。
并将相应的条目添加到/etc/syslog.conf
,例如
local1.info /var/log/programname.log
Run Code Online (Sandbox Code Playgroud)
并重新启动系统日志服务器,例如
pkill -HUP syslogd
Run Code Online (Sandbox Code Playgroud)
所述.info
的部分local1.info
以上意味着是所有消息INFO
或更重要的将被记录,包括INFO
,NOTICE
,ERR
(误差), CRIT
(关键的),等,但不DEBUG
。
或者,如果你有rsyslog
,你可以尝试一个基于属性的过滤器,例如
:syslogtag, isequal, "programname:" /var/log/programname.log
Run Code Online (Sandbox Code Playgroud)
或者,如果您打算将您的软件分发给其他人,那么依赖使用LOG_LOCAL
或rsyslog
过滤器可能不是一个好主意。
在这种情况下,您应该使用LOG_USER
(如果它是普通程序)或LOG_DAEMON
(如果它是服务器),使用 编写启动消息和错误消息syslog
,但将所有日志消息写入syslog
. 例如,Apache HTTPd 记录到/var/log/apache2/*
or /var/log/httpd/*
,我假设使用常规的open
/fopen
和write
/printf
调用。