2013-05-27 18 views
15

genannt wird, verstehe ich, dass thisquestionhasbeenaskedseveraltimes, aber leider habe ich arbeitet nicht in der Lage gewesen zu meiner Protokollkonfiguration zu erhalten. Ich muss irgendwo einen kleinen Fehler machen.log4net funktioniert nur, wenn XmlConfigurator.Configure()

Ich habe eine .NET 4.5 MVC 4/EF 5 Webanwendung und ich versuche, Protokollierung zu arbeiten. Die Lösung enthält zwei Projekte, eines für die DAO- und Modellobjekte und eines für die Website. Die App.Config Datei sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="RebuildingTogetherEntities" connectionString="stuff..."/> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
    <log4net configSource="Log.config" /> 
</configuration> 

Das gleiche log4net Abschnitt wurde auch in die Web.Config-Datei kopiert worden ist.

Ich habe folgendes auf beide AssemblyInfo.cs Dateien:

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

"Copy To Output Directory" wird für beide Log.Config Dateien auf true.

Die einzige Möglichkeit, dass ich Protokollierung zum Anhängen an die Ausgabedatei scheinen kann, ist XmlConfigurator.Configure() aufrufen, bevor die erste Protokollierungsanweisung ausgeführt wird. Ich denke, ich kann eine Fassade schreiben, um das zu tun, wenn ich den Logger zum ersten Mal erhalte, aber das fühlt sich einfach falsch an.

Wie kann ich den Logger initialisieren, ohne den XmlConfigurator manuell aufzurufen?

+0

http Does: // stackoverflow.com/questions/3971250/log4net-configuration-from-assembly-attribute-does-not-load-configuration-file anwenden? – sgmoore

+0

Es scheint nicht ... in diesem Fall gab es eine Nachricht von log4net vor dem Herunterfahren der Anwendung, aber ich sehe diese Nachricht in meinem Fall nicht. Danke für den Vorschlag. – Brad

+0

Ich bin mir nicht sicher, ob ich deiner Logik zustimme. Sie werden die log4net-Nachricht nur sehen, wenn die interne Protokollierung aktiviert ist und wenn Ihr System Ihre log.config nicht liest, ist es wahrscheinlich nicht aktiv. Der wichtige Punkt ist, dass, wenn Sie etwas wie GetLogger (...) tun, das System im Prinzip etwas Ähnliches wie Attribute.GetCustomAttributes (Assembly.GetCallingAssembly(), typeof (log4net.Config.ConfiguratorAttribute), false) tun wird. Wenn Sie also nicht sehr früh beim Start der Anwendung protokollieren, wird Ihre erste Protokollierung möglicherweise von einer Assembly initialisiert, die das benutzerdefinierte Attribut nicht weiter ausführt. – sgmoore

Antwort

6

Sie brauchen nicht die XmlConfigurator manuell aufrufen, wenn Sie verwenden:

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

Jedoch Sie haben den Tag, um alle Ihre DLLs (alle assambly.cs-Dateien) hinzufügen.

+1

Die Anwendung protokolliert immer noch nicht, auch wenn dies leider hinzugefügt wird. – Brad

+2

Sie können das log4net-Debugging aktivieren: http://haacked.com/archive/2006/09/27/Log4Net_Troubleshooting.aspx – Peter

+0

Könnten Sie bitte erklären, warum Sie dieses Attribut zu * all * dll's hinzufügen und nicht nur zum Host? – DarkWalker

16

Ich habe genau das gleiche Problem konfrontiert. Wie Sie richtig hervorheben, sollten Sie nicht explizit XmlConfigurator aufrufen müssen, wenn Sie die Zeile in Ihre AssemblyInfo.cs einschließen. Das Problem tritt auf, wenn die erste Verwendung von log4net in einer Assembly ist, die diese Zeile nicht enthält. In meinem Fall habe ich das Paket Topshelf.Log4Net NuGet verwendet, und die erste Protokollzeile, die meine Anwendung protokolliert hat, war dabei.

Sie könnten nur eine Zeile früh in der App einloggen, oder falls Sie brauchen, um etwas nicht anmelden das tun, was ich tat, und fügen Sie den folgenden am Eintrittspunkt der Anwendung

LogManager.GetLogger(typeof(Program)); 
+0

Große Antwort. Wir hatten das gleiche Problem, bei dem ein Objekt, das von unserem DI-Container automatisch erstellt wurde, vor der Hauptanwendung eine Protokollierungszeile ausspuckte. – BBoy

+0

Was für ein Lebensretter. Setzen Sie es in global.asax.cs und es funktionierte perfekt. Verbrachte buchstäblich einen Tag dafür. – arviman

+0

Was ist Programm in diesem Fall? – Euridice01

Verwandte Themen