Log4net schreibt die Protokolldatei nicht


159

Ich habe mit Log4net ein einfaches Szenario erstellt, aber es scheint, dass meine Appender nicht funktionieren, da die Nachrichten nicht zur Protokolldatei hinzugefügt werden.

Ich habe der Datei web.config Folgendes hinzugefügt:

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

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

In der globalen ASAX-Datei habe ich hinzugefügt:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

und innerhalb der Application_Start-Methode:

logger.Info("Starting the application...");

Was habe ich falsch gemacht?

Antworten:


316

Rufst du an

log4net.Config.XmlConfigurator.Configure();

irgendwo, um log4net Ihre Konfiguration lesen zu lassen? ZB in Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

4
Vielen Dank, das war es, ich hatte die folgende Zeile: log4net.Config.BasicConfigurator.Configure (); Rufe ich dies auf, wenn ich die c # -Konfiguration anstelle von web.config verwende, um log4net zu konfigurieren? Ist dieser "Configure" -Methodenaufruf in irgendeiner Weise erforderlich, da ich in vielen Tutorials diese Codezeile nicht gefunden habe?
John84

9
Es gibt zahlreiche Möglichkeiten, log4net mitzuteilen, wo nach der Konfiguration gesucht werden soll (siehe logging.apache.org/log4net/release/manual/configuration.html) . Durch Aufrufen von XmlConfigurator.Configure () sucht log4net nach der Konfiguration in <app.exe> ​​.config oder web.config. BasicConfigurator.Configure wird (gemäß SDK-Dokumenten): "Initialisiert das log4net-Protokollierungssystem mit einem ConsoleAppender, der in Console.Out schreibt."
Andreas Paulsson

Zu Ihrer Information - Sie können auch log4net.Config.BasicConfigurator verwenden, wenn Sie NICHT möchten, dass es dateibasiert ist. Die Ausgabe wird an die Konsole gesendet.
SilverArc

1
Ich mache die Konfiguration in AssemblyInfoDatei. Gepostet als Antwort unten.
LCJ

Argh, ich habe so viele dieser Fragen gefunden und überall wird nicht erwähnt, wo sich die eigentlichen Protokolldateien befinden ... Ist es so offensichtlich, dass jeder es bereits weiß?
MrFox

50

Verwenden Sie diese FAQ-Seite: Apache log4net Häufig gestellte Fragen

Etwa 3/4 des Weges nach unten zeigt Ihnen, wie Sie das log4net-Debugging mithilfe der Anwendungsverfolgung aktivieren. Hier erfahren Sie, wo Ihr Problem liegt.

Die Grundlagen sind:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

Und Sie sehen die Ablaufverfolgung in der Standardausgabe


1
Vielen Dank, ich habe die FAQ überprüft, aber diese konnten mein Problem nicht lösen.
John84

1
Dank dieser Antwort konnte ich feststellen, dass sich mein rootAbschnitt auf den falschen Logger bezog !!
Seebiscuit

toller Tipp. Ich fand, dass der Zugriff für asp.net Benutzer verweigert wurde
Blue Clouds

Wenn es für jemanden nicht funktioniert, versuchen Sie bitte, dies zu verwenden: <log4net> <internal> <Debug value = "true"> </ Debug> </ internal> </ log4net>
himanshupareek66

35

Wie @AndreasPaulsson vorgeschlagen hat, müssen wir es konfigurieren. Ich mache die Konfiguration in AssemblyInfoDatei. Ich spezifiziere das configuration file namehier.

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

9
Was passiert, wenn ich sowohl dies als auch log4net.Config.XmlConfigurator.Configure () habe? unter Last?
n00b

1
@ n00b, dann können wir diese Zeile kommentieren, eigentlich nur so hat es bei mir funktioniert "log4net.Config.XmlConfigurator.Configure ();", und noch etwas: Ich habe dies auch in meinen web.config-Einstellungen hinzugefügt <Schlüssel hinzufügen = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Stellen Sie außerdem sicher, dass für [log4net] .config die Option "Immer kopieren" ausgewählt ist

Geben Sie hier die Bildbeschreibung ein


1
Dies war die Lösung für mich. Ich vergesse diese Einstellung immer.
Ju66ernaut

25

Stellen Sie sicher, dass der Prozess (Konto), unter dem die Site ausgeführt wird, über Berechtigungen zum Schreiben in das Ausgabeverzeichnis verfügt.

In IIS 7 und höher wird dies im Anwendungspool konfiguriert und ist normalerweise die AppPool-Identität , die normalerweise nicht zum Schreiben in alle Verzeichnisse berechtigt ist .

Überprüfen Sie Ihre Ereignisprotokolle (Anwendung und Sicherheit), um festzustellen, ob Ausnahmen ausgelöst wurden.


Vielen Dank für Ihre Hilfe. Ich habe auch über Berechtigungsprobleme nachgedacht, aber auch, wenn ich für den Ordner Lese-, Schreib-, Änderungs- und Ausführungsberechtigungen für alle festgelegt habe, funktioniert dies nicht.
John84

@ John84 - Bekommst du Ausnahmen? Haben Sie sich die Ereignisprotokolle angesehen?
Oded

Wie ich gerade herausgefunden habe, ist es auch wichtig, dass ein Windows-Dienst unter einem bestimmten Konto ausgeführt wird.
Bob Mc

Vielen Dank, das hat mir sehr geholfen.
Abbas

20

Einfügen:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

am Ende der Datei AssemblyInfo.cs


Dies war meine Rettung. Ausführen eines Desktop Forms-Projekts und Einfügen von log4net.Config.XmlConfigurator.Configure (); in der Hauptsache half nicht. Danke
Tomas Hesse

das hat mir geholfen. Ich hatte eine Konfiguration in web.config, aber log4net schien die vorgenommenen Änderungen nicht zu übernehmen. Ich fügte hinzu , „Watch = true“ zu diesem Attribut und anithing zu arbeiten begann
Albe

3

Für mich habe ich den Speicherort der Protokolldateien verschoben und erst als ich den Namen der Datei in etwas anderes geändert habe, wurde sie erneut gestartet.

Es scheint, dass nichts passiert, wenn bereits eine Protokolldatei mit demselben Namen vorhanden ist.

Danach habe ich die alte Datei umbenannt und den Protokolldateinamen in der Konfiguration wieder auf den ursprünglichen Wert geändert.


2

In meinem Fall wurde log4net aufgrund eines Leerzeichens in meinem Projektnamen nicht ordnungsgemäß protokolliert. Hat mich verrückt gemacht, warum der gleiche Code in einem anderen Projekt gut funktioniert hat, aber nicht in dem neuen. Räume. Ein einfacher Raum.

Achten Sie also auf Leerzeichen in Projektnamen. Ich habe meine Lektion gelernt.


1
Wo hatten Sie dieses Problem? Log4Net funktioniert in einem Projekt hervorragend, aber nicht in einem anderen ... ich weiß nicht warum. Tks
Pascal

1

In meinem Fall musste ich IIS_IUSRSder Protokolldatei die Berechtigung Lesen \ Schreiben erteilen .


1

Stellen Sie sicher, dass der folgende Zeilencode in der Datei AssemblyInfo.cs vorhanden ist.

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

Überprüfen Sie diese Zeile auch in der Application_start () -Methode.

log4net.Config.XmlConfigurator.Configure();

0

Ihre Konfigurationsdatei scheint korrekt zu sein. Anschließend müssen Sie Ihre Log4net-Konfigurationsdatei in der Anwendung registrieren. Sie können also den folgenden Code verwenden:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Nach dem Registrierungsvorgang können Sie die folgende Definition aufrufen, um den Logger aufzurufen:

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

log.Error("Sample log");

0

Für mich musste ich Logger in ein Nuget-Paket verschieben. Der folgende Code muss im NuGet-Paketprojekt hinzugefügt werden.

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

Weitere Informationen finden Sie unter https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ .


Vermeiden Sie Links als Antworten. Sie funktionieren möglicherweise nicht immer. Bearbeiten Sie möglicherweise Ihre Antwort, um eine Zusammenfassung der Informationen in den Link aufzunehmen.
Derek C.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.