创建日志编写器以获取错误的最佳实践

时间:2010-01-18 07:53:39

标签: c++ logging

我最近做过一些深入的工作, 我想知道你认为什么更适合伐木。 是不是更好。

一个。每次我想写入我的日志,打开文件,写入它    然后马上关闭它,这样就没有真正的失败机会了    在发生严重故障或崩溃的情况下的信息。

B中。可以在每个主要部分完成后定期保存    这意味着我可以缩小错误的范围。

还有其他建议吗? 我不想用大量文本打开和保存一整天 我需要录制,但我不想丢失我的信息粒度。 我是用C ++写的,很抱歉以前没有提过它。

5 个答案:

答案 0 :(得分:5)

据我所知,流刷新相当于保存是相当普遍的(强制性的?)。

也就是说,当你说:

file.flush();

写下等待写的一切。请注意,std::endl;也会调用flush。所以,保持开放状态,只需在信息转储后刷新。

答案 1 :(得分:2)

最好的解决方案是使用现有的库。那里有许多优秀,经过良好测试和流行的图书馆。它们通常为您提供所需的所有多功能性,并为您节省管理文件的麻烦。此外,它们允许您将日志保存到各种目标,而不一定是文件。我使用了Google Log Library和ACE:

ACE是一个很大的库,日志只是其中的一小部分,所以如果你只需要记录,也许它不是一个好的选择。无论如何,不​​要试图自己实现日志记录,省去更有用的东西;当然,除非您对记录引擎有特殊兴趣。

答案 2 :(得分:1)

我建议使用具有良好工具的Log for C++ (log4cpp)

答案 3 :(得分:1)

  

一个。每次我想写信给我   登录,打开文件,然后写入   马上把它关闭所以它有   没有真正丢失信息的机会   在严重故障的情况下或   崩溃。

     

B中。定期保存,也许之后   每个主要部分都已完成   意思是我可以缩小范围   错误是。

     

还有其他建议吗?

让你的大脑更长一点 - 你会想出其他几十个想法。问题是编写记录器可以像你想的那样复杂 - 记录器可以自己成为完整的软件。

Here这是一篇我非常喜欢的关于记录器类设计的文章。看一看。

如果您不愿意/没有带宽来支持创建用于记录的新模块,请像其他人已经建议的那样去寻找现有的库。

您如何选择合适的图书馆?您真正应该担心的是您想要什么样的日志以及您所处的开发阶段。对消息进行排序,看看库是否支持以清晰一致的方式对它们进行分类。您的邮件需要多个接收器吗?你的图书馆支持吗?如果您的代码正在生产中,您将不得不担心更多。您需要事务日志系统吗?您是否需要操作的原子性(以及日志)?您是否需要能够回滚邮件?

希望这有帮助。

答案 4 :(得分:0)

在Unix系统上,你有一个叫做syslog的东西(顺便提一下,它是一个库调用,还有openlog和closelog,以及一个服务)。在Windows中我认为有事件日志,但不知道那个API。

无论如何,由于syslog(以及Windows中的事件日志)通过IPC(有时甚至是通过网络远程登录)记录,因此该过程将被解耦,并且不会受到程序崩溃的影响。这样你就可以将保存文件的责任转嫁给syslog服务。请注意,这包括logrotation和压缩日志文件等内容,以及让您有机会使用标准化工具来评估所述日志文件(例如IDS)。

现在,那说,系统崩溃(电源故障,或其他什么)是一个完全不同的故事,我不知道你是否担心这个问题,如果你想详细说明什么样的系统你正在努力,建议更合适的东西可能更容易。