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级别?
我错过了什么?
由于
答案 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" />