it-swarm.com.de

Haben Sie log4Net Verwenden Sie die Anwendungskonfigurationsdatei für Konfigurationsdaten

Ich möchte log4net-Konfigurationsdaten in meiner application.config-Datei speichern. Basierend auf meinem Verständnis der Dokumentation habe ich Folgendes getan:

  1. Fügen Sie einen Verweis auf log4net.dll hinzu

  2. Fügen Sie die folgende Zeile in AssemblyInfo.cs hinzu:

    [Assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
  3. Initialisieren Sie den Logger wie folgt:

    private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
    
  4. Ich habe den folgenden Code in meiner 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>

Beim Ausführen der Anwendung wird jedoch die folgende Fehlermeldung in der Konsole angezeigt:

Es konnte kein Appender mit dem Namen [Consoleappender] gefunden werden.

Wie kann ich log4net dazu bringen, Einstellungen aus der Konfigurationsdatei zu lesen?

Vielen Dank!

49
laconicdev

Fügen Sie Ihrer app.config im configSections-Element eine Zeile hinzu

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

Dann später den log4Net-Abschnitt hinzufügen, aber an anderer Stelle an die eigentliche log4Net-Konfigurationsdatei delegieren ...

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

Schreiben Sie in Ihren Anwendungscode, wenn Sie das Protokoll erstellen

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

Von der in der Frage gezeigten Konfiguration ist nur ein Appender konfiguriert und heißt "EventLogAppender". In der Konfiguration für root verweist der Autor jedoch auf einen Appender mit dem Namen "ConsoleAppender", daher die Fehlermeldung.

35
Konstantin

Haben Sie versucht, Ihrer app.config einen configsection -Handler hinzuzufügen? z.B.

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

Ich unterstütze die Antwort von Charles Bretana voll und ganz. Wenn es jedoch nicht funktioniert, stellen Sie bitte sicher, dass es nur ein <section> Element gibt UND dass configSections das ist erstes Kind des Wurzelelements :

configsections muss nach der Konfiguration das erste Element in Ihrem app.Config sein:

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

Alle Appendernamen müssen im Root-Bereich enthalten sein.
In Ihrem Fall lautet der Name des Appenders EventLogAppender, aber im Abschnitt <root> <appender-ref .. Heißt er ConsoleAppender. Sie müssen zusammenpassen.

Sie können Ihrer Protokollkonfiguration mehrere Appender hinzufügen, die Sie jedoch im Abschnitt <root> Registrieren müssen.

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

Informationen zur Konfiguration von log4net finden Sie auch in der Apache Dokumentation .

1
Shekhar