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

Typ*_*son 5 c# logging nlog

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

<target xsi:type="Mail"
        name="email"
        subject="${level}:"  .. >
Run Code Online (Sandbox Code Playgroud)

我收到的电子邮件包含"错误:"或"致命:"等主题.这工作正常,但我想将Exception.Message添加到电子邮件的主题

是否可以在NLog中设置自定义属性.我无法找到如何做到这一点,所以只是为了清楚我想要的是我想要做的事情的一个例子:

m_oLogger.Fatal( oException.BuildMessage(), new {MyMessage=oException.Message});
Run Code Online (Sandbox Code Playgroud)

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

在我的目标:

<target xsi:type="Mail"
        name="email"
        subject="${level}: ${Custom.MyMessage}"  .. >
Run Code Online (Sandbox Code Playgroud)

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

致命:参数或参数中的语法错误.服务器响应是:帐户不存在

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

MiF*_*vil 6

通常,不是创建自定义layoutRenderer, 而是 可以使用   允许传递任意数量的自定义属性的  EventContext-Layout-Renderer

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

log.Log(theEvent);
Run Code Online (Sandbox Code Playgroud)

并在您的NLog.config文件中:

${event-context:item=MyValue} -- renders "My custom string
Run Code Online (Sandbox Code Playgroud)

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

 ${exception:format=message}
Run Code Online (Sandbox Code Playgroud)


wag*_*ghe 5

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

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

<target xsi:type="Mail"
            name="email"         
            subject="${level}: ${exception.Message}"  ..>
Run Code Online (Sandbox Code Playgroud)

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

这有帮助吗?


Dav*_*ner 0

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

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