【问题标题】:How flexible is NLog? I want custom layout propertiesNLog 有多灵活?我想要自定义布局属性
【发布时间】:2011-06-30 08:40:38
【问题描述】:

当我的应用程序发生异常时,我正在使用 NLog 发送电子邮件。这是我的目标的一部分:

<target xsi:type="Mail"
        name="email"
        subject="${level}:"  .. >

我收到主题为“错误:”或“致命:”的电子邮件。这工作正常,但我想将 Exception.Message 添加到电子邮件的主题

是否可以在 NLog 中设置自定义属性。我不知道如何做到这一点,所以为了清楚说明我想要什么是我正在尝试做的事情的一个例子:

m_oLogger.Fatal( oException.BuildMessage(), new {MyMessage=oException.Message});

*请注意,BuildMessage() 只是一个扩展方法,用于将完整的异常详细信息(包括内部异常)转换为可读字符串

在我的目标中:

<target xsi:type="Mail"
        name="email"
        subject="${level}: ${Custom.MyMessage}"  .. >

然后我会收到主题如下的电子邮件:

致命:参数中的语法错误或 论据。服务器响应是: 帐号不存在

NLog 是否可以实现这种灵活性?如果没有,您是否知道其他提供此类功能的 .NET 日志记录平台?

【问题讨论】:

    标签: c# logging nlog


    【解决方案1】:

    一般来说,可以使用EventContext-Layout-Renderer 来代替wageoghe 建议的创建自定义layoutRenderer,它允许传递任意数量的自定义属性

    LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "Pass my custom value");
    theEvent.Properties["MyValue"] = "My custom string";`
    
    log.Log(theEvent);
    

    在你的 NLog.config 文件中:

    ${event-context:item=MyValue} -- renders "My custom string
    

    对于特定的https://github.com/nlog/NLog/wiki/Exception-Layout-Renderer,格式应为

     ${exception:format=message}
    

    【讨论】:

    • 非常感谢 :) 你为我节省了很多时间 :) 向上箭头。
    【解决方案2】:

    添加自定义LayoutRenderer 到 NLog 非常容易。有关允许您将 System.Diagnostics.Trace.CorrelationManager.ActivityId 值添加到日志输出的 LayoutRenderer 示例,请参阅我对 this question 的第一个回答。

    要做你想做的事,你可能不需要自定义 LayoutRenderer。如果你想发送一封主题是日志级别的邮件,加上异常的消息属性,你应该可以这样配置:

    <target xsi:type="Mail"
                name="email"         
                subject="${level}: ${exception.Message}"  ..>
    

    这应该通过连接级别和 Exception.Message 属性的值来创建电子邮件的主题。您必须调用将异常作为参数的日志记录重载。

    这有帮助吗?

    【讨论】:

    • 或许我会稍后再试。因此,与其自己构建异常消息并通过 oException.BuildMessage() 传入字符串,我可以使用 ${exception.[property]} 在 NLog.config 中布局消息。谢谢,我稍后会回来更新
    【解决方案3】:

    这可能是不切实际的:我相当确定 NLog 框架没有将反射作为其日志记录格式的一部分 [这样做需要 NLog 对您引用的程序集在哪里以及它们的什么有某种概念类型是。]

    您能否简单地在 C# 代码中完成所有消息解析/格式化,并将其作为现有变量的一部分传递?他们在Mail-target NLog documenation 中列出了很多这些。

    【讨论】:

    • 是的,你可能是对的,匿名对象是不切实际的,我不认为反射是必要的,也许只是一个动态参数。不过字典很简单,这意味着我可以传入任何内容并在 NLog.config 中使用它。
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2013-05-07
    • 2012-07-01
    • 1970-01-01
    • 2018-11-10
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多