【问题标题】:Difference between Properties dictionary and Variables dictionary in NLogNLog中Properties字典和Variables字典的区别
【发布时间】:2018-09-06 02:59:59
【问题描述】:

使用 NLog 我可以添加一个属性:

eventInfo = new LogEventInfo();
eventInfo.Properties.Add(name, value);

和一个变量:

loggerInstance = LogManager.GetLogger(typeName);
loggerInstance?.Factory.Configuration.Variables.Add(name, value);

然后我问自己:有什么区别?环顾四周,但没有找到明确的解释,只是警告说 gdc、mdc 和 mdlc 已过时。我应该将哪一个用于什么目的 - 我可能都需要(或都不需要)。

【问题讨论】:

  • 您应该避免在运行时修改全局 NLog 变量。有关不同上下文属性的详细信息,另请参阅github.com/NLog/NLog/wiki/Gdc-layout-renderer
  • 为了更加透明,如果我想要一个仅与特定记录器实例关联的变量,那么我该怎么做?或者,如果我想要一个与应用程序中的所有记录器实例关联的变量,那么我该怎么做呢?我可以通过我的包装器(我有其他原因)将 LogEventInfo 的实例与特定的记录器相关联,并且可以通过关键字查询该对象以获取该记录器实例的匹配值。这似乎是我想要的本地商店,但它是否在该对象的预期目的范围内,以这种方式使用它会导致问题吗?
  • 可以使用 GDC 配置所有记录器的全局属性:github.com/NLog/NLog/wiki/Gdc-layout-renderer。可悲的是,无法为单个 Logger 配置属性。另见讨论github.com/NLog/NLog/pull/2496

标签: c# nlog


【解决方案1】:

有什么区别

  • eventInfo.Properties:一个 logEvent 范围内的上下文。您可以使用${event-properties:myPropName} 渲染它们
  • Configuration.Variables:在您的 nlog.config 中使用的变量与 <variable />。您可以在配置中将它们用作:
    • ${var:myVar}- 动态的,但仅适用于 Layout 类型的属性
    • ${myVar} - 对于所有属性,将在解析 nlog.config 时应用

gdc、mdc 和 mdlc 已过时

GDC、MDC 和 MDLC 类已过时,但不是 GlobalDiagnosticsContext MappedDiagnosticsContextMappedDiagnosticsLogicalContext

这些是线程安全的上下文:

  • GlobalDiagnosticsContext:完整申请。使用${gdc:myKey} 渲染
  • MappedDiagnosticsContext:当前线程,但是由该线程创建的线程。使用${mdc:myKey} 渲染
  • MappedDiagnosticsLogicalContext:当前线程包括由该线程创建的线程。使用${mdlc:myKey} 渲染。

欲了解更多信息,请参阅https://nlog-project.org/config/?tab=layout-renderers&search=context

【讨论】:

  • GlobalDiagnosticsContext 是应用程序范围的存储,但此时没有记录器实例存储。希望找到可以包装的问题的解决方案(因为无论如何都需要包装)并且还以未包装的方式使用该功能。
  • 你可以做 GDC + Loggername 作为前缀 ;)
猜你喜欢
  • 2016-03-22
  • 2011-10-01
  • 2020-12-24
  • 2010-09-21
  • 2011-05-16
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多