NLog有多灵活?我想要自定义布局属性

时间:2011-02-19 12:24:25

标签: c# logging nlog

我正在使用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日志记录平台?

3 个答案:

答案 0 :(得分:6)

一般情况下,wageoghe建议不要创建自定义layoutRenderer,而是可以使用允许传递任意数量自定义属性的EventContext-Layout-Renderer

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}

答案 1 :(得分:5)

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

要做你想做的事,你可能不需要自定义的LayoutRenderer。如果您想发送一个主题为日志级别的电子邮件PLUS,该异常的Message属性,您应该能够配置如下内容:

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

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

这有帮助吗?

答案 2 :(得分:0)

这可能是不切实际的:我很确定NLog框架没有反射作为其日志格式的一部分[这样做会要求NLog有一些关于引用程序集的位置和它们的含义的概念类型是。]

您可以简单地在C#代码中进行所有消息解析/格式化,并将其作为已存在变量的一部分传递吗?他们在Mail-target NLog documenation中列出了很多这些内容。