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?
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.
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.
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.
Hier ist meine Checkliste, wann sich log4net als widerspenstig erweist:
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();**
}
}
Dies sind die Schritte, mit denen meine Protokollierung funktioniert:
<appender name="MainLogger"...
<layout type="log4net.Layout.SimpleLayout"/>
<add key="log4net.Internal.Debug" value="true"/>
zu Ihrer appSettings
hinzu.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.
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
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"));
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
<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).