在不添加appender的情况下,在log4net中更改一个类的日志级别

时间:2014-12-04 10:20:43

标签: .net logging log4net

我的应用程序登录到控制台和文件(log4net 1.2.11):

<root>
  <level value="DEBUG" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="RollingLogFileAppender" />
</root>

我想更改一个类的配置,以便将所有消息记录到文件,并将所有消息记录到控制台。我可以不为我的课程添加专用的appender,也不需要更改root配置,例如在记录器的appender-ref级别?

this answer的启发,我尝试了下面的代码,但没有成功(所有消息,包括Debug,都记录到两个appender):

<logger name="MyClass" additivity="false">
  <appender-ref ref="ConsoleAppender">
    <threshold value="INFO" />
  </appender-ref>
  <appender-ref ref="RollingLogFileAppender" />
</logger>

这也失败了(它从所有appender中排除了Debug,我想在文件中调试消息):

<logger name="MyClass">
  <level value="INFO" />
</logger>

1 个答案:

答案 0 :(得分:1)

你运气不好,当log4net解析appender-ref标签时,它没有将任何信息传递给名称引用的appender(代码来自1.2.10):

// log4net.Repository.Hierarchy.XmlHierarchyConfigurator
if (xmlElement.LocalName == "appender-ref")
{
    IAppender appender = this.FindAppenderByReference(xmlElement);
    string attribute = xmlElement.GetAttribute("ref");
    if (appender != null)
    {
        LogLog.Debug(string.Concat(new string[]
        {
            "XmlHierarchyConfigurator: Adding appender named [",
            attribute,
            "] to logger [",
            log.Name,
            "]."
        }));
        log.AddAppender(appender);
    }
    else
    {
        LogLog.Error("XmlHierarchyConfigurator: Appender named [" + attribute + "] not found.");
    }
}

我很确定你所链接的答案并不真正有用; appender上存在Treshold属性,但它不在ref节点中解析。

哪个是最好的 - 如果记录器可以从其引用改变一些appender属性,你能想象配置的噩梦吗?正在解析的最后一个记录器将赢得配置和好运跟踪为什么你的调试appender现在保持沉默,因为其他记录器交换了阈值:)

所以你必须添加另一个appender;如果您不想复制粘贴RollingLogFileAppender配置,则可以使用forwarding appender作为过滤器,然后将消息传递给自己引用的appender。你最终会得到

  • 根日志 - &gt;是ConsoleAppender
  • 根日志 - &gt; RollingFileAppender进行
  • MyClass - &gt;带过滤器的ForwardingAppender - &gt;是ConsoleAppender
  • MyClass - &gt; RollingFileAppender进行