wake-up-neo.net

log4net funktioniert nicht

Hey, ich habe diese Konfiguration in meiner web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

aber log4net funktioniert nicht. Mein Projekt lässt sich gut kompilieren und ich bekomme auch keine Fehler beim Debuggen. Die Zeilen, in denen ich log.debug("somemessage") sage, werden gut ausgeführt, aber ich kann die mylog.log-Datei nicht finden. Wo ist sie?

112
Jakob

Für diese Art von Dingen müssen Sie unbedingt das XmlConfigurator-Attribut zur Assembly hinzufügen, indem Sie die folgende Zeile in Ihren AssemblyInfo.cs einfügen:

[Assembly: log4net.Config.XmlConfigurator]

Ansonsten wird log4net nie aktiviert.

278
Kirk Woll

Ich denke, entweder log4net protokolliert überhaupt nicht oder die Datei endet nicht dort, wo Sie es erwarten.

Erstens, haben Sie tatsächlich angerufen

XmlConfigurator.Configure()

irgendwo in deinem Code? Wenn das XML-Snippet oben in der Anwendungskonfigurationsdatei enthalten ist, wird dieser Aufruf ausgeführt. Wenn sich das XML-Snippet in einer eigenen Datei befindet, müssen Sie die .Configure(string)-Überladung verwenden, die den Pfad zur Datei enthält. Ohne diesen Aufruf (oder anscheinend das von Kirk Woll erwähnte Attribut auf Assembly-Ebene) wird log4net überhaupt nicht protokolliert.

Wenn Sie der Meinung sind, dass dies alles erledigt ist und log4net protokollieren sollte, sollten Sie während des weiteren Debugging einen vollständig qualifizierten Pfad für die Protokolldatei angeben. So können Sie sicher sein, wo sich die Datei sollte befinden.

48
Rob Levine

Es gibt noch einen kleinen Hinweis, siehe hier: http://logging.Apache.org/log4net/release/manual/configuration.html#dot-config

die [Assembly: log4net.Config.XmlConfigurator]-Methode funktioniert nicht mit app.config. Wenn Sie log4net über app.config konfigurieren, müssen Sie die log4net.Config.XmlConfigurator.Configure()-Methode verwenden.

30
Amir Abiri

Hier ist meine Checkliste, wann sich log4net als widerspenstig erweist:

  • stellen Sie sicher, dass die Datei log4net.config beim Erstellen in den Ordner bin\kopiert wird (im Compiler auf 'Copy if newer' gesetzt).
    • stellen Sie beim Umgang mit installiertem Code sicher, dass die Datei log4net.config während der Fahrt mitgekommen ist (im Compiler auf 'Content' gesetzt).
  • stellen Sie sicher, dass der Benutzer, unter dem der Prozess ausgeführt wird, über Schreibrechte für den Ordner verfügt, in den die Protokolle geschrieben werden sollen
  • wenn Sie sich nicht sicher sind, geben Sie c:\temp\Promiscuous-Berechtigungen ein, und lassen Sie sich dort alles anzeigen ().
  • starten Sie Sysinternal/Dbgview.exe, um zu sehen, ob Ihnen dies etwas sagt
16
earthling42

Für ein ASPNET MVC-Projekt hinzufügen 

log4net.Config.XmlConfigurator.Configure ();

zum Global.asax.cs hilft auch:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        **log4net.Config.XmlConfigurator.Configure();**
    }
}
7
Oladipo Olasemo

Dies sind die Schritte, mit denen meine Protokollierung funktioniert:

  • -Check AssemblyInfo.cs enthält das folgende Attribut. [Assembly: log4net.Config.XmlConfigurator] . Dadurch wird log4net geladen.
  • Überprüfen Sie, ob das Protokollverzeichnis über Schreibberechtigungen verfügt.
  • Prüfen Sie, ob der Logger ein Format angegeben hat. Dazu wird überprüft, ob für jedes Element in Ihrer Konfiguration ein layout -Element angegeben wurde. Z.B:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Versuchen Sie schließlich, die interne Protokollierung von log4net zu aktivieren, um die Protokollierung der Konsole zu aktivieren und die Konsole zu überprüfen. Fügen Sie dazu <add key="log4net.Internal.Debug" value="true"/> zu Ihrer appSettings hinzu.
6
Echilon

Ich habe Erfahrungen gemacht, bei denen Protokolliersysteme ohne Ausnahmebedingungen ohne Fehler ausfallen. Ich nehme an, dass dies sinnvoll ist. Wenn der Logger Fehler protokolliert, wie kann dann ein Fehler protokolliert werden, der die Protokollierung nicht durchführen kann?

Wenn also die Datei nicht auf der Festplatte erstellt wird, beginnen Sie mit Durchsuchen der Dateisystemberechtigungen, um sicherzustellen, dass der Benutzer, unter dem Ihre Anwendung ausgeführt wird, eine neue Datei an diesen Speicherort schreibt.

Zu Testzwecken möchten Sie möglicherweise die Datei manuell auf der Festplatte erstellen, auf die geschrieben werden soll, und die Berechtigungen für alle Personen öffnen, die darauf schreiben können. Wenn der Logger mit dem Schreiben beginnt, wissen Sie, dass er auf Berechtigungen basiert und nicht auf Konfiguration basiert. 

5
John K

Ich habe alles ausprobiert, aber nichts hat funktioniert. Das Hinzufügen dieser Zeile in app.configs configSections-Abteilung hat für mich funktioniert.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Stellen Sie sicher, dass Version und PublicKeyToken korrekt sind

1
Reyan Chougle

Leider hat keiner der oben genannten geholfen. Die explizite Konfiguration in der Klasse, die zusätzlich zu den vorherigen Einstellungsvorschlägen protokolliert werden soll, hat für mich den Trick getan.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
0
Petro Slyvko

In meinem Fall vergesse ich, die Eigenschaften der Datei log4Net.config als "Inhalt" festzulegen, sodass die Datei nicht in die Bereitstellung aufgenommen wurde.

Compile action : Content
0
Marco
<param name="File" value="mylog.log" />

sagt "schreibe mylog.log in den aktuellen Ordner". Das heißt, wenn Ihre Webanwendung unter IIS läuft, wird das Protokoll in C:\inetpub\wwwroot\appname\mylog.log geschrieben.

Wenn die Protokolldatei nicht vorhanden ist, hat das Konto, unter dem die App ausgeführt wird, möglicherweise keine Schreibberechtigung für den Ordner. Sie können Process Monitor von SysInternals aus ausführen, um zu sehen, ob und wo eine Datei geschrieben wird.

Führen Sie auch VS im Debug-Modus aus, um zu sehen, ob Ausnahmen ausgelöst werden (Debug-> Ausnahmen-> CLR-Ausnahmen, aktivieren Sie die Option Auslösung).

0
Tomas Voracek