如何为NLog空属性值指定默认回退值?
问题:为NLog的
event-properties设置默认值 在C#/.NET6环境下使用NLog 5.1.0时,希望未传入日志属性时输出默认值。现有代码如下:
try { string loggerName = $"fred"; string consoleInstanceTarget = $"{loggerName}.console"; string DEF_LAYOUT = "date=${date} level=${level} myprop=${event-properties:item=myprop} message=${message}"; LoggingConfiguration nlc = (LogManager.Configuration = new LoggingConfiguration()); // console ConsoleTarget _consoleTarget = new ConsoleTarget { Name = consoleInstanceTarget, Layout = DEF_LAYOUT }; nlc.AddTarget(_consoleTarget); nlc.LoggingRules.Add(new LoggingRule($"{loggerName}", NLog.LogLevel.Info, _consoleTarget)); NLog.LogManager.ReconfigExistingLoggers(); // Grab our new logger to narrow our log focus Logger _logger = LogManager.GetLogger(loggerName); _logger.Info("my message"); _logger.WithProperties(new Dictionary<string, object>() { { "myprop", "myprop-value" } }).Info("my new message"); } catch (Exception ex) { Console.Error.WriteLine(); }
运行后,未传入myprop时该字段无默认值输出:
date=2022/12/07 11:48:27.803 level=Info myprop= message=my message date=2022/12/07 11:48:31.468 level=Info myprop=myprop-value message=my new message
曾尝试使用event-properties:item=myprop,default='stuff'解决,还注册了自定义Renderer:
NLog.LayoutRenderers.LayoutRenderer.Register("myprop", (logEvent, key) => { return "default"; });
但由于属性嵌入在event-properties中,该Renderer未被调用;若将布局改为${myprop}则会触发,但需要自行判断动态值是否存在。请问如何为${event-properties}指定默认值?
解决方案
NLog的event-properties布局渲染器本身支持设置默认值,只需修正参数分隔符即可,无需自定义Renderer:
- 修改布局字符串:将原布局中的
${event-properties:item=myprop}改为${event-properties:item=myprop:default='default-stuff'}(参数用冒号:分隔,而非逗号):
string DEF_LAYOUT = "date=${date} level=${level} myprop=${event-properties:item=myprop:default='default-stuff'} message=${message}";
- 验证效果:修改后运行代码,未传入
myprop时会输出指定的默认值,传入时显示自定义值:
date=2022/12/07 11:48:27.803 level=Info myprop=default-stuff message=my message date=2022/12/07 11:48:31.468 level=Info myprop=myprop-value message=my new message
说明
- NLog布局渲染器的参数采用**冒号
:**作为分隔符,而非逗号,这是之前尝试未生效的核心原因。 - 自定义Renderer适用于创建全新的布局渲染器,而不是为
event-properties内部的属性设置默认值,因此之前的自定义Renderer未被触发。
内容的提问来源于stack exchange,提问作者WebDrive
相关产品推荐
相关产品推荐

