Anduin Xue
Anduin Xue

Anduin's Tech Blog

Logging


Why you should never use `Console.WriteLine`

本文讨论了为什么在编写库代码时应避免使用`Console.WriteLine`,并提供了一些替代方案。使用`Console.WriteLine`会将库与标准输出紧密耦合,并假设调用代码关注标准输出。然而,如果库代码被单元测试套件或使用不同日志记录范例的Web服务器调用,情况将会如何? 根据依赖反转原则,高级模块不应该依赖于低级模块,而应该依赖于抽象(如接口)。此外,抽象不应该依赖于细节,细节(具体实现)应该依赖于抽象。控制台是应用程序依赖的低级模块,而日志记录是与业务相关的高级模块。因此,日志记录不应该依赖于控制台,而应该有一些抽象,如`ILogger`接口,它描述了可以提供日志记录服务的对象。 使用`Console.WriteLine`的原因有以下几点: - 无法确保控制台始终被消费和阅读。 - 需要重建项目以支持更多日志记录服务,如文件、ApplicationInsights、数据库日志记录。 - 应该遵循依赖反转原则,不依赖于低级模块,如`Console.WriteLine`。 - GUI应用程序无效,但可能提供其他日志记录窗口,如输出窗口。 - 控制台日志记录在扩展服务器端应用程序时难以跟踪和诊断。 - 难以为日志设置级别、时间戳和来源。 解决方案包括: - 使用`ILogger`代替`Console` - 使用`ILogger`的各种方法,如`ILogger.LogInformation`、`ILogger.LogCritical`等。 本文还讨论了如何获取实现`ILogger`接口的控制台日志记录器,并提供了相关的代码示例。此外,还介绍了如何在不使用依赖注入的情况下获取日志记录器的最小代码。 最后,本文指出,在某些特定情况下,可以使用`Console`类,例如构建一个终端用户界面应用程序,该应用程序永远不希望标准输出流被重定向到控制台之外的地方,或者在实现支持控制台日志记录的`ILogger`时。--GPT 4

C# .NET Core Console App .NET Logging ILogger

  • 1