我正在使用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日志记录平台?
答案 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中列出了很多这些内容。