Design patterns 什么';日志外观的意义是什么?

Design patterns 什么';日志外观的意义是什么?,design-patterns,logging,Design Patterns,Logging,有许多不同的日志库可供选择,每一个都有自己的一套怪癖和优点。(.NET示例:log4net、System.Diagnostics.TraceSource、NLog等) 自然倾向于将这些怪癖抽象出来,并使用伐木立面。(示例:,)这样,如果您正在使用的某个给定日志框架过时了,或者另一个日志框架流行起来,那么您只需交换实现,而不必修改代码 但是有多个日志外观可供选择。考虑到许多不同日志实现的答案是抽象,为什么不使用日志外观呢?如果这听起来很可笑,那么是什么让它比最初的日志外观更可笑呢?是什么使日志框架

有许多不同的日志库可供选择,每一个都有自己的一套怪癖和优点。(.NET示例:log4net、System.Diagnostics.TraceSource、NLog等)

自然倾向于将这些怪癖抽象出来,并使用伐木立面。(示例:,)这样,如果您正在使用的某个给定日志框架过时了,或者另一个日志框架流行起来,那么您只需交换实现,而不必修改代码


但是有多个日志外观可供选择。考虑到许多不同日志实现的答案是抽象,为什么不使用日志外观呢?如果这听起来很可笑,那么是什么让它比最初的日志外观更可笑呢?是什么使日志框架上的一个额外抽象层成为神奇的数字?

在本例中,您只需要一个抽象层就可以交换日志


换掉你的日志外观还有什么好处呢?

这不是一个神奇的数字,这取决于你想要多灵活。 如果有一天您考虑更改日志facade,那么您应该编写一个facade。 如果您只想更改日志,则需要一个facade。 如果你什么都不想,就不要用facade

正如你所说的,缺点是特殊能力。如果你正在使用它们,只写你自己的外观。

我认为是什么让一(抽象层次)成为这里的神奇数字,零太少,二太多

在logger facade(级别数:1)后面交换logger可能会给用户带来一些好处,比如新的logger可以做旧的logger做不到的事情。我可以想象它可能是性能,支持某些类型的附加器,等等

很难想象用户从交换记录器外观(级别数:2)中获益

(如果级别数为0,那么可能就是糟糕的面向对象设计:代码中有数千个地方引用了记录器,如果记录器的下一个版本发生了重大更改,该怎么办。)


与logger facades的交易似乎是,您必须选择第三方选项之一,或者创建自己的选项,并准备长期坚持使用它。

我将主要从使用抽象将应用程序代码与特定日志框架隔离的角度来谈。还有其他因素可以影响人们对日志框架的选择或对抽象的选择(以及对抽象的要求)

我最近花了很多时间评估各种日志框架以及第三方日志抽象

有些人认为将他们的应用程序代码与特定的日志框架隔离是有价值的。您将在这里找到许多讨论日志记录的类似和(还有更多)的帖子,许多人理所当然地认为日志记录框架应该被包装/抽象

显然,这允许您不受特定框架的约束。这重要吗?你真的会放弃你的日志框架吗?嗯,也有很多人要么不提包装,要么反对包装。如果您看看这里发布的日志框架包装代码的一些示例,您还可以看到许多示例,说明为什么至少有些人不应该包装他们的日志框架

如果您最近开始了一个项目,那么您可能已经检查了日志框架,并可能将其缩小到两个最终入围者:log4net和NLog。每个人都有对自己有利的论据。log4net显然是最受欢迎的,可能是那些发表过观点的人的最爱。NLog提供了非常类似的功能。从受欢迎程度来看,log4net可能是一个明确的选择。基于能力,它们看起来非常相似。基于“最近的活动”(如通过博客活动或缺乏活动对源代码进行签入所示),NLog将是明确的选择。如果一年前你不得不选择,你可能会选择log4net,因为它是“安全”的选择。目前尚不清楚非直瞄炮何时释放。在此后的一年中,NLog经历了一个相当重要的开发周期,几天前刚刚发布了一个测试版

一年前该选哪一个?现在选择哪一个?那是不是一个更好的选择?现在是更好的选择吗

一个抽象让您能够推迟选择哪一个的决定(您甚至不必选择任何一个,尽管如果您计划在产品中提供日志框架,您可能希望这样做)。您可以先测试其中一个,然后测试另一个,了解它们在您的环境中如何与您的应用程序、团队一起工作。使用类似或的东西可以让您现在就开始编写代码,编写一些日志接口/API,并将日志代码准备就绪。如果您认为抽象提供的接口/API足以满足您的工作(而且,为什么不呢,因为它本质上与log4net和NLog提供的接口/API相同),那么使用抽象就没有多大危险。在开发周期中,您可能会发现其中一个框架更适合您的需要。在对抽象进行编码之后,您可以在任何时候自由地做出选择,直到您的产品上市为止

您甚至可能会想,在您的脑海深处,您可能会从头开始编写日志库。同样,如果您认为log4net和/或NLog的接口/API足够了,那么您可以使用类似的API实现日志库。如果您相信这一点,那么这可能是使用抽象的另一个原因。同样,您现在可以开始编写代码(用于您的产品,而不是日志库),使用其他日志框架进行日志记录
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <targets>
     <target name="file" xsi:type="File"
      layout="${longdate:universalTime=true}Z [${threadid}] ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}"
      fileName="${basedir}/App_Data/logfile.txt"...
   </targets>
</nlog>
<system.diagnostics>
  <trace>
    <listeners>
      <add name="nlog" type="NLog.NLogTraceListener, NLog" />
    </listeners>
  </trace>
</system.diagnostics>