2015-02-05 6 views
0

Я сконфигурировал два регистратора и хочу, чтобы они одновременно регистрировались в журнале событий и текстовом файле, но оба они записывались в текст. Вот мой конфигурационный файл:Два регистратора, записывающих в один файл

<log4net> 
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
     <file value="NavRiskFileImportError.log" /> 
     <appendToFile value="true" /> 
     <maximumFileSize value="100KB" /> 
     <maxSizeRollBackups value="2" /> 
     <datePattern value="yyyyMMdd" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="{%level}{%date} – %message%newline"/> 
     </layout> 
    </appender> 

    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <param name="ApplicationName" value="NavriskFromExcel" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
     </layout> 
    </appender> 
<!--loggers--> 
    <logger name="FileLogger"> 
     <level value="ALL" /> 
     <appender-ref ref="RollingFile" /> 
    </logger> 

    <logger name="EventLogger"> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="EventLogAppender" /> 
     <appender-ref ref="RollingFile" /> 
    </root> 
    </log4net> 

В моем приложении у меня есть:

private static ILog logger= LogManager.GetLogger("FileLogger"); 
private static ILog eventLogger= LogManager.GetLogger("EventLogger"); 

Но оба регистраторы записи данных в файл, и ничего в журнале событий. Что я делаю неправильно?

ответ

3

Вы должны указать additivity="false" на отдельные регистраторы, в противном случае они наследуют appenders от корневого регистратора:

аддитивности устанавливается истина по умолчанию, то есть дети наследуют appenders своих предков по умолчанию , Если этот переменная установлена ​​в ложно, то appenders найдено в предках этого регистратора не используется (source)

Так что будет означать:

<logger name="EventLogger" additivity="false"> 

Это объясняет, почему и пишет файл.

Итак, оставшийся вопрос заключается в том, почему EventLogAppender не работает. Вы можете проверить на наличие ошибок конфигурации с этим кодом:

var messages = LogManager.GetRepository().ConfigurationMessages.Cast<LogLog>(); 

if (messages.Any()) 
{ 
    string message = messages.Aggregate("Log4net Configuration Errors: " 
             + Environment.NewLine, 
      (s, log) => s + log.Message + Environment.NewLine); 
} 

И если это ничего, enable log4net internal debugging не показывать и проверьте вывод.

Редактировать: в документации указано EventLogAppender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges, но источник события должен быть создан с помощью повышенного процесса или installer - источник события должен быть создан один раз на машину.

+0

Спасибо, попробовал, теперь он записывает только файл ничто в журнале событий и никаких ошибок – Yuri

+0

Мое предположение было бы разрешением. Это веб-приложение? – stuartd

+0

Нет, это консоль, запущенная под учетной записью администратора домена. – Yuri