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调用。