【问题标题】:Multiple appenders log4net configuration多个 appender log4net 配置
【发布时间】:2011-10-09 03:59:59
【问题描述】:

抱歉 log4net newb 问题,这看起来像一个常见的设置,但我找不到示例。

我正在尝试使用我的 log4net 配置进行以下设置:

两个附加器:

  • File_Appender -> log4net.Appender.RollingFileAppender
  • Smtp_Appender -> log4net.Appender.SmtpAppender
    (评估者阈值设置为 ERROR)

许多记录器:

  • 所有记录器(根)-> INFO、WARN、ERROR -> File_Appender
  • 所有记录器(根)-> 错误-> Smtp_Appender
  • 特定记录器 -> 调试 -> File_Appender
  • 特定记录器 -> INFO -> Smtp_Appender

我不确定如何配置“根”记录器以将不同级别记录到不同的附加程序(我不想显式配置每个记录器以将错误记录到 Smtp_Appender)。

【问题讨论】:

  • 您只想通过配置来执行此操作?你愿意编写自己的 appender 吗?
  • @Chaker:我现在正在做。 :) (实际上,我正在编写自己的过滤器,它也会匹配具有不同级别的特定记录器)
  • 恕我直言,这是最好的选择。玩得开心;)

标签: .net logging log4net app-config smtpappender


【解决方案1】:

我最终做了自己的 appender 过滤器,它允许为明确指定的记录器设置较低的匹配级别:

public class MultipleLevelFilter : LevelMatchFilter
{
    public MultipleLevelFilter()
    {
        LevelToMatchForSpecificLoggers = Level.Fatal;
        _specificLoggers = new string[0];
    }

    /// <summary>
    /// Gets or sets the level to match for loggers
    /// specified in the <see cref="SpecificLoggers"/> property.
    /// </summary>
    /// <value>The level to match for specific loggers.</value>
    public Level LevelToMatchForSpecificLoggers { get; set; }

    private string[] _specificLoggers;
    /// <summary>
    /// Gets or sets a comma separated list of "specific" loggers.
    /// For these loggers, <see cref="LevelToMatchForSpecificLoggers"/>
    /// property is checked to see whether they should be logged.
    /// </summary>
    /// <value>The specific loggers.</value>
    public string SpecificLoggers 
    {
        get { return string.Join(",", _specificLoggers); }
        set
        { 
            _specificLoggers = value.Split(',').Select(s=>s.Trim()).ToArray();
        }
    }

    /// <summary>
    /// Tests if filter matches the specified logging event.
    /// </summary>
    /// <param name="loggingEvent">the event to filter</param>
    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        // if base.LevelToMatch is matched, always match
        if (loggingEvent.Level >= LevelToMatch)
           return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny; 

        // if specific level is matched, check if logger name matches
        if (loggingEvent.Level >= LevelToMatchForSpecificLoggers)
        {
            string name = loggingEvent.LoggerName;
            for (int i = 0; i < _specificLoggers.Length; i++)
                if (name == _specificLoggers[i])
                    return AcceptOnMatch ?
                        FilterDecision.Accept : FilterDecision.Deny;
        }

        // continue with next filter
        return FilterDecision.Neutral;
    }
}

用法:

<appender name="Smtp_Appender" 
     type="Ster.Log4Net.DelayedSendSmtpAppender">

  <!-- ... common properties (from, to, etc) -->

  <!-- our custom filter -->      
  <filter type="MyNamespace.MultipleLevelFilter">

    <!-- this level is ALWAYS matched -->
    <levelToMatch value="ERROR" />

    <!-- this level is matched only for specific loggers -->
    <levelToMatchForSpecificLoggers value="INFO" />

    <!-- these are the "specific" loggers (comma separated) -->
    <specificLoggers value="SomeLogger, SomeOtherLogger" />

  </filter>
  <!-- always end the filter chain with DenyAll -->
  <filter type="log4net.Filter.DenyAllFilter" />

</appender>

<root>
  <priority value="INFO" />
  <appender-ref ref="File_Appender" />
  <appender-ref ref="Smtp_Appender" />
</root>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多