NLog自定义布局渲染器异常

时间:2018-05-31 13:10:22

标签: c# string conditional-statements nlog

我有以下自定义布局渲染器:

[LayoutRenderer("ignore-exception")]
public class ExceptionLoggingRenderer : LayoutRenderer
{
    /// <summary>
    /// What exception was thrown (used to check along with the Code)
    /// </summary>
    [RequiredParameter]
    public string Exception { get; set; }

    /// <summary>
    /// What error code was thrown (used to check along with the Exception)
    /// </summary>
    [RequiredParameter]
    public string Code { get; set; }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        builder.Append(IgnoreLoggingToDb(Exception, Code));
    }

    private bool IgnoreLoggingToDb(string exception, string code)
    {
        if (exception == "whatever" && code == "123")
            return true;
        else return false;
    }
}

此外,还有以下过滤器:

<filters>
    <whenEqual ignoreCase="true" layout="${ignore-exception:Code=82:Exception=${exception}}" 
action="Ignore" compareTo="true"/>

    <when condition="'${ignore-exception:Code=82:Exception=${exception}}'" 
action="Ignore"/>
  </filters>

调用记录器:

Log.Error().Exception(e).Property("Code", (int)e.Code).Write()

然而,这些过滤器完美地进入了自定义布局渲染器 Exception中的属性ExceptionLoggingRenderer变为&#34; $ {exception&#34;,即$ {exception}中的第二个大括号被视为我的自定义布局渲染器的结束括号。

我无法通过<when condition="..." action="Ignore">在我的自定义布局渲染器中找到另一种获取$ {exception}布局渲染器的方法。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,以避免将布局渲染器用于自定义布局渲染器的参数,该参数需要${exception}。 我只是使用覆盖Append方法中的LogEventInfo.Exception

protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
    var whatever = logEvent.Exception;
}

答案 1 :(得分:1)

我认为您的解决方案是最好的,请使用LogEventInfo.Exception

但是嵌套的${exception}也可以工作,如果你使用类型Layout作为属性Exception,并使用logevent的上下文渲染它:

e.g:

[LayoutRenderer("ignore-exception")]
public class ExceptionLoggingRenderer : LayoutRenderer
{
    /// <summary>
    /// What exception was thrown (used to check along with the Code)
    /// </summary>
    [RequiredParameter]
    public Layout Exception { get; set; }

    /// <summary>
    /// What error code was thrown (used to check along with the Exception)
    /// </summary>
    [RequiredParameter]
    public string Code { get; set; }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        var exceptionString = Exception.Render(logEvent);
    }


}