制作日志文件

Sus*_*ain 22 linux c logs syslog

有没有什么办法可以在linux中借助一些库函数或系统调用在/var/log/中创建一个日志文件来维护/var/log/中的一些数据。我也想知道我们应该遵循什么标准来编写和处理日志。谢谢

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(仅用于紧急情况)用DEBUGINFOERR为最常用。请参阅man 3 syslog您的选择。

第二个和第三个参数是格式和消息,就像 printf 一样。

出现在哪个日志文件中取决于您的系统日志设置。

使用默认设置,它可能会进入/var/log/messages.


您可以通过使用该范围内的设施之一设置自定义日志文件LOG_LOCAL0LOG_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或更重要的将被记录,包括INFONOTICEERR(误差), CRIT(关键的),等,但不DEBUG


或者,如果你有rsyslog,你可以尝试一个基于属性的过滤器,例如

:syslogtag, isequal, "programname:"    /var/log/programname.log
Run Code Online (Sandbox Code Playgroud)

syslogtag 应该包含一个“:”。

或者,如果您打算将您的软件分发给其他人,那么依赖使用LOG_LOCALrsyslog过滤器可能不是一个好主意。

在这种情况下,您应该使用LOG_USER(如果它是普通程序)或LOG_DAEMON(如果它是服务器),使用 编写启动消息和错误消息syslog,但将所有日志消息写入syslog. 例如,Apache HTTPd 记录到/var/log/apache2/*or /var/log/httpd/*,我假设使用常规的open/fopenwrite/printf调用。