0
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 级别?

我错过了什么?

谢谢

4

3 回答 3

1

您提供的配置应该可以工作。

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

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

XmlConfigurator.Configure();

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

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

更新

如果将记录器检索从更改typeof(Bar)"Com.Foo"有效,那么您为我们提供了错误的 Bar 类命名空间。因为后台的log4net将类型的全名作为记录器的名称。因此,namespace Com.Foo所有人都应该工作。

于 2012-04-27T21:58:01.883 回答
0

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

更新以下行

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

到以下..

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

它奏效了。

于 2012-04-27T23:21:00.233 回答
0

尝试

<levelToMatch value="WARN" />
于 2012-04-28T19:02:14.217 回答