.NET世界中是否有一个日志门面?

49

我在.NET技术栈上还比较新,想知道是否有与slf4j相当的.NET平台等价物。对我来说,记录到Facade并能够根据需要更换日志实现是很合理的。此外,在slf4j中可用的包装器API在许多时候为我节省了不少麻烦,因为我需要使用针对我未使用的单个日志框架编码的第三方库。

是否有项目在各种记录器(如log4net、NLog和Enterprise Library)之间充当门面?是否有包装器可以让我快捷地调用这些库并将它们定向到另一个库?我应该开始一个开源项目以自己完成这个任务吗?是否因为我不知道正确的提问方式而导致此问题重复?相反,使用面向切面编程是否是常见的解决方法?


好问题 - 我也有这个问题。只需要花费几分钟实现一个ILog接口和我最喜欢的nLog的实现。让我们创建一个操作系统项目 - 我会加入 :) - twk
1
已完成。请参考以下链接获取.NET的通用日志记录信息。 - Tom Cabanski
3
还有一个适用于.NET的SLF:http://slf.codeplex.com/,它基于slf4j。 - Steven
1
Steven,你应该把那个作为问题的答案。 - Elijah
ASP.NET Core 中有 Microsoft.Extensions.Logging 这个组件,其中包含了一些接口,可以用于已经建立的日志框架,例如 Serilog.Extensions.LoggingNLog.Extensions.Logging 等等。我没有尝试过在 ASP.NET 上下文之外使用它们是否会有任何问题。如果没有问题,我可以看到它成为 .NET 的事实上的日志门面。 - nawfal
8个回答

20

对不起,我使用了这个东西,但我忘记了它不是Apache版本。实际上它是开源的,属于一个叫做common infrastructure的项目。它也被称为common logging。它可以与MS Enterprise、log4net和其他工具一起使用,并且效果很好。


3
没错,Common Logging 是 .NET 的日志门面。 - Steven
2
@abatishchev:2.1.1版本于2012年6月9日发布。 - Lee Chee Kiam
1
@ThorbjørnRavnAndersen: 我倾向于定义自己的ILogger接口并实现适配器到使用的日志框架(参见此处)。这使我的应用程序摆脱了对日志框架的任何引用。换句话说:创建您自己的API。 - Steven
5
@Steven,很高兴你找到了适合自己的一种方法。我个人发现,能够借鉴他人经验对我们是有好处的,所以我通常依赖于日志记录组件。slf4j 提供了一个通用的 API,非常不错。 - Thorbjørn Ravn Andersen
我的团队给了我一个不使用Facade的理由:你不知道他们何时可能会更改API。我们确实有一些被包含在其他项目中的项目,因此如果他们确实更改了某些内容,我们可能会得到不兼容的不同版本。 - Tigerware
显示剩余7条评论

10

请看Castle Windsor日志设施

基础代码在这里。Log4net适配器这里。NLog适配器这里

添加了适配器Serilog

没有适配器,支持ConsoleLogger、DiagnosticsLogger、StreamLogger和NullLogger。

编写适配器以适应任何其他日志框架非常容易。


1
Castle.Services.Logging 似乎已经消失了。出现了 404 错误。 - Sam7
1
@Sam7 不是的,只是链接变了。每当你遇到这种情况,请考虑谷歌一下以找到新的链接(就像我刚刚做的那样),然后向答案提交建议。谢谢! - Mauricio Scheffer

9

7

更新:正如LibLog的自述文件所说,“我的建议是,库开发人员应该使用Microsoft.Extensions.Logging.Abstractions,因为它现在是.NET生态系统中事实上的标准日志接口。”。https://github.com/damianh/LibLog#liblog-- - alelom

6

4

自这篇文章写出来以后,另一个有趣的日志封装程序Fody.Anotar也应运而生。截至今天,它可能是所有日志封装程序中最完整的。除了Logging Faciliy之外,大多数其他程序都已经过时,只支持最旧的记录器。

它适配了NLog、Log4Net、Serilog、CommongLogging、Catel、LibLog、MetroLog、NServiceBus和Splat,并允许您为自己的库创建一个适配器。

您可以使用Nuget来安装它。搜索Anotar.*.Fody包,例如Anotar.NLog.Fody。


Common.Logging 的适配器?我猜它本身就是一个门面。 - nawfal
@nawfal 是的,你说得对,但我敢打赌这不是你第一次看到在另一个抽象层之上构建的抽象层(等等)。这就像记录器库记录到另一个记录器库一样,例如 Serilog 记录到 NLog 或 Log4Net,或者 NLog 记录到 ELMAH。问题应该是它是否有意义。 - JotaBe

0

我在这里找到的所有解决方案都不尽如人意,特别是对于库/API。虽然我从未想过会这样做,但我实际上编写了一个开源的“记录器”,应该可以处理大多数问题。

也许你可以看一下Dapplo.Log,你可以从NuGet获取它。

这个想法是在你的库中使用Dapplo.Log,使用此项目的项目可以将任何日志输出(在需要时)直接定向到他们选择的记录器。有关输出定向的示例可以在测试中找到,其中包括一些主要框架的实现here

它可能还不完美,我欢迎拉取请求或票据。


0
在这种情况下,我花了一些时间阅读所有答案并研究一个好的解决方案。大多数提出的堆栈/框架/抽象现在都已经过时,要么不再维护,要么不再流行。
然后我遇到了LibLog,它现在已经被弃用,并且其ReadMe明确建议使用“Microsoft.Extensions.Logging.Abstractions”,因为它现在是.NET生态系统中的事实标准日志接口。
(值得一提的是,“Microsoft.Extensions.Logging.Abstractions”现在已经包含在.NET Runtime中,自从它从ASP .NET Logging中移动过来)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接