Log4Net loggen nicht aus einer Klassenbibliothek
Ich auf Arbeit bin .NET Framework 4.0 mit C# in Windows 7, und versuchen, sich aus ein Bibliothek-Klasse, aber es funktioniert nicht. Ich bin mit meiner Anwendung ohne Fehler, aber auch nichts geschieht, um meine log-Datei, weder auf meine Konsole.
So, hier ist mein code:
Dies ist mein App.config
Datei:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<add key="log4net.config" value="config.log4net"/>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newlineExtra Info: %property{testProperty}%newline%exception"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG"/>
<levelMax value="FATAL"/>
</filter>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="MyLogFile.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="5"/>
<maximumFileSize value="10MB"/>
<staticLogFileName value="true"/>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="debug"/>
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="error"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline%exception"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
</root>
<logger name="MyApplication">
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
Dies ist, was ich in meiner AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
Diese, was auf die Datei, die ich versuche zu Protokoll:
private static readonly ILog log = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Debug("Testing");
Wenn ich aus meinem Programm passiert nichts. Weiß jemand, warum?
- Dies funktioniert für mich. Sind Sie platzieren den code für AssemblyInfo.cs in der Bibliothek-Projekt, oder das Projekt?
- In der Bibliothek-Projekt.
- Wozu ist diese Zeile gut?
<add key="log4net.config" value="config.log4net"/>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ähnlich diese Antwort, die beide die app.config, log4net Konfiguration und der AssemblyInfo.cs-Konfigurator gesetzt werden muss in der host-Anwendung.
Können sagen, ich habe Projekt
Console
als Konsole Projekt, das ich ausführen, undLibrary
als Library-Projekt.Console
benötigen Sie eine app.config-Datei mit den oben genannten log4net Konfiguration, und in der AssemblyInfo.cs müssen die XmlConfigurator code innerhalb der it.Library
nicht brauchen, entweder von diesen, und arbeiten mit derLogManager
nennen.ILogService
und Bibliothek ist einLog4Net
Umsetzung der service-Deklaration in der Konsole-Anwendung, gemäß der obigen Lösung, die wir haben, um Sie auf Verweis hinzufügen, um Log4Net in der Konsole-Anwendung. Ist es eine best practice?Incase jemand noch auf der Suche auf dieser und der vorherigen Antworten zu können, müssen Sie instanziert einen logger in der host-Anwendung bevor Sie sich anmelden können aus der Bibliothek-Klasse.
Wenn man sich die log4net-Dokumentation für Montage-Attribute heißt es hierzu:
"Deshalb, wenn Sie verwenden Sie den Konfigurations-Parametern, die Sie aufrufen müssen log4net
um es zum Lesen der Attribute. Ein einfacher Aufruf von LogManager.GetLogger wird verursachen, dass die Attribute auf der aufrufenden assembly
gelesen und verarbeitet. Daher ist es zwingend notwendig, eine Anmeldung rufen Sie so früh wie möglich während der Anwendung start-up, und
sicherlich, bevor alle externen Assemblys geladen und aufgerufen."
Wenn die assembly-Attribute definiert sind, in eine Bibliothek-Klasse - d.h. eine externe assembly - wird es knifflig. Können Sie
log4net.Config.XmlConfigurator.Configure(path)
statt?