为错误创建日志编写器的最佳实践

10

最近我一直在进行一些深入的工作,想知道你认为哪种日志记录方式更好。

A. 每次想要写入日志时,打开文件、写入内容,然后立即关闭文件,这样在发生关键性故障或崩溃时不会真正丢失信息。

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

还有其他建议吗?对于需要记录的大量文本,我不想整天打开和保存,但也不想失去信息的详细程度。我在使用C++编写代码,很抱歉之前没有提到。

5个回答

5
据我所知,流刷新通常(被要求)相当于保存。
也就是说,当你说:
file.flush();

一切等待编写的内容都已经编写完成。需要注意的是,std::endl;也会调用flush函数。所以,在输出完信息后,只需保持文件打开状态并进行刷新即可。


我已经编写了基本的文本记录器,但我认为在未来的项目中,我将使用一个库,所以感谢那些为我提供这些库的人。 - Craig

3
最好的解决方案是使用现有的库。有许多良好、经过测试和流行的库可供选择。它们通常提供您所需的所有灵活性,并节省了管理文件的麻烦。此外,它们允许您将日志保存到各种目标,而不一定是文件。我使用了Google Log Library和ACE: ACE是一个大型的库,日志只是其中的一小部分,因此如果您只需要日志记录,那么它可能不是一个好的选择。无论如何,不要尝试自己实现日志记录,将精力用于更有用的事情;除非您对日志引擎有特定的兴趣。

1

1
A. 每次我想写日志时,打开文件,写入内容,然后立即关闭它,这样在关键故障或崩溃的情况下就不会真正丢失信息。
B. 定期保存,可能是在每个主要部分完成后,这意味着我可以缩小错误范围。
还有其他建议吗?
只要再多动动脑筋,你就能想出数十种其他想法。问题在于编写记录器可以变得像你想象的那样复杂--记录器本身可以成为完整的软件。
这里有一篇我很喜欢的关于记录器类设计的文章。看一下吧。
如果您不愿意/没有带宽支持创建新的日志记录模块,请选择其他人已经建议的现有库。

如何选择正确的库?你真正需要担心的是你想要什么样的日志以及你所处的开发阶段。分类你的消息并查看库是否支持以明确和一致的方式对它们进行分类。你需要为你的消息使用多个接收器吗?你的库是否支持这一点?如果你的代码已经在生产中,你将需要更多的担心。你需要一个事务性日志系统吗?你需要操作的原子性(因此需要日志)吗?你需要能够回滚消息的能力吗?

希望这可以帮助到你。


0
在Unix系统中,有一个叫做syslog的东西(顺便说一下,它既是一个库调用,包括openlog和closelog,也是一个服务)。在Windows中,我相信有事件日志,但不知道其API。
无论如何,由于syslog(以及Windows中的事件日志)是通过IPC记录的(有时甚至可以通过网络远程记录),因此该过程是解耦的,并且不会受到程序崩溃的影响。这样,您还将转嫁保存文件的责任给syslog服务。请注意,这包括诸如日志轮换和压缩以及为评估所述日志文件使用标准化工具的内容(例如IDS)。
现在,话虽如此,系统崩溃(电源故障或其他原因)是完全不同的故事,但我不知道这是否是您关心的问题。如果您能详细说明您正在使用的系统类型,那么可能更容易建议更合适的解决方案。

这是一项大量的图像处理工作,使用非常大的图像(3GB+),并且有多个进程,进行分割、子分割和操作。还有存储为大型二进制文件的图像(主要是高度数据和经纬度),以及包含有关图像信息的字符串处理文件。 - Craig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接