Linux中的守护程序日志记录


67

因此,我有一个在Linux系统上运行的守护程序,并且我想要记录其活动:日志。问题是,完成此任务的“最佳”方法是什么?

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

用这种方式记录日志有天生的错误吗?有没有更好的方法,例如Linux内置的某些框架?

Answers:


101

Unix已经有很长一段时间专门用于syslog的日志记录框架了。输入您的外壳

您将获得有关C接口的帮助。

一些 例子


4
有趣的是,现在已针对Linux建议对该古老工具进行更改。参见h-online.com/open/news/item/…–
Vinko Vrsalovic

2
@ opc0de取决于配置(/etc/syslog.conf或较新的系统/etc/rsyslog.conf或随附的内容,/ etc / rsyslog.d / *。conf)您的配置可能位于其他位置,请查看手册为您的系统
Vinko Vrsalovic

24

可能将是一场激烈的竞赛,但是是的,大多数(如果不是全部)Un * x派生词中都存在syslog工具,这是首选方法。记录到文件并没有错,但是它确实让您承担了许多任务:

  • 您的日志记录位置是否有文件系统来保存文件
  • 缓冲(性能)与刷新(在系统崩溃之前写入日志)怎么样?
  • 如果守护程序运行了很长时间,您将如何处理不断增长的日志文件。

Syslog会为您处理所有这一切,甚至更多。该API与printf家族相似,因此您在适应代码时应该没有问题。


12

在大型(或更注重安全性)安装中syslog的另一个优点:syslog守护程序可以配置为将日志发送到另一台服务器,以在该服务器上进行记录,而不是(或除此以外)本地文件系统。

将服务器场中的所有日志都放在一个地方,而不是必须在每台计算机上分别读取它们,更加方便,尤其是当您尝试将一台服务器上的事件与另一台服务器上的事件相关联时。而且,当一个人被破解时,您将无法再信任它的日志...但是,如果日志服务器保持安全,您将知道不会从其日志中删除任何内容,因此任何入侵记录都将保持完整。



2

Syslog是一个不错的选择,但是您不妨考虑查看log4c。log4 [something]框架在Java和Perl实现中运行良好,并且允许您-从配置文件中选择登录到syslog,控制台,平面文件或用户定义的日志编写器。您可以为每个模块定义特定的日志上下文,并使每个上下文日志处于配置定义的不同级别。(跟踪,调试,信息,警告,错误,关键),并通过捕获信号让守护进程即时读取该配置文件,从而允许您在运行的服务器上操纵日志级别。


2

如上所述,您应该查看syslog。但是,如果您想编写自己的日志记录代码,建议您使用fopen的“ a”(写附加)模式。

编写自己的日志代码的一些缺点是:日志轮转处理,锁定(如果有多个线程),同步(是否要等待日志写入磁盘?)。syslog的缺点之一是应用程序不知道日志是否已写入磁盘(它们可能已经丢失)。


2

如果您使用线程并将日志记录用作调试工具,则需要查找使用某种线程安全但未锁定的环形缓冲区的日志记录库。每个线程一个缓冲区,仅在严格需要时才使用全局锁。

这样可以避免日志记录导致软件严重减速,并且避免创建在添加调试日志记录时发生变化的heisenbug。

如果它具有高速压缩的二进制日志格式,并且不会在日志记录期间进行格式操作以及一些不错的日志解析和显示工具而浪费时间,那么这是一个额外的好处。

为此,我将提供一些好的代码的参考,但我自己却没有。我只想要一个。:)


1

我们的嵌入式系统没有syslog,因此我编写的守护程序使用类似于您所描述的“ a”打开模式来调试文件。我有一个打开日志文件,吐出消息然后关闭文件的功能(我仅在发生意外情况时才这样做)。但是,我还不得不编写代码来处理日志轮换,正如其他评论者所提到的那样,它由“ tail -c 65536 logfile> logfiletmp && mv logfiletmp logfile”组成。这很粗糙,也许应该称为“日志前端截断”,但是它阻止了基于小型RAM磁盘的文件系统填充日志文件。


0

存在很多潜在的问题:例如,如果磁盘已满,您是否希望守护程序失败?另外,您每次都会覆盖文件。通常,使用循环文件,以便在计算机上为文件分配空间,但是可以保留足够的历史记录以供使用,而不会占用太多空间。有诸如log4c之类的工具可以为您提供帮助。如果您的代码是c ++,则可以考虑在Apache项目中使用log4cxx(在ubuntu / debian上apt-get install liblog4cxx9-dev),但看起来您正在使用C。


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.