【发布时间】:2012-03-07 04:33:21
【问题描述】:
我正在编写一个服务器程序。在这个程序中,我记录了分配。日志记录(对于服务器)是否习惯于覆盖以前运行的日志,使用某种新的运行标头附加到文件中,或者创建一个新的日志文件(它不会经常重新启动)。
这些解决方案中,Linux/Unix/MacOS下的处事方式有哪些?
另外,谁能推荐一个 C++/C 的日志库?无论上述问题的答案如何,我都需要一个。
【问题讨论】:
我正在编写一个服务器程序。在这个程序中,我记录了分配。日志记录(对于服务器)是否习惯于覆盖以前运行的日志,使用某种新的运行标头附加到文件中,或者创建一个新的日志文件(它不会经常重新启动)。
这些解决方案中,Linux/Unix/MacOS下的处事方式有哪些?
另外,谁能推荐一个 C++/C 的日志库?无论上述问题的答案如何,我都需要一个。
【问题讨论】:
查看 /var/log/...您会看到文件的结构类似于
serverlog
serverlog.1
serverlog.2
这是由 logrotate 在 cronjob 中调用的。但是文件中的所有内容都按时间顺序排列。所以你应该每次都附加到同一个日志文件,如果需要的话让 logrotate 将它拆分。
您还可以将配置文件添加到 /etc/logrotate.d/ 以控制特定日志的轮换方式。根据您的日志文件有多大,在此处添加有关您的日志记录的信息可能是个好主意。您可以查看此目录中的其他文件以了解语法。
【讨论】:
man logrotate,或google。简短的版本是它完全按照 Magnesium 所说的那样做:拆分/旋转日志。支持系统上事物日志的配置位于/etc/logrotate.conf 和/etc/logrotate.d/*
logfile,将前一个存档为logfile.1,并将该存档移动到logfile.2,等等。它也只保留一些存档,因此使用的空间不会增长控制权。
writeLog(char* msg) 将新行写入日志文件,其中包含 timestamp \t msg。如果你愿意,你甚至可以把它变成一门课,但即便如此,恕我直言。
这是一个相当复杂的问题。我认为没有灵丹妙药可以一次性解决您的所有顾虑。
决定遵循什么政策的第一步是设置您的要求。 为什么要记录每个条目?它的目的是什么?在大多数情况下,这会导致一些相当具体的事实,例如:
您需要能够比较当前日志与过去的日志。即使错误消息是不言而喻的,导致它的过程也可以通过找出差异来更快地确定,而不是通过服务器执行流程图令人费解 - 或者更糟糕的是,它的源代码。这意味着您需要至少一个过去运行的日志 - 盲目地覆盖是明确的否。
您需要能够find 和parse 日志,而不会妨碍您。这意味着使用任何已经建立的设施和政策。在 Linux 上,这意味着使用 syslog 工具来处理重要消息,以允许它们出现在通常的位置。
还有一些好的建议需要注意:
时间很重要。不仅因为它永远不够,还因为没有每个条目的正确时间戳的日志文件实际上是无用的。确保每个条目都有一个时间戳 - 大多数系统范围的日志记录工具都会为您执行此操作。还要确保您所有计算机上的时钟尽可能准确 - 使用 NTP 是一种很好的方法。
日志条目应尽可能独立,尽量减少杂乱。您不需要有一个带有颜色、花里胡哨的特殊标题来宣布您的服务器正在启动 - 一个简单的 MyServer (PID=XXX) 从端口 YYYYY 开始就足以满足 grep (或任何像样的日志查看器的搜索功能)来查找。
您需要确定每个日志记录通道的粒度。将几 GB 的调试日志数据发送到系统日志记录守护程序不是一个好主意。一个好的方法可能是为每个日志记录级别和设施使用单独的日志文件,例如用户活动不会与仅在调试代码时有用的低级数据混在一起。
确保您的日志文件位于一个位置,最好与其他应用程序分开。以您的应用程序名称命名的目录是一个好的开始。
保持正常。当然,您可能已经设计了一个新的漂亮的日志文件命名方案,但如果它违反了系统中的约定,即使是最有经验的操作员也很容易混淆。大多数人将不得不在危急情况下查看您更详细的日志 - 不要让他们更难。
使用系统日志处理工具。例如。在 Linux 上,这意味着附加到同一个文件并让像 logrotate 这样的外部守护进程来处理日志文件。它不仅会减少您的工作量,而且还会自动维护所有常规日志记录策略。
最后:始终将日志重要数据也复制到系统日志中。操作员查看系统日志。拜托,拜托,拜托不要让他们看其他地方,只是为了发现你的应用程序即将启动洲际弹道导弹......
【讨论】:
https://stackoverflow.com/questions/696321/best-logging-framework-for-native-c
对于日志,我建议创建一个新的日志文件并使用一定的频率清理它,以避免它变得太胖。覆盖以前登录的日志通常是个坏主意。
【讨论】: