有没有办法在linux中借助一些库函数或c语言的系统调用来制作一个日志文件来维护/var/log/中的一些数据。我还想知道我们在编写和处理日志时应该遵循哪些标准。谢谢
答案1
从 C 程序记录的标准方法是syslog
。
首先包含头文件:
#include <syslog.h>
然后在程序的早期,您应该通过调用以下命令来配置系统日志openlog
:
openlog("programname", 0, LOG_USER);
第一个参数是标识或标签,它会自动添加到每条消息的开头。将您的程序名称放在这里。
第二个参数是您想要使用的选项,或者0
用于正常行为的选项。完整的选项列表位于man 3 syslog
.您可能会发现有用的一个是LOG_PID
,它使 syslog 也在日志消息中记录进程 ID。
然后,每次你想写一条日志消息时,你调用syslog
:
syslog(LOG_INFO, "%s", "Message");
第一个参数是优先级。优先级范围从DEBUG
(最不重要)到EMERG
(仅适用于紧急情况),其中DEBUG
、INFO
、 和ERR
是最常用的。请参阅man 3 syslog
您的选择。
第二个和第三个参数是格式和消息,就像 printf 一样。
该日志文件出现在哪个日志文件中取决于您的系统日志设置。
使用默认设置,它可能会进入/var/log/messages
.
LOG_LOCAL0
您可以使用to范围内的工具之一来设置自定义日志文件LOG_LOCAL7
。
您可以通过更改来使用它们:
openlog("programname", 0, LOG_USER);
到
openlog("programname", 0, LOG_LOCAL0);
或者
openlog("programname", 0, LOG_LOCAL1);
ETC。
并添加相应的条目/etc/syslog.conf
,例如
local1.info /var/log/programname.log
并重新启动系统日志服务器,例如
pkill -HUP syslogd
.info
上面的部分意味着local1.info
所有重要或更重要的消息都会INFO
被记录,包括INFO
,,(错误),(严重)等,但不记录。NOTICE
ERR
CRIT
DEBUG
或者,如果你有rsyslog
,你可以尝试一个基于属性的过滤器,例如
:syslogtag, isequal, "programname:" /var/log/programname.log
syslogtag 应包含“:”。
或者,如果您计划将软件分发给其他人,那么依赖使用LOG_LOCAL
或rsyslog
过滤器可能不是一个好主意。
在这种情况下,您应该使用LOG_USER
(如果它是普通程序)或LOG_DAEMON
(如果它是服务器)使用 编写启动消息和错误消息syslog
,但将所有日志消息写入syslog
.例如,Apache HTTPd 记录到/var/log/apache2/*
或/var/log/httpd/*
,我假设使用常规open
/fopen
和write
/printf
调用。
答案2
您将需要#include <syslog.h>
,然后使用这些syslog()
功能将数据发送到任何处于活动状态的系统日志程序。
请参阅手册页在这里。
答案3
有很多可能性,你的计划是什么?您只需要一个从命令行登录的选项吗?看看logger
(包含在bsdutils)。只需输入:
usr@srv % logger test
它会将这样的内容记录到您的/var/log/syslog
:
Apr 25 07:55:15 localhost usr: test
也可以看看man logger
。根据您的日志守护程序,您可以将这些消息排序到特定文件或按优先级过滤它们。
还有一些针对不同编程语言的解决方案,所以请告诉我你想做什么;-)
答案4
按程序名称过滤的写法与上面提到的不同,对于最新版本rsyslog
(我的机器上的版本是5.8.6)如下所示:
if $programname == 'popa3d' then /var/log/popa3d.log
欲了解更多信息,请查看这里