2012-02-15 106 views
2

我有一个服务器程序,我正在写。在这个程序中,我记录了分配。在日志记录(对于服务器)中,习惯上覆盖以前运行的日志,使用某种新的运行头追加到文件,或创建新的日志文件(它不会经常重新启动)。记录礼仪

哪个这些解决方案是在Linux/Unix的/ MacOS的做事方式?

而且,任何人都可以建议为C++/C一日志库?无论上述问题的答案如何,我都需要一个。

回答

3

看一看在/var/log/...you'll看到文件的结构类似于

serverlog 
serverlog.1 
serverlog.2 

这是通过logrotate做这就是所谓的一个cronjob。但是一切都只是按照文件内的时间顺序排列。所以你应该每次追加到相同的日志文件,并让logrotate根据需要进行分割。

您还可以添加一个配置文件来/etc/logrotate.d/来控制特定日志如何旋转。根据日志文件的大小,在这里添加有关日志记录的信息可能是个好主意。您可以查看此目录中的其他文件以查看语法。

+0

'logrotate'?那是什么? – Linuxios 2012-02-15 19:43:44

+1

@ Linux_iOS.rb.cpp.c.lisp.m.sh:请参阅'man logrotate'或Google。简短的说法是它完全符合镁的说法:分裂/旋转原木。支持系统中日志的配置位于'/etc/logrotate.conf'和'/etc/logrotate.d/ *' – Cascabel 2012-02-15 19:47:37

+0

@ Linux_iOS.rb.cpp.c.lisp.m.sh logrotate is一个运行在Linux上的守护进程(可能是其他Unix,我不确定),并保持日志文件的控制权。每隔一段时间它会启动一个新的日志文件'logfile',将前一个日志文件归档为'logfile.1',并将该归档文件移动到'logfile.2'等等。它也只保留一些归档文件,以便使用的空间不会不会失去控制。 – austin1howard 2012-02-15 19:49:10

2

这是一个比较复杂的问题。我不认为有一个银弹可以一举消灭你所有的担忧。

决定跟随什么样的政策将设置你的要求的第一步。 为什么每项记录?它的目的是什么?在大多数情况下,这将导致一些比较具体的事实,如:

  • 你需要能够比较当前日志与过去的日志。即使错误消息是不言而喻的,通过播放差异性,而不是通过服务器执行流程图令人费解 - 或者更糟糕的是,它的源代码,可以更快地确定导致该错误消息的进程。这意味着你需要从过去的运行至少一个记录 - 覆盖一味是一个明确的没有

  • 你需要能够找到解析日志不走出去,你的方式。这意味着使用任何设施和政策已经建立。在Linux上,这意味着使用syslog工具设置重要的消息,以允许它们出现在通常的地方。

也有一些很好的建议听从:

  • 时间是非常重要的。不仅仅是因为它永远不够,而且因为没有适合每个条目的日志文件实际上是无用的。确保每个条目都有一个时间戳 - 大多数系统范围的日志记录工具都会为你做到这一点。请确保所有计算机上的时钟都尽可能准确 - 使用NTP是实现这一目标的好方法。

  • 日志条目应尽可能自包含,最小限度的残留。你不需要有一个特殊的标题,用颜色,花里胡哨宣布你的服务器正在启动 - 一个简单的MyServer(PID = XXX)开始于端口YYYYY就足够了grep(或任何搜索功能体面的日志查看器)来查找。

  • 您需要确定每个日志记录通道的粒度。将几个GB的调试日志数据发送到系统日志记录守护进程是而不是是一个好主意。一种好的做法可能是为每个日志级别和设施使用单独的日志文件,以便例如用户活动不会与仅在调试代码时有用的低级数据混淆。

  • 确保您的日志文件在一个的地方,最好与其他应用程序分开。具有应用程序名称的目录是一个好的开始。

  • 保持在常态。当然你可能已经设计了一个新的漂亮的日志文件命名方案,但如果它打破了系统中的约定,即使是最有经验的操作员也很容易混淆。在危急情况下,大多数人都必须查看更详细的日志 - 不要让它们变得更难。

  • 使用系统日志处理设施。例如。在Linux上,这将意味着追加到同一个文件,并让像logrotate这样的外部守护进程来处理日志文件。它不仅会减少你的工作量,而且还会自动维护整个日志记录策略。

  • 最后:总是将日志重要数据复制到系统日志中。操作员观看系统日志。请,请,请不要让他们来看看其他地方,只是为了找出你的应用即将推出的洲际弹道导弹......