Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用日志框架的意义是什么?_C#_.net_Logging - Fatal编程技术网

C# 使用日志框架的意义是什么?

C# 使用日志框架的意义是什么?,c#,.net,logging,C#,.net,Logging,我想我可能忽略了为您的应用程序提供日志框架的要点。在所有的小应用程序中,我总是编写一个小的“Logging”类,只需将日志消息传递给其中写入文件的方法 像log4net这样的第三方日志框架的用途是什么?记录写操作是线程安全还是我遗漏了什么?您可能希望切换到数据库以获取一些消息,或者切换到一个报警系统,以向穷人提供支持 不过,更重要的是,大多数日志框架允许您指定不同类的日志级别,这样您就不需要在每次需要更多/更少日志记录时都剪切一个新的二进制文件(即针对您刚才在生产中发现的错误的详细日志记录) 根

我想我可能忽略了为您的应用程序提供日志框架的要点。在所有的小应用程序中,我总是编写一个小的“Logging”类,只需将日志消息传递给其中写入文件的方法


像log4net这样的第三方日志框架的用途是什么?记录写操作是线程安全还是我遗漏了什么?

您可能希望切换到数据库以获取一些消息,或者切换到一个报警系统,以向穷人提供支持

不过,更重要的是,大多数日志框架允许您指定不同类的日志级别,这样您就不需要在每次需要更多/更少日志记录时都剪切一个新的二进制文件(即针对您刚才在生产中发现的错误的详细日志记录)


根据您自己的日志系统实现的智能程度,提供了更多详细信息

在java中,如果您想继承日志类型等,可能会有太多麻烦,您更喜欢使用第三方工具,如Log4J。我想C#也有类似的情况。类似地,如果要从命令行确定日志级别


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

一句话:灵活性。Log4xxx使您能够执行不同的日志记录级别,将不同的代码模块记录到不同的文件中,并且无论遇到什么奇怪的情况,您都可以相信它是可靠的(如果磁盘空间不足,您的记录器会怎么做?)其他注释忽略了一点:如果已经有一个库可以满足您的需要,那么您就不用编写代码了

您可能在这里玩语义游戏:对我来说,“日志框架”通常只不过是一个将日志消息写入文件的类。。。因此,您所做的就是编写自己的日志框架。既然您已经这样做了,那么“使用日志框架”显然是有道理的


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

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

这是一个很好的问题

第一个原因是“为什么不呢?”如果您使用的是日志框架,那么您将从使用已经打包的东西中获得可维护性的好处

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

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

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


但实际上,第一个答案是最好的;写自己的东西没有什么好处,也有一大堆缺点。

仅仅为了一个论点,为什么不写一本成熟的国产书呢?它不会带来任何额外的行李,你可以完全控制它


大多数日志框架都有太多的功能,我们实际上不会使用它们中的大多数,并且说它们有自己的包袱(只是它不是一个类,它是一个框架)。为什么不实现一个简单的本地日志记录,其中所有应用程序都将日志写入队列,而一个简单的脱机服务(可能是windows服务)读取队列并将其写入所需的位置(文件、数据库等)。通过使用队列,您可以实现异步操作,并且不会出现锁定问题。

“附加到文件很容易就死了”—与多线程,尤其是多核相比,线程实际上是同时执行的?微软的ETW为每个处理器提供ETW条目缓冲,在我看来这是一个理想的解决方案。我要指出,古老的methaphor“不要再发明轮子”。大多数框架都经过优化,几乎不影响性能。像Apache这样的公司在他们的应用程序中内置了日志框架,因为利大于弊。大多数日志框架有太多的功能,我们实际上不会使用,按照这种逻辑,你也会开发自己的汽车,因为大多数现代汽车都有很多我们真正不会使用的功能我不太清楚你在这里说的是什么,或者它是如何回答这个问题的。您建议,与其使用第三方日志框架,不如编写自己的框架。您建议使用整个服务跨应用程序共享队列,以将消息提交到存储;这怎么“简单”?就其本身而言,这不就是一个庞大而复杂的“框架”吗?另外,问题是关于如何实现“小应用程序”的日志记录,但您建议将小应用程序与大日志记录机制结合起来?