C# 设计应用程序范围日志记录系统的指导原则是什么?

C# 设计应用程序范围日志记录系统的指导原则是什么?,c#,design-patterns,logging,enterprise,C#,Design Patterns,Logging,Enterprise,目前我正在学习分层体系结构,我想知道如何在这样的设计中添加日志系统 现在让我们假设我们有三层: 表示层 业务层 数据访问层 并且假设只有更高级别的层知道下面一个级别的层。例如,表示层了解业务层,但不了解业务层 您应该在哪里实现通用记录器类 如果我在另一个项目中实现它,这意味着所有层都依赖于一个公共程序集,这可能是好的,也可能不是好的。尽管这可以通过依赖注入来克服 如果我在最高级别(在我们的例子中是表示层)实现它,它将违反单一责任原则 什么是实现日志机制的好地方 在实施之后,使用这样一个系统的方法

目前我正在学习分层体系结构,我想知道如何在这样的设计中添加日志系统

现在让我们假设我们有三层:

  • 表示层
  • 业务层
  • 数据访问层
  • 并且假设只有更高级别的层知道下面一个级别的层。例如,表示层了解业务层,但不了解业务层

    您应该在哪里实现通用记录器类

  • 如果我在另一个项目中实现它,这意味着所有层都依赖于一个公共程序集,这可能是好的,也可能不是好的。尽管这可以通过依赖注入来克服
  • 如果我在最高级别(在我们的例子中是表示层)实现它,它将违反单一责任原则
  • 什么是实现日志机制的好地方

    在实施之后,使用这样一个系统的方法是什么

  • 理想情况下,它应该能够捕获未捕获的异常,并将异常描述保存在某个地方
  • 您应该在哪里捕获异常?它们是否应该在最高层(表示层)捕获?还是应该在其他地方抓到他们
  • 将记录器传递给类的方法是什么?将方法/构造函数重载添加到项目中接受类似于
    ILogger
    的接口的所有内容中有意义吗

  • 正如你所看到的,我对这个主题非常困惑,在我目前的工作中,没有人对企业应用程序设计/分层设计有任何了解,即使他们正在设计企业应用程序。因此,如果您能为我指明正确的方向,我们将不胜感激。

    日志记录是一个跨领域的问题。这意味着它包含体系结构的所有层,将其作为一个单独的库来实现是有意义的。然而,这只是一个练习,因为已经有很好的解决方案,如Log4Net、NLog,甚至.NET自己的TraceSource

    我倾向于选择那些支持分层日志的(例如log4net)。这使得在生产系统中配置所需的跟踪级别更加容易。例如,您可以将
    MyApp.SomeNamespace
    的常规跟踪级别设置为
    Warning
    ,但也可以将特定类型(如
    MyApp.SomeNamespace.AnInterestingClass
    设置为
    Debug

    我不确定我是否理解“使用这种系统的方法是什么”部分

    您可以在任何需要的地方使用日志记录,在应用程序的所有层中,在每个需要它的方法中使用日志记录。我的印象是,您有一个集中处理和记录所有错误的地方的想法,但这些是独立的事情

    理想情况下,它应该能够捕获未捕获的异常并保存 某个地方的异常描述

    不,不应该。日志记录者将数据写入日志,他们不处理异常。日志记录不仅仅用于报告错误。您还希望记录应用程序的执行情况和许多内部信息(但跟踪级别不同),以便在生产或事后分析中对系统进行故障排除

    您应该在哪里捕获异常

    在各级。代码中的许多方法将处理与当前上下文相关的异常。我想您真的想知道在哪里处理其他地方未捕获的异常—某种类型的“捕获所有”处理程序。为此,通常在最顶层进行此操作是有意义的,即在.exe中,或者更一般地说,在包含表示应用程序本身的类型的层中。有很多方法可以做到这一点——从简单地为未处理的异常()注册处理程序到使用类似的方法,我个人不喜欢这样做(就像大多数企业库一样)

    将记录器传递给类的方法是什么?将方法/构造函数重载添加到项目中接受类似ILogger的接口的所有内容中有意义吗

    这取决于您的实现。似乎您想要沿着依赖项注入的路径走下去。由于logger不是一个基本的依赖项(即,它与类型的功能行为无关,而是与实现相关),因此我更愿意通过属性注入作为可选的依赖项来处理它,而不是通过构造函数来处理它,应仅用于主要依赖项-类型正常运行所需的依赖项


    但是,您可能不想使用DI。然后你需要其他的方法才能到达logger。讨论了一个选项。

    不要自己做,使用日志记录应用程序块和异常处理应用程序块。或者做一些类似@ta.speot.is的事情,我只是想学习实现这样一个东西背后的理论,但我会检查一下。谢谢你可能想读一读,关于你的“放在哪里”的困惑。@ta.speot.is,这是一本有趣的书,谢谢。我现在也在查看。也许可以看看这里的一些开源实现:非常感谢您提供的详细答案。