首页 > 解决方案 > 基于 NLog 的通用日志记录包装器?

问题描述

我们希望为 ASP.Net Core Web 应用程序、Azure Functions 和 Web 服务使用一个通用的日志库。NLog 似乎是一个不错的选择,因为它有多个目标,例如 Application Insights 和 Azure 表存储。理想情况下,我想做类似 call CommonTrace(message)的事情并拥有该功能

(1) 跟踪其他信息,例如 (a) Environment - DEV、TEST、PROD;(b) 本地时间,(c) System.Runtime.CompilerServices.CallerLineNumber (d) 调用应用程序等。

(2)调用NLog写出消息等信息。请注意,其他信息可能会附加到消息中或以其他方式保留。

但是当我了解更多关于 NLog 和 ASP.NET Core 的信息时,似乎如果一个人天真地创建一个基本的包装类来添加额外的信息,一个人可能会失去很多功能,例如访问 NLog 和 Microsoft 的调用站点和标头信息。 Extensions.Logging 提供。

那么,是否可以将 NLog 完全子类化,然后使用该包装器,因为通常将 NLog 与 ASP.Net Core 一起使用。或者在使用 NLog 时是否有更好的方法来添加来自多个应用程序的公共信息?

标签: asp.net-coresubclassnlog

解决方案


NLog 具有捕获大量上下文属性的能力,而无需将它们直接注入日志操作。

它们由为 NLog 目标配置的布局自动捕获。一些 NLog 目标允许添加任意数量的属性。

这可以通过 NLog Application Insight Target(版本 2.6.4)看到,它现在能够添加一个(或多个)“ContextProperty”元素。这些将自动作为元数据包含在每个日志操作中:

https://github.com/Microsoft/ApplicationInsights-dotnet-logging/pull/183

如果 NLog 目标不支持 ContextProperty,那么也可以转向 NLog JsonLayout,它允许添加元数据作为附加的 Json-Attributes:

https://github.com/NLog/NLog/wiki/JsonLayout

如果您最喜欢的自定义 NLog 目标支持结构化日志记录属性,那么添加对 ContextProperty-elements 的支持应该是一个小改动(简单的方法是从 NLog TargetWithContext 继承并使用GetAllProperties-method):

https://github.com/AlanBarber/NLog.Targets.Splunk


推荐阅读