【问题标题】:How to ignore logs when some LogicalThreadContext.Property have certain value in log4net当某些 LogicalThreadContext.Property 在 log4net 中具有特定值时如何忽略日志
【发布时间】:2020-01-15 12:38:38
【问题描述】:

我使用 ADO.NET appender 和 MySQL 作为后端数据库

我在附加程序设置中添加了以下内容

<parameter>
      <parameterName value="_context" />
      <dbType value="String" />
      <size value="25" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="Context" />
      </layout>
    </parameter>

    <filter type="log4net.Filter.PropertyFilter">
      <key value="Context" />
      <stringToMatch value="Transaction" />
      <acceptOnMatch value="false" />
    </filter>

我正在做的是记录大量场景。但是当 Context Property 的值为 ="Transaction"

时,我想跳过转到 DB 命令的日志

但它似乎不起作用。 请让我知道我需要更正的地方

附言

我什至尝试过关注

public class CustomFilter : FilterSkeleton
{

    private readonly IList<IFilter> filters = new List<IFilter>();        
    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        if (loggingEvent == null)
            throw new ArgumentNullException("loggingEvent");

        if (filters.All(x => x.Decide(loggingEvent) != FilterDecision.Accept))
        {
            return FilterDecision.Neutral;
        }

        // All conditions are true
        if (AcceptOnMatch)
            return FilterDecision.Accept;
        else
            return FilterDecision.Deny;
    }

    public IFilter Filter
    {
        set { filters.Add(value); }
    }

    public bool AcceptOnMatch { get; set; }

}

  <filter type="MyNameSpace.CustomFilter,  MyAssembly">

      <filter type="log4net.Filter.PropertyFilter">
        <key value="Context" />
        <stringToMatch value="Transaction" />
        <acceptOnMatch value="false" />
      </filter>      
    </filter>
    <filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
      <levelMin value="DEBUG" />
      <levelMax value="FATAL" />
    </filter>

【问题讨论】:

    标签: c# asp.net-core .net-core log4net


    【解决方案1】:

    所以还是有可能的。

    有一个loggingEvent.GetProperties() 提供自定义字段。

    CustomFilter 可能看起来像这样:

        public class CustomFilter : FilterSkeleton
        {
            private readonly IList<IFilter> _filters = new List<IFilter>();
            public override FilterDecision Decide(LoggingEvent loggingEvent)
            {
                if (loggingEvent == null)
                    throw new ArgumentNullException(nameof(loggingEvent));
    
                var properties = loggingEvent.GetProperties();
                if (properties != null && (properties[Key] as string ?? properties[Key]?.ToString()) == StringToMatch )
                {
                    return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
                }
    
                if (_filters.All(x => x.Decide(loggingEvent) != FilterDecision.Accept))
                {
                    return FilterDecision.Neutral;
                }
    
                // All conditions are true
                return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
            }
    
            public IFilter Filter
            {
                set => _filters.Add(value);
            }
    
            public bool AcceptOnMatch { get; set; }
    
            public string Key { get; set; }
            public string StringToMatch { get; set; }
        }
    

    我没有用多个过滤器测试它,但这是一个开始。

    【讨论】:

    • 我正在使用 LogicalThreadContext.Properties 添加此属性。不知道为什么它不在 loggigEvents.Properties 中但显示在 loggingEvent.GetLoggingEventData()
    • 我在排列过滤器时遇到问题。你能帮忙吗?请检查我在github.com/microknights/Log4NetAdoNetAppender/issues/13 尝试过的组合
    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2021-10-12
    • 2019-04-26
    相关资源
    最近更新 更多