2009-08-30 1 views
2

ich meine log4net Wrapper und log4net dll haben in ihrer eigenen Klasse-Projekt, und ich habe folgendes AssemblyInfo.cs der Klasse ProjektKlasse Projekt nicht log4net.config aus dem Hauptprojekt Laden

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

So fügte meine Hauptprojekt hat die log4net.config Datei und Protokollierung funktioniert in meinem Hauptprojekt.

Ich habe auch ein anderes Klassenprojekt (nichts mit log4net zu tun), welches mein Hauptprojekt (wo Logging funktioniert) das Klassenprojekt aufruft. Also habe ich die neue Klasse Projekt eingeben und müssen etwas log aber IsDebugEnabled false zurück .. das ist die Linie

 LogManager.GetLogger("DebugLogger").IsDebugEnabled; 

so Hauptprojekt (Webprojekt), die einen Verweis auf meine LOGGING Klasse Rückkehr TRUE hat, sondern eine Klasse-Projekt das ich von meinem Hauptprojekt anrufe, gibt false zurück.

Es scheint, dass die Klasse-Projekt nicht die log4net liest

Irgendwelche Ideen?

Antwort

0

Wenn ich es richtig folgen, Ihr Setup ist wie folgt:

Webprojekt (web.config und log4net.config)

  • Referenzen Logging Wrapper
  • Referenzen -Klassenbibliotheksprojekt

Logging Wrapper

  • Referenzen log4net
  • Montage Enthält: XmlConfigAttribute

-Klassenbibliotheksprojekt

  • Referenzen log4net

Obwohl Sie keine Details zu Ihren log4net "Wrapper" Klasse nicht gebucht haben, Ich gehe davon aus, dass Ihr Webprojekt nicht direkt auf log4net zugreift, sondern über Ihren Wrapper.

Gemäß my last answer löst log4net die Konfiguration und erstellt das Protokollierungs-Repository in Ihrem Wrapper-Projekt. Obwohl ich mir ziemlich sicher bin, dass es gibt, klingt es so, als würde Ihr Klassenbibliotheksprojekt das Standard-Repository nicht finden. Da es auf der Ebene von AppDomain ist, bezweifle ich, dass es exklusiv für Ihre Wrapper Assembly direkt ist.

Stattdessen klingt das wie ein Timing-Problem. Was passiert, wenn Sie zuerst den Wrapper und dann Ihre Klassenbibliothek aufrufen? Ich vermute, Sie werden feststellen, dass Sie, wenn Sie Ihr Klassenbibliotheksprojekt zuerst aufrufen, keinen Logger bekommen.Wenn jedoch der allererste Protokollierungsaufruf zu Ihrem Wrapper gehört, sollten alle nachfolgenden Anforderungen für einen Protokollierer funktionieren. Dies liegt daran, dass das Wrapper-Projekt die Konfigurationsinformationen für die Konfiguration enthält und der erste Aufruf das Protokollierungs-Repository für die Anwendungsdomäne konfiguriert.

Obwohl ich kein großer Fan von log4net bin, können Sie dieses Problem beheben, indem Sie einen Aufruf Ihres Wrappers in der Startlogik der Anwendung erzwingen, oder indem Ihr Klassenbibliotheksprojekt Ihren Wrapper verwendet. Beachten Sie, dass Ihre Klassenbibliothek nicht alle integrierten log4net-Funktionen (wie IsDebugEnabled) nutzen kann, wenn Sie das Wrapper-Konzept verwenden, und Sie müssen diese Einstellungen über Ihren Wrapper auflösen.

+0

Danke Bryan, ja, ich fand Ihre andere Antwort sehr hilfreich .. Ich benutze den ThreadContext mit einem Klassen-Wrapper .. so ist mein Code Loggin es erscheint aber es ist der gleiche threadcontext - wenn das irgendeinen Sinn macht .. Also muss ich nachforschen –

1

Wird die Log4Net.config-Datei beim Erstellen in das Verzeichnis kopiert? Sie möchten sicherstellen, dass Log4Net.config in den Eigenschaften immer kopieren lautet.

Ich würde auch darüber nachdenken, es in der separaten Datei zu haben. Ich würde eher eine Konfigurationsdatei als mehrere bevorzugen. Wie Sie sehen können, ist es schwierig, mit verschiedenen Konfigurationsdateien umzugehen.

+0

ja es ist, ich habe seit seiner Gründung kein Problem mit log4net .. Ich benutze den ThreadContext mit einem Klassenwrapper .. so ist mein Code Loggin es erscheint aber es ist der gleiche threadcontext - wenn das Sinn macht ... Daher muss ich untersuchen –

Verwandte Themen