【问题标题】:NLog custom layout renderer exceptionNLog 自定义布局渲染器异常
【发布时间】:2018-11-10 12:25:29
【问题描述】:

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

[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()

这些过滤器完美地进入自定义布局渲染器,但是 ExceptionLoggingRenderer 中的属性 Exception 变为“${exception”,即 ${exception} 中的第二个大括号被视为我的自定义布局渲染器的结束括号。

我无法通过&lt;when condition="..." action="Ignore"&gt; 在我的自定义布局渲染器中逃脱或找到另一种方式让 ${exception} 布局渲染器工作。

感谢任何帮助!

【问题讨论】:

    标签: c# string conditional-statements nlog


    【解决方案1】:

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

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

    例如:

    [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);
        }
    
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多