【问题标题】:Why does log4net only log errors if my <root> level is INFO?如果我的 <root> 级别是 INFO,为什么 log4net 只记录错误?
【发布时间】:2010-08-12 17:14:01
【问题描述】:

我显然不懂 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 等)?

【问题讨论】:

标签: log4net


【解决方案1】:
<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>

更好的方法是使用“...”,因为如果你想要这个功能,你可以为每个 appender 更改这个设置。

【讨论】:

  • 谢谢弗洛伊德。麻烦的是我实际上不想要所有的日志。我只想要错误日志,但该日志级别似乎不起作用。
【解决方案2】:

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

我曾经在 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 文件夹中读取其配置。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多