log4net funktioniert nicht

122

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 aufgefordert werde, werden log.debug("somemessage")einwandfrei ausgeführt, aber ich kann die mylog.logDatei nicht finden. Wo ist sie also?

Jakob
quelle
Überprüfen Sie dies auch: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

Antworten:

296

Ein Problem für diese Art von Dingen besteht darin, sicherzustellen, dass das XmlConfiguratorAttribut der Assembly hinzugefügt wird, indem Sie die folgende Zeile in Ihr Feld einfügen AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Andernfalls wird log4net nie aktiviert.

Kirk Woll
quelle
5
Diese Methode verwendet zur Arbeit in meinem Projekt, aber knapp irgendwie funktioniert. Ich musste diese Methode stackoverflow.com/a/1479343/193634 verwenden , damit es wieder funktioniert.
Rosdi Kasim
Ich habe es gerade noch einmal versucht und es funktioniert gut. Höchstwahrscheinlich referenzieren / laden Sie nicht die Assembly, die die enthält, AssemblyInfosobald Sie gedacht haben.
Kirk Woll
Für diejenigen, die ELMAH Appender verwenden, ist dies der richtige Weg. Ich hatte 'log4net.Config.XmlConfigurator.Configure ();' in global.asax.cs und es funktionierte gut für Datei-Appender, aber nicht für ELMAH-Appender.
user3885927
Ich habe diese Antwort angekreuzt und festgestellt, dass ich sie mit `[Assembly: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage
49

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

Erstens haben Sie tatsächlich angerufen

XmlConfigurator.Configure()

irgendwo in deinem Code? Wenn sich das obige XML-Snippet in der Anwendungskonfigurationsdatei befindet, reicht dieser Aufruf aus. Wenn sich das XML-Snippet in einer eigenen Datei befindet, müssen Sie die .Configure(string)Überladung verwenden, die den Pfad zur Datei verwendet. 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 protokolliert werden sollte, sollten Sie möglicherweise einen vollständig qualifizierten Pfad für die Protokolldatei eingeben, während Sie weiter debuggen. So können Sie sicher sein, wo sich die Datei befinden soll .

Rob Levine
quelle
33

Es gibt noch ein kleines Problem, 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.

Amir Abiri
quelle
Nur zur Veranschaulichung, beide Methoden haben bei mir in einer Konsolenanwendung funktioniert.
Rageit
Ich bestätige die obige Lösung - ich musste log4net.Config.XmlConfigurator.Configure () aufrufen; in meinem Code (der app.config verwendet, damit log4net effektiv funktioniert. Zeilen, die effektiv gedruckt werden, sind diejenigen, die nach der Ausführung der Configure () -Methode verwendet werden.
luisa rosi
19

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

  • Stellen Sie sicher, dass die Datei log4net.config beim Erstellen in den Ordner bin \ kopiert wird (im Compiler auf 'Kopieren, wenn neuer').)
    • Stellen Sie beim Umgang mit installiertem Code sicher, dass die Datei log4net.config für die Fahrt mitgekommen ist (im Compiler auf 'Inhalt' 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 Zweifel haben, geben Sie c: \ temp \ promiskuitive Berechtigungen und lassen Sie alles dort protokollieren ()
  • Starten Sie Sysinternal / Dbgview.exe, um zu sehen, ob Ihnen dies etwas sagt
Erdling42
quelle
3
"Stellen Sie sicher, dass die Datei log4net.config beim Erstellen in den Ordner bin \ kopiert wird (setzen Sie sie im Compiler auf" Kopieren, wenn neuer ")" -> rette meinen Tag! Vielen Dank!
Hoang Nguyen Huu
8

Für ein ASP.NET MVC-Projekt hinzufügen

log4net.Config.XmlConfigurator.Configure();

zur 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();
    }
}
Oladipo Olasemo
quelle
1
Hatte ein sehr seltsames Problem damit, in der Produktion und auf dem Computer meines Chefs funktionierten die Logger so gut, aber erst als ich Kirks Antwort bekam, funktionierte es auf meinem Computer. Ich dachte nur, ich würde die Leute wissen lassen, falls sie ähnliche Probleme haben (MVC-Projekt übrigens).
Shelby115
@ Shelby115, vielen vielen Dank! Ich habe versucht, meine log4Net-Einträge in ELMAH zu speichern. Ich hatte alles richtig in web.config. Ich hatte bereits 'log4net.Config.XmlConfigurator.Configure ();' in meiner global.asax.cs aber es wird nicht funktionieren. Kam zu diesem SO-Beitrag und fügte die Zeile zu AssemblyInfo.cs hinzu, basierend auf Kirks. Es hat immer noch nicht funktioniert! Nachdem ich Ihren Kommentar gelesen hatte, löschte ich den vorherigen Eintrag aus global.asax.cs und er begann zu funktionieren. Ich habe mehrere Stunden damit verbracht und Ihr Kommentar war eine große Hilfe. Danke noch einmal!
user3885927
Der Eintrag in global.asax.cs funktionierte einwandfrei für Datei-Appender, nicht jedoch für ELMAH-Appender. Kirks Weg funktionierte für ELMAH Appender (ich musste ihn speziell aus global.asax.cs entfernen)
user3885927
Möglicherweise möchten Sie auch sicherstellen, dass log4net über Schreibberechtigungen für das für die Protokolldateien konfigurierte Verzeichnis verfügt.
Oladipo Olasemo
@ Shelby115 Dang, ich muss es lieben, wenn du die Lösung vergisst und dein eigener Kommentar dein Problem löst. Das Aufrufen einer Seite mit einer Antwort, die Sie bereits positiv bewertet haben, ist ebenfalls ein guter Indikator.
Shelby115
7

Dies sind die Schritte, mit denen meine Dateiprotokollierung funktioniert hat:

  • -Überprüfen Sie, ob AssemblyInfo.cs das folgende Attribut enthält. [Assembly: log4net.Config.XmlConfigurator] . Dies lädt log4net.
  • Überprüfen Sie, ob das Protokollverzeichnis über Schreibberechtigungen verfügt.
  • Überprüfen Sie, ob für den Logger ein Format angegeben wurde. Überprüfen Sie dazu, ob für jedes Element in Ihrer Konfiguration ein Layoutelement angegeben ist. Z.B:

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

  • Versuchen Sie abschließend, die interne Protokollierung von log4net zu aktivieren, um die Konsolenprotokollierung zu aktivieren und die Konsole zu überprüfen. Fügen Sie <add key="log4net.Internal.Debug" value="true"/>dazu Ihre hinzu appSettings.
Echilon
quelle
<add key = "log4net.Internal.Debug" value = "true" /> Dies hat mir geholfen, das Problem zu beheben. Vielen Dank
Ravi Khambhati
Die Berechtigungen des Verzeichnisses haben mich dazu gebracht
Omar Himada
6

Ich habe Erfahrungen gemacht, bei denen Protokollierungssysteme ohne Ausnahmen stillschweigend ausfallen. Ich nehme an, dies ist sinnvoll, denn wenn der Logger Fehler protokolliert, wie kann er dann einen Fehler protokollieren, der keine Protokollierung durchführen kann?

Wenn die Datei nicht auf der Festplatte erstellt wurde, überprüfen Sie zunächst die Dateisystemberechtigungen um sicherzustellen, dass der Benutzer, unter dem Ihre Anwendung ausgeführt wird, eine neue Datei auf diesen Speicherort schreiben kann.

Zu Testzwecken möchten Sie möglicherweise die Datei auf der Festplatte, auf die geschrieben werden soll, manuell erstellen und jedem die Berechtigung zum Schreiben geben. Wenn der Logger anfängt, darauf zu schreiben, wissen Sie, dass er eher auf Berechtigungen als auf Konfigurationen basiert.

John K.
quelle
2

Ich habe vergessen, die zu kopierende Konfigurationsdatei zu markieren, während die App kompiliert wird.

Kopieren Sie die Konfigurationsdatei in das Ausgabeverzeichnis

Klicken Sie einfach mit der rechten Maustaste auf die Datei log4net.config, wählen Sie die Eigenschaft aus und wählen Sie dann In Ausgabeverzeichnis kopieren, um XXXX zu kopieren

Võ Quang Hòa
quelle
1

Ich habe alles versucht, aber nichts hat funktioniert. Das Hinzufügen dieser Zeile im Abschnitt von app.config hat configSections bei mir funktioniert.

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

Stellen Sie sicher, dass Versionund PublicKeyTokenkorrekt ist

Reyan Chougle
quelle
0
<param name="File" value="mylog.log" />

sagt "schreibe mylog.log in den aktuellen Ordner". Wenn sich Ihre Webanwendung unter IIS befindet, wird das Protokoll in C: \ inetpub \ wwwroot \ appname \ mylog.log geschrieben.

Wenn keine Protokolldatei 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 über SysInternals ausführen, um festzustellen, ob und wo eine Datei geschrieben wird.

Führen Sie VS auch im Debug-Modus aus, um festzustellen, ob Ausnahmen ausgelöst werden (Debug-> Ausnahmen-> CLR-Ausnahmen, aktivieren Sie Thrown).

Tomas Voracek
quelle
0

In meinem Fall habe ich vergessen, die Eigenschaften der Datei log4Net.config als "Inhalt" festzulegen, damit die Datei nicht in die Bereitstellung aufgenommen wurde. Also pass auf:

Compile action : Content
Marco
quelle
0

Leider hat keines der oben genannten Probleme geholfen. Die explizite Konfiguration in der Klasse, die zusätzlich zu den vorherigen Einstellungsvorschlägen protokolliert werden soll, hat mir geholfen.

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

Auch nach einigen Stunden fand ich heraus, warum es bei mir nicht funktionierte ...

ich hatte:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

aber es sollte sein:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Stellen Sie also sicher, dass sich der ILog in der ersten Zeile befindet.

Jeroen Bakker
quelle
1
Dies ist definitiv nicht die Ursache. Es spielt keine Rolle, wann Sie das ILog-Objekt initialisieren, solange Sie dies tun, bevor Sie die Protokollierungsmethoden aufrufen, z. B. _log.Info; _log.error etc.
Oladipo Olasemo