2016-04-01 6 views
1

Ich habe eine Baugruppe, in der ich log4net verwende. Ich lade diese Assembly in Windows Forms-Anwendungen und Konsolenanwendungen. Es funktioniert wie erwartet in Windows Forms-Apps sowohl in Release- als auch in Debug-Builds und Konsolen-Apps in Debug-Builds, scheitert aber auf mysteriöse Weise an Release-Builds von Konsolen-Apps.Log4Net funktioniert nicht, aber nur für Release-Konsolen-Builds

Ich habe folgendes in meiner Datei AssemblyInfo.cs:

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

In Klassen, die Protokollierung verwenden I umfassen die folgenden Membervariable Erklärung:

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

Und meine Library.dll.log4net Konfiguration Datei sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?> 
<log4net> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" > 
    <file value="Library.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Once" /> 
    <maxSizeRollBackups value="5" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </root> 
</log4net> 

ich die Vorschläge inversucht haben,(Log4Net doesn’t write log in release mode - Console Application) aber sie scheinen nicht zu helfen.

Ich habe auch versucht, programmgesteuert internen Debugging so schnell wie möglich in der Assembly (im Konstruktor des ersten Objekts referenziert), aber das hat auch keine Auswirkungen.

Irgendwelche anderen Ideen? Kann jemand sehen, was ich falsch mache?

+0

Macht es einen Unterschied machen, wenn Sie Ihre AssemblyInfo.cs ändern, um die der vollständige Name, und nicht nur die Erweiterung, zB 'log4net.Config.XmlConfigurator (ConfigFile =" Library.dll.log4net ", Watch = true)]'? – sgmoore

+0

Leider macht es keinen Unterschied. –

Antwort

5

Wie heißt es in the documentation for assembly configuration attributes:

Deshalb, wenn Sie Konfigurationsattribute Sie log4net aufrufen müssen , damit sie die Attribute lesen. Ein einfacher Aufruf an LogManager.GetLogger bewirkt, dass die Attribute der aufrufenden Assembly gelesen und verarbeitet werden. Daher ist es unbedingt notwendig, einen Protokollierruf so früh wie möglich während des Anwendungsstarts vorzunehmen, und bevor alle externen Baugruppen geladen und aufgerufen wurden.

Da der Compiler ist freie Dinge in Release zu reorganisieren baut, scheint es wahrscheinlich, dass es bald genug, um nicht etwas, und die Anordnung Attribut optimiert ist abgeholt.

Wenn dies der Fall ist, ein einfacher expliziter Protokollierung-Aufruf im Startprogramm wird log4net zwingen, um die Konfiguration zu laden:

LogManager.GetLogger("Startup").Debug("This logging call loads the configuration"); 

Dies kann jedoch nach wie vor problematisch sein, zum Beispiel mit einigen Web-Anwendungen oder wenn (wie in Kommentaren) referenziert die Startup-Anwendung nicht log4net: In diesen Fällen müssen Sie einen expliziten Aufruf an das Konfigurationssystem anstelle des Assembly-Attributs verwenden. Es muss nur einmal aufgerufen werden.

Für eigenständige log4net Config-Dateien:

XmlConfigurator.Configure(new FileInfo(path_to_config)); 

Für config in einem configSection in web.config oder app.config

XmlConfigurator.Configure(); 
+0

In diesem Fall verwendet jedoch die externe Assembly log4net und führt Protokollierungsaufrufe aus. Der Protokollierungscode befindet sich in der externen Assembly. Die Konsolenanwendung, die die Assembly lädt, verwendet log4net nicht selbst. Gibt es keine Möglichkeit, log4net in dieser Konfiguration erfolgreich zu nutzen? –

+0

Ich vermute, mit einem Aufruf von 'XmlConfigurator.Configure (neue FileInfo (path_to_config))' anstelle des Attributs würde das Problem lösen. – stuartd

+0

Das funktioniert, ausgezeichnet! Wenn du dies als Antwort postest, akzeptiere ich es. Vielen Dank! –

Verwandte Themen