为什么要避免在库代码中使用 Console.WriteLine?

Nic*_*ick 0 .net c# .net-core

在编写供其他 C# 应用程序(某些 Web 应用程序、某些 AWS lambdas)使用的库时,将消息写入控制台有哪些缺点?如果开发人员有权访问日志,这些消息将不常见且操作不必要,但将有助于调试不常见的场景。

System.Console 上文档

不要使用 Console 类在无人参与的应用程序(如服务器应用程序)中显示输出。调用 Console.Write 和 Console.WriteLine 等方法在 GUI 应用程序中无效。

但没有解释为什么。

Nat*_*ini 6

Console.WriteLine在库中使用将您的库与标准输出紧密耦合,并假设调用代码(使用您的库的应用程序)正在关注标准输出。如果您的库代码被某人的单元测试套件调用怎么办?或者在使用不同日志模式的 Web 服务器上?

当试图追踪奇怪的问题时,从库代码发出跟踪和调试消息可能是一个很大的帮助,这是对的。登录库也不错,但库不应该假设 stdout 是调用应用程序想要使用日志的唯一方式。最好的方法是:

  1. 创建一个IMyLibraryLogger与您的库一起提供的简单界面。如果调用代码想要侦听调试消息,他们可以实现一个适配器,将您的接口连接到他们选择的日志记录系统。
  2. 根据您的库所针对的框架,使用Microsoft.Extensions.Logging.Abstractions作为通用记录器接口。这要求您的库面向 .NET Standard 2.0。

我在过去构建的库中完成了 #1 并且运行良好。我的客户的系统是否使用 log4net、Serilog 等并不重要。我的库只关心它发布的小型日志记录接口,并以安全的方式向它发送消息(如果它为空/未提供则无操作) .