web-dev-qa-db-fra.com

Échec d'obtention de la configuration pour Common.Logging à partir de la section de configuration 'common/logging'

J'essaie de configurer une application console avec les assemblys de journalisation suivants: 

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

Si l'enregistreur est configuré par programme, tout fonctionne correctement:

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

Mais si j'essaye de le lancer en utilisant le fichier de configuration suivant, ça explose:

<?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>

Voici les messages d'erreur pertinents:

{"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'."}

Il semble impossible d’analyser mon fichier de configuration. Quelqu'un sait-il quel est le bon format ou s’il ya autre chose qui ne va pas? J'ai créé mon fichier de configuration en utilisant la documentation officielle .

22
jdecuyper

Votre application pose deux problèmes (celui que j'ai téléchargé):

  1. Votre configSections dans app.config ressemble à ceci:
<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>

Notez que la section log4net est déclarée deux fois? Retirez le premier.

  1. Après avoir supprimé la première section log4net, j'obtiens ce qui suit:

Impossible de charger le fichier ou l'assembly 'log4net, version = 1.2.11.0, Culture = neutre, PublicKeyToken = 669e0ddf0bb1aa2a' ou l'une de ses dépendances. La définition du manifeste de l'Assemblée localisée ne correspond pas à la référence de l'Assemblée. (Exception de HRESULT: 0x80131040)

J'ai téléchargé log4net 1.2.11.0 à partir du site Web log4net, l'ai décompressé, débloqué la dll et remplacé le log4net dans votre exemple et il semble fonctionner.

12
Jeroen

J'avais aussi ce problème (ou un problème lié) et après une demi-journée de recherche et de débogage d'erreurs, je l'ai réduit à un problème de configuration.

L'exception était identique à l'OP et l'exception interne à quelques niveaux à l'intérieur de celui-ci ne trouvait pas Common.Logging.Log4Net (FileNotFoundException). 

Il semble que pour le package NuGet Common.Logging.Log4Net1211, ils aient renommé le nom d'assembly/ Common.Logging.Log4Net1211 au lieu de/ Common.Logging.Log4Net . Cela signifie que dans votre app.config, vous devez faire référence à ce nouveau nom d'assembly: <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">

Voici toute ma section common/logging de app.config pour référence:

<common>
  <logging>
    <!-- Notice that it's 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>
22
Isak Savo

J'utilise 

Common.Logging v3.3.1.0

avec 

Common.Logging.Log4Net1213 v3.3.1.0

dans ASP.NET Web API v5, qui lève une exception 

"les sections de configuration parentes ne sont pas autorisées"

Une exception est levée à partir de Common.Logging.ConfigurationSectionHandler.Create method

Pour que cela fonctionne, je devais configurer l'adaptateur de manière grammaticale. 

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

Je dois encore comprendre pourquoi IIS/Express appelle deux fois la méthode Create, ce qui provoque la levée de l'exception dans la condition if, mais au moins, la pression est désactivée pour le moment.

3
ostati

Je l'ai eu en installant un paquet manquant 

Install-Package Common.Logging.Log4Net1211
2
Jaanus

J'ai trouvé que c'était dû au paquet Common.Logging.Log4Net1211 NuGet qui récupérait une version plus ancienne de Common.Logging. Recherchez les mises à jour de Common.Logging dans NuGet. Si vous en trouvez une, téléchargez-la et réessayez.

1
David Yates

Pouvez-vous essayer avec Common.Logging.dll version 2.1.1.0 à la place.

Vous pouvez télécharger et comparer le code source des deux versions vous-même, mais pour autant que je sache, la seule différence entre 2.1.0.0 et 2.1.1.0 est une modification relative à la lecture des paramètres de configuration afin de contourner un bogue de Framework 4.0. La description du bogue (voir http://support.Microsoft.com/kb/2580188 ) fait référence à l'exécution d'un partage réseau que je n'exécute pas à partir d'un réseau. Une application de test utilisant 2.1.0.0 génère la même erreur que vous obtenez alors que 2.1.1.0 ne le fait pas.

Si vous utilisez une autre bibliothèque qui attend la version 2.1.0.0 de common.logging.dll, vous devriez pouvoir utiliser une redirection d'assembly pour utiliser 2.1.1.0 à la place.

PS

Pas sûr que ce soit pertinent, mais j'ai laissé le nom de la dll comme Common.Logging.Log4Net121.dll et modifié le fichier app.config à la place 

1
sgmoore

Si votre log4net est 2.0.6 ou supérieur, il peut être pratique d’utiliser le package Common.Logging.Log4Net.Universal. 

0
Maxim Eliseev

Bien qu’il s’agisse d’une question ancienne, j’avais cette question quelques semaines auparavant et aucune des réponses actuelles ne semblait y remédier. Il semblait que ma configuration était correcte car de nombreuses autres applications utilisaient une configuration presque identique sans aucun problème. Après un peu de débogage et d’exécution à travers les stacktraces, j’ai finalement trouvé le problème.

 IIS

Notez que dans IIS, l'application API est hébergée sous une autre application. Dans ce cas, l'application CAMP et l'application API sous celle-ci utilisent toutes deux Common.Logging. De ce fait, les deux fichiers web.config sont chargés, Common.Logging lit la configuration de CAMP, puis il voit que API a une configuration et essaie de le lire également. Section de journalisation et jette vers le haut car il a déjà lu cela à partir de l'application CAMP.

À la fin, la solution consistait à déplacer le API hors de l'application CAMP dans IIS. Un cas un peu obsolète dans Edge, mais peut-être que quelqu'un d'autre sera peut-être confronté à ce problème un jour.

0
an earwig