Пусть log4net использует файл конфигурации приложения для данных конфигурации - PullRequest
46 голосов
/ 17 декабря 2008

Я хотел бы сохранить данные конфигурации log4net в моем файле application.config. Основываясь на моем понимании документации, я сделал следующее:

  1. Добавить ссылку на log4net.dll

  2. Добавьте следующую строку в AssemblyInfo.cs:

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
  3. Инициализировать регистратор следующим образом:

    private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
    
  4. У меня есть следующий код в app.config:

    <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
      <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
      </appender>
      <root>
        <level value="INFO" />
        <appender-ref ref="ConsoleAppender" />
      </root>
    </log4net>

Однако при запуске приложения на консоли появляется следующая ошибка:

Не найдено ни одного аппендера по имени [Consoleappender].

Как я могу получить log4net для чтения настроек из файла конфигурации?

Спасибо!

Ответы [ 5 ]

37 голосов
/ 17 декабря 2008

Добавьте строку в ваш app.config в элементе configSections

<configSections>
 <section name="log4net" 
   type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, 
         Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>

Затем добавьте раздел log4Net, но делегируйте его в настоящий файл конфигурации log4Net в другом месте ...

<log4net configSource="Config\Log4Net.config" />

В коде приложения при создании журнала напишите

private static ILog GetLog(string logName)
{
    ILog log = LogManager.GetLogger(logName);
    return log;
}
33 голосов
/ 20 октября 2012

Из конфигурации, показанной в вопросе, настроен только один appender, и он называется «EventLogAppender». Но в конфиге для root автор ссылается на appender с именем «ConsoleAppender», отсюда и сообщение об ошибке.

4 голосов
/ 17 декабря 2008

Вы пытались добавить обработчик configsection в свой app.config? например,

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
2 голосов
/ 20 января 2015

Я полностью поддерживаю ответ @Charles Bretana. Однако, если он не работает, убедитесь, что существует только один <section> элемент И что configSections является первым дочерним элементом корневого элемента :

configsections должен быть первым элементом в вашем app.Config после конфигурации:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
  </configSections>
  <!-- add log 4 net config !-->
  <!-- add others e.g. <startup> !-->
</configuration>
1 голос
/ 30 декабря 2014

Все имена пользователей должны быть отражены в корневом разделе.
В вашем случае имя appender - EventLogAppender , но в разделе <root> <appender-ref .. оно называется ConsoleAppender . Они должны соответствовать.

Вы можете добавить несколько дополнений в конфигурацию журнала, но вам необходимо зарегистрировать каждого из них в разделе <root>.

<appender-ref ref="ConsoleAppender" />
<appender-ref ref="EventLogAppender" />

Вы также можете обратиться к документации apache по настройке log4net.

...