给定类的log4net配置不起作用

时间:2012-04-27 21:25:09

标签: c# asp.net log4net consoleappender

namespace Com.Foo
{
    public class Bar
    {

        private static readonly ILog log = LogManager.GetLogger(typeof(Bar));

        public void DoIt()
        {
            log.Info("Did it again!");
        }
    }
}

class Program
{
    private static readonly ILog log = LogManager.GetLogger(typeof(Program));
    static void Main(string[] args)
    {
        string sfile = @"C:\development\Framework\Logging\ConsoleApplication1\app.config";
        XmlConfigurator.Configure(new System.IO.FileInfo(sfile));
        log.Info("Entering application.");
        Bar bar = new Bar();
        bar.DoIt();
        log.Info("Exiting application.");

        Console.ReadLine();
    }


}

我的log4net配置如下:

<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">

  <!-- A1 uses PatternLayout -->
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
  </layout>
</appender>

<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
  <level value="DEBUG" />
  <appender-ref ref="A1" />
</root>


<!-- Print only messages of level WARN or above in the package Com.Foo -->
<logger name="Com.Foo">
  <level value="WARN" />
</logger>

我的应用程序的输出仍然显示来自Com.Foo的日志

67 [10] INFO ConsoleApplication1.Program(null) - 输入申请表。

100 [10] INFO ConsoleApplication1.Com.Foo.Bar(null) - 再试一次!

100 [10] INFO ConsoleApplication1.Program(null) - 退出应用程序。

如何配置Com.Foo.Bar停止显示WARN级别?

我错过了什么?

由于

3 个答案:

答案 0 :(得分:1)

我刚想通了..我没有在Foo.Bar类中正确设置记录器。

更新以下行

private static readonly ILog log = LogManager.GetLogger(typeof(Bar));

以下......

private static readonly ILog log = LogManager.GetLogger("Com.Foo");

并且有效。

答案 1 :(得分:0)

您提供的配置应该有效。

创建记录器Com.Foo.Bar时,它会继承层次结构中Com.Foo记录器的设置。 Com.Foo logger从root logger继承他的appender,但它有自己的级别,设置为WARN。因此,当您尝试通过Com.Foo.Bar记录器编写日志记录事件时,将从层次结构中检索有效级别 - 它是层次结构树中最近的记录器级别(根记录器始终具有级别)。在您的情况下,它是WARN,因此日志记录事件不会传递给appender。

我认为您的配置与您提供的配置不同。也许你正在读错配置文件。尝试此代码(将使用应用程序配置文件):

XmlConfigurator.Configure();

或(甚至更好)通过属性使用配置:

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

更新

如果将记录器检索从typeof(Bar)更改为"Com.Foo",则您提供了错误的Bar类命名空间。因为场景后面的log4net将类型的全名称作为记录器的名称。因此,namespace Com.Foo一切都应该有用。

答案 2 :(得分:0)

尝试

<levelToMatch value="WARN" />