Два регистратора записывают в один и тот же файл

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

<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");

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


person Yuri    schedule 05.02.2015    source источник


Ответы (1)


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

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

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

<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);
}

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

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

person stuartd    schedule 05.02.2015
comment
Спасибо, попробовал, теперь только в файл ничего не пишет в журнале событий и ошибок нет - person Yuri; 05.02.2015
comment
Я предполагаю, что это будут разрешения. Это веб-приложение? - person stuartd; 05.02.2015
comment
Нет, это консоль, работающая под учетной записью администратора домена - person Yuri; 05.02.2015
comment
Попробуйте запустить его как администратор, если он пытается создать источник событий - я не использовал log4net для входа в журнал событий, но я видел это в других контекстах. - person stuartd; 05.02.2015