我一直在尝试了解log4net库的配置,我认为除了一些意外行为外,我已经拥有它。
我有一个根记录器,其级别设置为INFO,而另一个记录器的特定类的级别设置为ERROR。
我从中期望的是,由于我将类记录器的可加性设置为false,因此类记录器只会记录错误并忽略根级别。这是我目前拥有的log4net.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<logger name="EveStatic.Config.ViewModel" additivity="false">
<level value="error"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
<root>
<level value="debug" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
在我的AssemblyInfo.cs中:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
在加载配置的类中:
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
这两个似乎多余,但是除非我有代码部分,否则不会加载配置。这里的所有内容都在另一个项目正在使用的类库中。
这是预期的行为,我不了解配置和级别替代,还是忘记了什么?
编辑: 这是我实例化和调用ILog的方法。完整的类名是配置中记录器的名称加上ConfiInfoViewModel:
private static readonly ILog LOG = LogManager.GetLogger(typeof(ConfigInfoViewModel));
...
LOG.Debug("Something buggy");
还请注意,在测试日志记录级别时,我对系列中的每个级别都有一条日志语句。
答案 0 :(得分:3)
您的问题就在这里
LogManager.GetLogger(typeof(ConfigInfoViewModel));
内部解决此问题
LogManager.GetLogger(typeof(ConfigInfoViewModel).FullName);
现在,log4net正在寻找名为{EveStatic.Config.ConfigInfoViewViewModel”的Logger
(结果为typeof(ConfigInfoViewModel).FullName
)
因为未指定具有该名称的Logger
,所以使用了具有默认设置的新名称。
还要注意,level
指定阈值,而不是单个级别。
示例:level=warn
表示将warn
记录在高于{error
和fatal
)的所有级别上