20

我想我可能错过了为您的应用程序提供日志记录框架的意义。在所有的小应用程序中,我总是编写一个小的“日志记录”类,并将日志消息传递给其中的一个方法,该方法写入文件中。

像 log4net 这样的 3rd 方日志框架的目的是什么?记录写入操作是线程安全的还是我遗漏了什么?

4

7 回答 7

23

这是一个很好的问题。

第一个原因是“为什么不呢?” 如果您使用的是日志框架,那么您将获得使用已打包内容的可维护性优势。

第二个原因是日志记录很微妙。不同的线程、会话、类和对象实例都可能在日志记录中发挥作用,您不希望即时解决这个问题。

第三个原因是您可能会在代码中发现性能瓶颈。弄清楚你的代码很慢,因为你正在写入一个没有缓冲的文件,或者你的硬盘驱动器已经用完了磁盘空间,因为记录器没有翻转和压缩旧文件,这可能会让人头疼。

第四个原因是您可能希望追加到 syslog、写入数据库、套接字或其他文件。框架内置了这个功能。

但实际上,第一个答案是最好的。编写自己的代码没有什么好处,还有一大堆缺点。

于 2008-09-28T00:43:31.793 回答
3

您可能希望切换到登录到数据库以获取某些消息,或者切换到向可怜的人寻求支持的警报系统

更重要的是,大多数日志框架允许您指定不同类的日志级别,因此您无需在每次需要更多/更少日志记录时剪切新的二进制文件(您刚刚在生产中发现的错误的详细日志记录)

Log4Net 的网站有更多细节

于 2008-09-27T23:06:09.377 回答
3

其他评论省略了一些东西:如果已经有一个库可以满足您的需求,那么您就不必编写代码了

可能你在这里玩语义:对我来说,“日志框架”通常只不过是一个将日志消息写入文件的类......所以你所做的就是编写自己的日志框架。鉴于您已经这样做了,“使用日志框架”显然有一些意义!

最终,您将需要确保它正确处理并发日志记录(锁定输出流),可以记录到文件、系统日志等,可以进行日志滚动等等。您可以通过使用其他人经过良好测试的代码来节省自己的精力。

于 2008-09-27T23:40:18.293 回答
2

一句话:灵活性。Log4xxx 使您能够执行不同的日志记录级别,将不同的代码模块记录到不同的文件中,并且无论遇到什么奇怪的情况,您都可以依赖它是可靠的(如果磁盘空间不足,您的记录器会做什么?)

于 2008-09-27T23:20:45.020 回答
2

日志框架提供了灵活性并防止您重新发明轮子。我知道将任何现代语言附加到文件中都很简单,但是您的自制记录器是否有多个目标?您可以在运行时打开和关闭登录吗?当这些车轮免费提供时,为什么要冒爆胎的风险?

于 2008-09-28T00:14:19.180 回答
1

取决于您自己的日志记录系统实现的智能程度。

在java中,如果你想继承日志类型等,可能会比较麻烦,你更喜欢像Log4J这样的第三方工具。我认为 C# 也有类似的东西。同样,如果您想从命令行确定日志级别。

如果您只想路由所有 System.out 并控制是否在编译时打印它们,您自己的记录器就可以了。

于 2008-09-27T23:09:39.647 回答
0

只是为了争论,为什么不成熟的本土种植?它没有任何额外的行李,您可以完全控制它。

大多数 Logging 框架都有太多的特性,我们真的不会使用它们中的大多数,并且已经说过它们带有自己的包袱(它只是不是一个类,它是一个框架)。为什么不实现一个简单的本地日志记录,您的所有应用程序都将日志写入队列,一个简单的离线服务(可能是 Windows 服务)读取队列并将其写入您想要的位置(文件、数据库等)。通过使用队列,您可以实现异步操作并且没有锁定问题。

于 2018-09-27T19:49:26.723 回答