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

Не удалось получить конфигурацию для Common.Logging из раздела конфигурации "common/logging"

Я пытаюсь настроить консольное приложение со следующими сборками протоколирования:

  • Common.Logging.dll(2.1.0.0)
  • Common.Logging.Log4Net1211.dll(2.1.0.0)
  • log4net.dll(1.2.11.0)

Если регистратор настроен программно, тогда все работает нормально:

NameValueCollection properties = new NameValueCollection(); properties["showDateTime"] = "true";    
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter(properties);

Но если я попытаюсь запустить его, используя следующий файл конфигурации, он взрывается:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <sectionGroup name="common">
            <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
        </sectionGroup>
    </configSections>

    <common>
    <logging>
        <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
             <arg key="configType" value="FILE-WATCH"/>
            <arg key="configFile" value="~/Log4NET.xml"/>
        </factoryAdapter>
    </logging>
</common>
</configuration>

Это соответствующие сообщения об ошибках:

{"Unable to cast object of type 'System.Configuration.DefaultSection' to type 'System.Configuration.AppSettingsSection'."}

{"Failed obtaining configuration for Common.Logging from configuration section 'common/logging'."}

Кажется, что не удается разобрать мой файл конфигурации, кто-нибудь знает, какой должен быть правильный формат или это что-то еще не так? Я создал свой файл конфигурации, используя официальную документацию.

4b9b3361

Ответ 1

Есть две проблемы с вашим приложением (тот, который я загрузил):

  • Ваши конфигурационные файлы в app.config выглядят следующим образом:
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

    <sectionGroup name="common">
        <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
    </sectionGroup>

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

Обратите внимание, что раздел log4net объявлен дважды? Удалите первый.

  • После удаления первого раздела log4net я получаю следующее:

Не удалось загрузить файл или сборку 'log4net, Version = 1.2.11.0, Culture = neutral, PublicKeyToken = 669e0ddf0bb1aa2a' или одну из его зависимостей. Расположенное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Я загрузил log4net 1.2.11.0 с сайта log4net, разархивировал его, разблокировал dll и заменил log4net в вашем примере и, похоже, работает.

Ответ 2

У меня была эта (или связанная) проблема, а также через пол дня поиска ошибок и отладки я сузил ее до проблемы с конфигурацией.

Исключением было то же самое, что и OP и внутреннее исключение, из-за которого на нем не удалось найти Common.Logging.Log4Net (FileNotFoundException).

Кажется, что для пакета NuGet Common.Logging.Log4Net1211 они переименовали имя сборки как Common.Logging.Log4Net1211 вместо простого Common.Logging.Log4Net, Это означает, что в вашем app.config вам нужно ссылаться на это новое имя сборки: <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">

Здесь моя общая часть/раздел ведения журнала app.config для справки:

<common>
  <logging>
    <!-- Notice that it Log4net1211 -->
    <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">
      <arg key="configType" value="FILE-WATCH" />
      <arg key="configFile" value="~/Log4Net-MAIN.config" />
    </factoryAdapter>
  </logging>
</common>

Ответ 3

Я начал работать, установив недостающий пакет

Install-Package Common.Logging.Log4Net1211

Ответ 4

Я использую

Common.Logging v3.3.1.0

с

Common.Logging.Log4Net1213 v3.3.1.0

в ASP.NET Web API v5, который выдает исключение

"родительские конфигурации не разрешены"

Исключение выбрано из метод Common.Logging.ConfigurationSectionHandler.Create

Чтобы выполнить эту работу, мне пришлось грамматически настроить адаптер

var properties = new Common.Logging.Configuration.NameValueCollection();
properties["configType"] = "INLINE";
Common.Logging.LogManager.Adapter = new Log4NetLoggerFactoryAdapter(properties);

Мне еще нужно выяснить, почему IIS/Express вызывает метод Create дважды, что вызывает исключение из условия if, но, по крайней мере, сейчас давление отключено.

Ответ 5

Можете ли вы попробовать вместо Common.Logging.dll версии 2.1.1.0.

Вы можете загрузить и сравнить источник двух версий самостоятельно, но насколько я вижу, единственная разница между 2.1.0.0 и 2.1.1.0 - это изменение, связанное с чтением параметров конфигурации, чтобы обойти Framework 4.0 ошибка. Описание ошибки (см. http://support.microsoft.com/kb/2580188) означает запуск из общего сетевого ресурса, который я не запускаю из сети, но тестовое приложение используя 2.1.0.0, генерирует ту же ошибку, что и вы, в то время как 2.1.1.0 этого не делает.

Если вы используете другую библиотеку, ожидающую версию 2.1.0.0 от common.logging.dll, тогда вы должны иметь возможность использовать перенаправление сборки для использования вместо 2.1.1.0.

PS

Не уверен, что это актуально, но я оставил имя dll как Common.Logging.Log4Net121.dll и вместо этого изменил app.config.

Ответ 6

Я обнаружил, что это связано с тем, что пакет Common.Logging.Log4Net1211 NuGet получил более старую версию Common.Logging. Проверьте обновления NuGet на Common.Logging, и если вы найдете его, загрузите его и повторите попытку.

Ответ 7

Если ваш log4net равен 2.0.6 или выше, может быть удобно использовать Common.Logging.Log4Net.Universal package.