2013-06-14 3 views
16

Я использую log4net для регистрации. Я бы хотел, чтобы он записывался в файл и в журнал событий одновременно.Использование log4net для записи в разные регистраторы

По некоторым причинам, я нахожу сообщения дважды в своем файле журнала.

Это мой app.config сечение:

<log4net> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="LogFileAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="c:\temp\DIS-logfile.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <param name="Indigo.DataIntakeService" value="eventlog" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date %-5level %logger - %message%newline" /> 
      </layout> 
    </appender> 
</log4net> 

В моем коде я имею TOF следующее:

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService"); 
     private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender"); 

     static void Main(string[] args) 
     { 
      log4net.Config.XmlConfigurator.Configure(); 
     } 

     public static void LogInfo(string message) 
     { 
      Log.Info(message); 
      LogEvents.Info(message); 
     } 

Он пишет в мой лог-файл, в соответствии с просьбой, но сообщения должны также перейдите к моему eventviewer, и этого не произойдет. Он также записывает эти сообщения в файл журнала.

Где я ошибся?

ответ

24

Вы настроили Log4Net так, чтобы корневой журнал регистрировался как в файлах, так и в файлах событий. Все регистраторы наследуют эту конфигурацию, поэтому оба регистратора «DataIntakeService» и «EventLogAppender» регистрируются в этих приложениях.

Если сообщения журнала не отображаются в средстве просмотра событий, возможно, это связано с тем, что ваше приложение не имеет разрешения на создание источника события.

UPDATE

Как я могу настроить его так, чтобы DataIntakeService журналы в файл, а другой к EventViewer?

Вот пример конфигурации:

<log4net> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
    <logger name="EventLogAppender" additivity="False"> 
    <level value="INFO" /> 
    <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <appender> 
    ... 

С помощью этого образца:

  • Корневая регистратор (и, следовательно, все дочерние регистраторы, если явно не настроены иначе) будут записываться в LogFileAppender. Ваш регистратор DataIntakeService явно не настроен, поэтому наследует эту конфигурацию.

  • EventLogAppender регистратор явно настроен на вход в EventLogAppender и настроен не наследуют параметры из родительских лесорубов (additivity="false"). Поэтому он не регистрируется до LogFileAppender. Если вы установите additivity="true", он наследует настройки и регистрируется как на LogFileAppender, так и на EventLogAppender.

Кстати, называя регистратор EventLogAppender, возможно, немного сбивает с толку: EventLogLogger может быть лучшим именем.

+1

Как я настроить его так, журналы DataIntakeService в файл, а другой к EventViewer? –

+1

Это хорошее объяснение спасибо. Чтобы уточнить, если 'additivity' не указан, то по умолчанию используется' True', правильно? – Ben

+1

@Ben, да, значение по умолчанию по умолчанию равно true: https://logging.apache.org/log4net/release/sdk/log4net.Repository.Hierarchy.Logger.Additivity.html – Joe

7

Вы можете использовать log4net для записи в разные регистраторы по следующей конфигурации.

<log4net> 
<logger name="LogFileLogger"> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
</logger> 
<logger name="EventLogger"> 
    <level value="INFO" /> 
    <appender-ref ref="EventLogAppender" /> 
</logger> 
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
</appender> 
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
</appender> 

А вы можете назвать лесорубов как:

private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger"); 
private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger"); 
Смежные вопросы