web-dev-qa-db-fra.com

Avoir log4Net Utiliser le fichier de configuration de l'application pour les données de configuration

Je voudrais stocker les données de configuration de log4net dans mon fichier application.config. Sur la base de ma compréhension de la documentation, j'ai fait ce qui suit:

  1. Ajouter une référence à log4net.dll

  2. Ajoutez la ligne suivante dans AssemblyInfo.cs:

    [Assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
  3. Initialisez l'enregistreur comme suit:

    private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
    
  4. J'ai le code suivant dans mon 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>

Cependant, lorsque j'exécute l'application, j'obtiens l'erreur suivante sur la console:

Aucun appender nommé [Consoleappender] n'a été trouvé.

Comment puis-je demander à log4net de lire les paramètres du fichier de configuration?

Merci!

49
laconicdev

Ajoutez une ligne à votre app.config dans l'élément configSections

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

Ensuite, ajoutez plus tard la section log4Net, mais déléguez le fichier de configuration log4Net réel ailleurs ...

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

Dans votre code d'application, lorsque vous créez le journal, écrivez

private static ILog GetLog(string logName)
{
    ILog log = LogManager.GetLogger(logName);
    return log;
}
38
Charles Bretana

De la configuration montrée dans la question il n'y a qu'un seul appender configuré et il est nommé "EventLogAppender". Mais dans la configuration pour root, l'auteur fait référence à un appender nommé "ConsoleAppender", d'où le message d'erreur.

35
Konstantin

Avez-vous essayé d'ajouter un gestionnaire configsection à votre app.config? par exemple.

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

Je soutiens pleinement la réponse de @Charles Bretana. Cependant, si cela ne fonctionne pas, assurez-vous qu'il y a n seul <section> élément ET que configSections est le premier enfant de l'élément racine:

configsections doit être le premier élément de votre app.Config après la configuration:

<?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>
2
Nick N.

Tous les noms d'appender doivent être reflétés dans la section racine.
Dans votre cas, le nom de l'appender est EventLogAppender mais dans le <root> <appender-ref .. section, il est nommé ConsoleAppender . Ils doivent correspondre.

Vous pouvez ajouter plusieurs appenders à votre configuration de journal, mais vous devez enregistrer chacun d'eux dans le <root> section.

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

Vous pouvez également vous référer à Apache documentation sur la configuration de log4net.

1
Shekhar