2008-10-01 139 views
61

所以我有一个Linux系统上运行的守护进程,我想记录它的活动:日志。问题是,完成这个任务的“最佳”方法是什么?Linux中的守护进程日志记录

我的第一个想法是简单地打开一个文件并写入它。

FILE* log = fopen("logfile.log", "w"); 
/* daemon works...needs to write to log */ 
fprintf(log, "foo%s\n", (char*)bar); 
/* ...all done, close the file */ 
fclose(log); 

这种方式有什么天生的错误吗?有没有更好的方法,比如一些嵌入到Linux中的框架?

回答

92

Unix已经有很长时间了一个特殊的日志框架syslog。键入你的外壳

man 3 syslog 

你会得到它的C接口的帮助。

Someexamples

#include <stdio.h> 
#include <unistd.h> 
#include <syslog.h> 

int main(void) { 

openlog("slog", LOG_PID|LOG_CONS, LOG_USER); 
syslog(LOG_INFO, "A different kind of Hello world ... "); 
closelog(); 

return 0; 
} 
+3

“man 3 ...”!我不知道这件事。 – codemonkey 2008-10-01 17:00:47

0

有很多潜在的问题:例如,如果磁盘已满,你希望你的守护进程失败?此外,您每次都会覆盖您的文件。通常使用一个循环文件​​,这样您的文件就可以在机器上分配空间,但是您可以保留足够的历史记录而不占用太多空间。 有像log4c这样的工具可以帮助你。如果你的代码是C++,那么你可能会考虑Apache项目中的log4cxx(apt-get install ubuntu/debian上的liblog4cxx9-dev),但它看起来像你使用的C.

21

可能会是一个 是赛马,但是如果不是所有的Un * x衍生物都存在于大多数系统日志工具中,则是首选的方式。没有什么错记录到文件,但它在你的肩膀离开任务的数量:

  • 有没有在你的记录位置的文件系统来保存文件
  • 约缓冲(性能什么)vs刷新(在系统崩溃前获取日志)
  • 如果您的守护程序运行很长时间,您会如何处理不断增长的日志文件。

Syslog负责为您提供所有这些,以及更多。这个API与printf族相似,所以你应该没有任何问题适应你的代码。

2

如上所述,您应该查看syslog。但是如果你想写自己的日志代码,我建议你使用fopen的“a”(写入附加)模式。编写自己的日志代码的一些缺点是:日志轮转处理,锁定(如果你有多个线程),同步(你是否想等待日志写入磁盘?)。系统日志的一个缺点是应用程序不知道日志是否已写入磁盘(它们可能已丢失)。

2

Syslog是一个不错的选择,但你不妨考虑看着log4c。 log4 [something]框架在其Java和Perl实现中运行良好,并允许您从配置文件中选择登录到syslog,控制台,平面文件或用户定义的日志编写器。您可以为每个模块定义特定的日志上下文,并将每个上下文日志记录在您的配置定义的不同级别。 (跟踪,调试,信息,警告,错误,关键),并让守护程序通过捕获信号来即时重新读取配置文件,从而允许您在运行的服务器上操作日志级别。在较大的(或更安全意识的)安装系统日志的

11

另一个优点:syslog守护程序可以被配置为将日志发送到另一个服务器,用于记录,而不是(或除了)本地文件系统存在。

将服务器场的所有日志放在一个地方,而不是在每台计算机上分别读取它们会更方便,尤其是当您试图将一台服务器上的事件与另一台服务器上的事件相关联时。而且,当一个人被破解时,你不能再相信它的日志了......但是如果日志服务器保持安全,你就知道什么都不会从它的日志中删除,所以任何入侵记录都将保持不变。

2

如果使用线程和使用记录作为调试工具,你将要寻找使用某种线程安全的日志库,但解锁环缓冲区。每个线程一个缓冲区,仅在严格需要时才有全局锁定。

这避免了记录在软件造成严重减速,并避免创建当您添加调试日志记录其变化heisenbugs。

如果有日志记录和一些不错的日志分析和显示工具时不会浪费时间与格式操作的高速压缩的二进制日志格式,这是一个奖金。

我会提供一些这方面的好代码的引用,但我没有一个自己。我只想要一个。 :)

1

我们的嵌入式系统没有系统日志,所以我写的守护进程做调试到使用类似于你如何描述它的“一”开放式的文件。我有一个函数打开一个日志文件,吐出消息,然后关闭文件(我只在遇到意外事件时执行此操作)。不过,我也不得不编写代码来处理其他评论者所提到它由“尾巴-c 65536日志文件> logfiletmp & & MV logfiletmp日志文件”日志旋转。这很粗糙,也许应该被称为“日志正面截断”,但它会阻止我们的基于小型RAM磁盘的文件系统填满日志文件。