Log4net多记录器到多个文件的问题

时间:2015-10-15 13:17:52

标签: log4net log4net-configuration

log4net版本:1.2.13.0 运行时版本:v4.0.30319

我在使用多个Logger和Appender方面遇到了一些问题。 我有一个带有3个Appender的根记录器,但是当我配置多个其他记录器时,log4net似乎只注册了app.config中指定的最后一个记录器的appender。

如果我将TaskSyncLogger作为最后一个记录器条目,则可以识别TaskSyncAppender 如果我将CalendarSyncLogger作为最后一个记录器条目,则CalendarSyncLogger会被识别

只有来自根记录器的3个appender和来自最后一个记录器条目的appender才会列在层次结构中.GetAppenders()

Hierarchy hierarchy = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
var appenders = hierarchy.GetAppenders();

我的app.config

<appender name="MainFileAppender" type="log4net.Appender.FileAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level %logger- %message%newline %exception" />
  </layout>
  <file value="Logs\logs.log" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
</appender>
<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level - %message%newline %exception" />
  </layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level - %message%newline %exception" />
  </layout>
</appender>

<appender name="TaskSyncAppender" type="log4net.Appender.FileAppender">
  <appendToFile value="true"/>
  <file value="Logs\logsTask.log" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level %logger- %message%newline %exception" />
  </layout>
  <!--
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
    <levelMax value="FATAL" />
    <filter type="log4net.Filter.DenyAllFilter" />
  </filter>
  -->
</appender>

<appender name="CalendarSyncAppender" type="log4net.Appender.FileAppender">
  <appendToFile value="true"/>
  <file value="Logs\logsCalendar.log" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level %logger- %message%newline %exception" />
  </layout>
  <!--
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
    <levelMax value="FATAL" />
    <filter type="log4net.Filter.DenyAllFilter" />
  </filter>
  -->
</appender>

<root>
  <level value="All" />
  <appender-ref ref="MainFileAppender" />
  <appender-ref ref="DebugAppender" />
  <appender-ref ref="ConsoleAppender" />
</root>

<logger Name="CalendarSyncLogger" additivity="true">
  <level value="All"/>
  <appender-ref ref="CalendarSyncAppender"/>
</logger>

<logger Name="TaskSyncLogger" additivity="true">
  <level value="All"/>
  <appender-ref ref="TaskSyncAppender"/>
</logger>

此外,TaskSyncAppender不会写入文件被创建的任何内容,但它仍然为空,尽管MainFile Appender正在编写输出。

我喜欢它

public const string TaskSyncLogger = "TaskSyncLogger";

private static readonly ILog logTask = LogManager.GetLogger(LoggingStrings.TaskSyncLogger);

1 个答案:

答案 0 :(得分:1)

我可以重现这一点,虽然我无法自信地说它绝对是一个错误,但它肯定是出乎意料的。

您可以通过将此最后一个记录器添加到您的文件来解决此问题:

<logger Name="WillNotBeUsed">
  <level value="Off"/>
  <appender-ref ref="CalendarSyncAppender"/>
  <appender-ref ref="TaskSyncAppender"/>
</logger>

之后,所有五个appender都被加载了。