You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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:

  1. 修改布局字符串:将原布局中的${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}";
  1. 验证效果:修改后运行代码,未传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:05:24