制作日志文件


22

有什么方法可以通过一些库函数或Linux中用C语言进行的系统调用来制作用于维护/ var / log /中的某些数据的日志文件。我还想知道编写和处理日志时应遵循的标准。谢谢


请注意,编程问题通常不在这里讨论;您应该在Stack Overflow上询问他们。这里可以对API进行解释,但是有关如何在C或其他编程语言中使用它的解释通常属于Stack Overflow。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


31

从C程序登录的标准方法是syslog

首先包括头文件:

#include <syslog.h>

然后在程序的早期,您应该通过调用openlog以下命令配置syslog :

openlog("programname", 0, LOG_USER);

第一个参数是标识或标签,它会在每条消息的开头自动添加。在此处输入程序的名称。

第二个参数是您要使用的选项,或0用于正常行为的选项。选项的完整列表在中man 3 syslog。您可能会发现有用的一个是LOG_PID,它使syslog还在日志消息中记录进程ID。

然后,每次您想写一条日志消息时,都调用syslog

syslog(LOG_INFO, "%s", "Message");

第一个参数是优先级。从优先级范围DEBUG(最重要的), EMERG(仅用于紧急情况)用DEBUGINFOERR为最常用。请参阅man 3 syslog以获取您的选择。

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

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

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


您可以使用LOG_LOCAL0to 范围内的工具之一来设置自定义日志文件LOG_LOCAL7

您可以通过以下方式使用它们:

openlog("programname", 0, LOG_USER);

openlog("programname", 0, LOG_LOCAL0);

要么

openlog("programname", 0, LOG_LOCAL1);

等等

并将相应的条目添加到/etc/syslog.conf,例如

local1.info /var/log/programname.log

并重新启动系统日志服务器,例如

pkill -HUP syslogd

所述.info的部分local1.info以上意味着是所有消息INFO或更重要的将被记录,包括INFONOTICEERR(误差), CRIT(关键的),等,但不DEBUG


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

:syslogtag, isequal, "programname:"    /var/log/programname.log

syslog标签应包含“:”。

或者,如果您打算将软件分发给其他人,则依靠使用LOG_LOCALrsyslog筛选器可能不是一个好主意。

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


谢谢。这是非常有用的信息。但是,请您详细说明一下log_local0-7选项。例如。我想在self.log文件中写入我的数据(在日志行中有<self>字)。和一些登录其他文件。
Sushant Jain

@Sushant Jain:您的目标是哪个Linux发行版和版本?您是否有旧的syslog(ksyslogd)或rsyslog? rpm -qa | grep syslogdpkg -l '*syslog*'可能会告诉您哪个。
Mikel

坦率地说,log_local *是sysklogd当时唯一的syslog软件游戏。如今的软件,如syslog-ngrsyslog以及dsyslog存在并具有不仅仅是服务/水平更为复杂的过滤功能。
Shadur 2011年

非常感谢。我的问题已经解决。我还有一个有关解析存储在日志文件中的数据的查询。有什么好的方法可以做到这一点。实际上,我正在尝试制作系统统计工具。所以我需要它。
Sushant Jain

@舒斯坦·in那 乐意效劳。请将您的日志解析问题作为一个单独的问题发布,以便人们可以看到并提供正确的答案。
Mikel

2

您将需要#include <syslog.h>,然后使用syslog()功能将数据发送到任何活动的系统日志记录程序。

请参见此处手册页


syslog()函数将数据写入/ var / log / syslog。而我想将日志写入自己的文件中。
Sushant Jain

正如Mikel在下面说明的那样,您可以使用以下方式标记日志消息:syslog了解您是什么程序,然后配置syslog以将程序日志消息写入其他文件。
Caleb

1

有很多可能性,您的计划是什么?您是否只需要从命令行登录的选项?看一看logger(包含在bsdutils中)。只需输入:

usr@srv % logger test

它将类似这样的日志记录到您的/var/log/syslog

Apr 25 07:55:15 localhost usr: test

另见man logger。根据您的日志记录守护程序,您可以将这些消息分类到特定文件,或按优先级过滤它们。

对于不同的编程语言,还有一些解决方案,所以请告诉我您想做什么;-)


其实我想用C语言来做。我在mikel帖子中得到了信息。
Sushant Jain

1

对于程序的最新版本rsyslog(我的计算机上的版本为5.8.6),按程序名称进行过滤的方式与上面所述不同,如下所示:

if $programname == 'popa3d' then /var/log/popa3d.log

欲了解更多信息,请看这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.