web-dev-qa-db-de.com

Log4Net-Konfiguration in externer Datei funktioniert nicht

Wir verwenden log4net und möchten seine Konfiguration in einer externen Konfigurationsdatei angeben (wie bei anderen Abschnitten). Dazu haben wir den Log4net-Abschnitt in App.config geändert in:

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

Und in der Log.Config-Datei (gleiches Verzeichnis wie App.config) haben wir:

<log4net>
  <appender name="General" type="log4net.Appender.FileAppender">
    <file value="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

Beim Ausführen der App wird jedoch keine Protokolldatei erstellt (und es wird keine Protokollierung durchgeführt). Es werden keine Fehlermeldungen an die Konsole ausgegeben.

Wenn wir den Inhalt der Datei Log.config zurück in die App.config verschieben (und die erste Codezeile oben ersetzen), funktioniert es wie erwartet. Irgendeine Idee, warum es nicht in einer externen Datei funktioniert?

83
Robert Wagner

Haben Sie das folgende Attribut in Ihrer AssemblyInfo.cs-Datei: 

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

und Code wie folgt am Anfang jeder Klasse, für die Protokollierungsfunktionen erforderlich sind:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Ich habe einen Blogeintrag, der diese und weitere Informationen enthält hier .

106
Mitch Wheat

Es gibt einen offenen Fehler zu diesem Problem. Log4Net unterstützt das configSource-Attribut von Konfigurationselementen nicht. Um eine reine Konfigurationsdateilösung zu verwenden, verwenden Sie den Schlüssel log4net.Config in appSettings.

Schritt 1: Fügen Sie die Definition des normalen Konfigurationsabschnitts ein: 

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

Schritt 2: Verwenden Sie den magischen log4net.Config-Schlüssel in appSettings. 

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

Schritt 3: Tragen Sie einen Patch bei, um die Behandlung von configSource zu verbessern. 

36
Precipitous

Der Schritt, der übersehen wurde, ist

log4net.Config.XmlConfigurator.Configure(); 

dadurch wird die configSource verwendet. Stellen Sie sicher, dass Sie sie einmal aufrufen, bevor Sie GetLogger () aufrufen.

24
Greg Domjan

Stellen Sie sicher, dass Ihre Datei log4net.config mit den folgenden Eigenschaften festgelegt ist:

Aktion erstellen: Inhalt

In Ausgabeverzeichnis kopieren: Immer kopieren

18
Lewis Moten

Entweder verwenden,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

oder nur,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

In beiden Fällen sollte sich die Datei Log4Net.config im Ausgabeverzeichnis befinden. Sie können dies tun, indem Sie die Eigenschaften der Log4Net.config-Datei im Lösungs-Explorer festlegen

9
Byju

Achten Sie auf diese Ausgabe ...

In meinem Fall war alles richtig konfiguriert. Das Problem ist, dass ich Web Deploy in Visual Studio 2013 verwendet habe, um die Website auf WinHost.com hochzuladen und die ACLs auf dem Server zurückzusetzen. Dies wiederum hat alle Berechtigungen für Ordner und Dateien aufgehoben - log4net konnte die Datei nicht schreiben.

Mehr darüber erfahren Sie hier:

So verhindern Sie, dass Web Deploy/MSBuild Serverberechtigungen durcheinander bringt

Ich habe das Support-Team gebeten, die ACLs zurückzusetzen, und dann begann log4net, Protokolle zu erstellen. :)

1

Es ist auch möglich, einen Debug-Modus für log4net zu aktivieren. Fügen Sie dies in die App.config-Datei ein:

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

und Sie erhalten mindestens Fehlermeldungen, aus denen Sie ableiten können, was genau schiefgegangen ist. In meinem Fall habe ich einfach vergessen, Copy to output directory auf Copy Always zu setzen.

1
waka

Vorausgesetzt, Sie hatten eine externe Konfigurationsdatei namens log4net.config, die in Ihr Bereitstellungsverzeichnis kopiert wurde, können Sie sie wie folgt konfigurieren:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

using log4net;

namespace MyAppNamespace {
    static class Program {
        //declare it as static and public so all classes in the project can access it
        //like so: Program.log.Error("got an error");
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
             //configure it to use external file
            log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
            //use it
            log.Debug("#############   STARING APPLICATION    #################");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}
1
JJ_Coder4Hire

In meinem Fall habe ich folgende Fehlermeldung erhalten:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

Undlog4net.configDie Datei befand sich in Visual Studio 2017, aber als ich die Datei im Ordnerbin\Debugüberprüfte, konnte ich sie nicht finden.

Meine ursprüngliche Montageeinrichtung war wie folgt:

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Nach einiger Recherche ändere ich das Folgende und es funktioniert:

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]

@Mitch, es stellt sich heraus, dass es eine Datei mit der Deklaration [Assembly: ...] gibt, die jedoch nicht die ConfigFile-Eigenschaft hatte. 

Nachdem ich es hinzugefügt und auf Log.config gerichtet hatte, fing es an zu arbeiten. Ich hätte gedacht, dass es wie alle anderen Konfigurationsabschnitte (dh AppSettings) funktionieren würde und externe Konfigurationsdateien ohne Änderung akzeptieren würde.

Wir haben nicht die zweite Aussage, die Sie erwähnt haben, da wir sie in einen globalen Anbieter für statische Protokolle packen.

0
Robert Wagner

Ich hatte das gleiche Problem, abgesehen davon 

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

im laufenden Projekt hatte ich auch folgende Zeile in einem Referenzprojekt:

[Assembly: log4net.Config.XmlConfigurator]

Wenn ich diese Zeile in den referenzierten Projekten entfernt habe, werden die Protokolle angezeigt.

0
TheGuest
  1. folgendes hinzufügen zu AssemblyInfo.cs

[Assembly: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]

  1. Stellen Sie sicher, dass die Datei log4net.config im Projekt enthalten ist
  2. In den Eigenschaften von log4net.config 

ändern In Ausgabeverzeichnis kopieren in Kopieren, falls neuer

  1. Überprüfen Sie die Protokollebene Stufenwert = "ALL"
0
e03050