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

问题描述 投票:0回答:3

当我的应用程序发生异常时,我使用 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
3个回答
6
投票

一般来说,可以使用EventProperties-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-properties:item=MyValue} -- renders "My custom string

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

 ${exception:format=message}

5
投票

向 NLog 添加自定义 LayoutRenderer 非常容易。请参阅我对这个问题的第一个回答,了解 LayoutRenderer 的示例,该示例允许您将 System.Diagnostics.Trace.CorrelationManager.ActivityId 值添加到日志输出中。

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

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

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

这有帮助吗?


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.