为什么log4net仅在我的<root>级别为INFO?</root>时才记录错误

时间:2010-08-11 10:03:27

标签: log4net

我显然不懂log4net。我的根日志级别配置如下:

<root>
   <level value="ERROR"/>
   <appender-ref ref="FileAppender" />
</root>

我的日志初始化如下所示:

private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

我的实际日志记录调用如下:

LOG.Error("Error submitting Registration.", exc);

这是有趣的部分。仅当我将根日志级别设置为INFO时,此日志语句才有效。为什么日志级别ERROR不起作用(我只想要错误,而不是Info,Debug等...)?

2 个答案:

答案 0 :(得分:3)

<root>
  <level value="ALL" />
...
</root>

我的log4net-Configfile中的某个人:

  

<appender name="FileAppender_FullLog" type="log4net.Appender.FileAppender">
  <file value="Log_Full.txt" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] [%logger{2}] - %message%newline" />
  </layout>
</appender>

<appender name="FileAppender_SmallLog" type="log4net.Appender.FileAppender">
  <file value="Log.txt" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] [%logger{2}] - %message%newline" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
    <levelMax value="FATAL" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
  ..
</appender>

<!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<root>
  <level value="ALL" />
  <appender-ref ref="FileAppender_FullLog" />
  <appender-ref ref="FileAppender_SmallLog" />
  <appender-ref ref="SmtpAppender" />
</root>

修改

  

<appender name="FileAppender_SmallLog" type="log4net.Appender.FileAppender">
  <file value="Log.txt" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] [%logger{2}] - %message%newline" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="ERROR" />
    <levelMax value="FATAL" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

<!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<root>
  <level value="ALL" />
  <appender-ref ref="FileAppender_SmallLog" />
</root>

更好的方法是使用“&lt; filter type =”log4net.Filter.LevelRangeFilter“&gt; ...”,因为如果您想要这个功能,可以为每个appender更改此设置。

答案 1 :(得分:3)

在我们聪明的建筑师的帮助下,我想出了这个......

我曾经在assemblyInfo.cs中进行日志初始化(但这是错误的)。

我将日志初始化移动到app_startup中的global.asax:

    protected void Application_Start(Object sender, EventArgs e) 
    {
        string configFilePath = Server.MapPath("~/Config/Log4Net.config");
        log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(configFilePath));
    }

server.MapPath位非常重要,否则log4net会尝试从system32 \ inetsrv文件夹中读取其配置。

我认为由于程序集的加载顺序或类似的原因,我之前的日志记录时常起作用。无论哪种方式,这个解决方案都有效。