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?

john84
quelle

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();
}
Andreas Paulsson
quelle
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

bechbd
quelle
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)]
LCJ
quelle
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

Kokabi
quelle
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.

Oded
quelle
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

shay
quelle
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.

Kernowcode
quelle
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.

zanussi
quelle
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 .

Rahatur
quelle
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();
Prajakta Grünkohl
quelle
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");
Mahmut EFE
quelle
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/ .

Gurunadh Duvvuru
quelle
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.
0

Es gibt verschiedene Möglichkeiten, log4net zu verwenden. Ich fand es nützlich, als ich nach einer Lösung suchte. Die Lösung wird hier beschrieben: https://www.hemelix.com/log4net/

Drehrad
quelle