2008-09-25 8 views
9

mam jednowątkowego aplikacji ładuje kilka podzespołów w czasie pracy przy użyciu następujących:Jak korzystać z typowego odwołania do log4net w zespołach załadowanych w środowisku wykonawczym?

objDLL = Assembly.LoadFrom(strDLLs[i]); 

że chcieliby zespoły załadowane w ten sposób wykorzystać te same odnośniki log4net.ILog jako reszty do zespołów . Wygląda jednak na to, że zespoły ładowane w środowisku wykonawczym mają zupełnie inne odniesienie i wymagają własnej konfiguracji. Czy ktoś wie, czy pojedynczy log4net.ILog może być używany w złożeniach załadowanych w środowisku wykonawczym przy użyciu interfejsu .NET?

Oto stworzenie log4net.ILog i kod wspieranie w klasie Program:

// Configure log4net using the .config file 
    [assembly: log4net.Config.XmlConfigurator(Watch = true)] 

    public static class Program 
    { 
     private static log4net.ILog m_Log = null; 

     [STAThread] 
     public static void Main(string[] args) 
     { 
     try 
     { 
      m_Log = log4net.LogManager.GetLogger(
       MethodBase.GetCurrentMethod().DeclaringType); 
     } 

     } 
    } 
+0

Po co mielibyśmy je wszystkie mieć ten sam ILog? Możesz mieć jeden ILog na klasę i wszystkie logują się domyślnie do głównego programu rejestrującego. –

Odpowiedz

2

Jeśli wszystkie zespoły wdrożyć wspólny interfejs, a następnie można mieć parametr konstruktora lub właściwości, które pozwala zdać lokalna instancja ILog do dynamicznie ładowanych zestawów.

0

Coś w klasie ładowanej przez środowisko wykonawcze zapobiega działaniu zwykłego ILog na klasę. Mogę uzyskać poprawną instancję ILog, ale w przeciwieństwie do wszystkich innych instancji wygląda na to, że nie została skonfigurowana (wszystkie flagi Is ** Enabled są ustawione na false). Być może logger "root" nie jest dostępny dla klas załadowanych w czasie wykonywania ???

1

Możesz uzyskać ten sam program rejestrujący, podając literalny łańcuch nazwy rejestratora, uzyskując tym samym tę samą instancję rejestratora.

log4net.LogManager.GetLogger("SomeLogger"); 
0

Mam głupie rozwiązanie. Możesz ustawić XmlConfiguration na główny plik konfiguracyjny log4net.

[assembly: log4net.Config.XmlConfigurator(ConfigFile="<configpath>",Watch = true)] 

To naprawdę nie jest piękno .. ale działa.

1

Ta odpowiedź przychodzi 4 lata później, ale właśnie napotkałem ten sam problem. W moim przypadku odkryłem, że zestaw, który był ładowany (z innego folderu niż zestaw wywołujący), również ładował własne wystąpienie log4net.

Naprawiono problem, usuwając plik log4net.dll z folderu, w którym był ładowany zespół środowiska wykonawczego.

+0

OMG! Ten rozwiązał mój problem, gdy logowanie dynamicznie ładowanych zestawów nigdy nie działało, ponieważ działało poprawnie, gdy zespoły były używane w projekcie. –

Powiązane problemy