Подтвердить что ты не робот

Использовать файл конфигурации приложения log4net для данных конфигурации

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

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

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

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

    private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
    
  • У меня есть следующий код в моем 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 читать настройки из файла конфигурации?

Спасибо!

4b9b3361

Ответ 1

Добавьте строку в свой 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;
}

Ответ 2

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

Ответ 3

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

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

Ответ 4

Я полностью поддерживаю ответ @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>

Ответ 5

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

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

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

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

Ответ 6

Не забудьте установить свойство файла конфигурации "Copy To Output Directory = Copy Always" и ссылаться на файл конфигурации в сборке [assembly: log4net.Config.XmlConfigurator(ConfigFile = "App.config", Watch = true)] - после нескольких дней борьбы это наконец решило мою проблему.