2015-10-21 13 views
5

Posiadamy opracowany wewnętrznie system logowania, a my chcieliśmy uzyskać korzyści z log4net, takie jak możliwość jednoczesnego korzystania z wielu aplikacji. Postanowiliśmy przenieść starszy system logowania do niestandardowego aplikatora log4net. To działało świetnie, gdy starsza wersja została poprawnie skonfigurowana, ale starszy rejestr faktycznie zapisuje dane do klienta WCF (powodując powolne rejestrowanie, dlatego chcieliśmy zaangażować innych użytkowników log4net), a ostatnio konfiguracja WCF nie była tym, czym jest powinien był być. Kiedy to się stało, aplikacja zdawała się działać poprawnie, ale najwyraźniej niestandardowy program do obsługi starego systemu nie działał. Inni aplikanci działali bez zarzutu, ale nie było żadnych danych wyjściowych od niestandardowego aplikanta i żadnych komunikatów o błędach wskazujących, że wystąpił problem.logowanie/obsługa błędów wewnątrz niestandardowego aplikatora log4net

Jaki jest właściwy sposób obsługi rejestrowania "rekursywnego", czyli logowania z niestandardowego aplikacji log4net? Próbowałem naiwne rozwiązanie: chwytając log4net z jego statycznego obiektu i zalogowaniem wewnątrz appender:

public class MyCustomAppender : AppenderSkeleton 
{ 

    protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
    { 
     try 
     { 
      // something which throws here... 
     } 
     catch (Exception ex) 
     { 
      log4net.LogManager.GetLogger(this.GetType()).Error(this.GetType().ToString() + ": error during append", ex); 
     } 
    } 
} 

To była awaria skrajną „System.Threading.LockRecursionException: nie rekurencyjne przejęć blokady odczytu dozwolone w tym trybie.” Słusznie; to było naiwne rozwiązanie.

Próbowałem również:

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex); 

w obsługi wyjątków, jak wydawało się możliwe, to może być słuszne. Nic nie stało się oczywiste.

Czy istnieje sposób rejestrowania błędów za pośrednictwem log4net wewnątrz aplikacji dostarczającej? Czy muszę zrobić coś takiego jak zapisywanie kodu w dzienniku zdarzeń systemu Windows bezpośrednio? Oczywiście istnieje wielkie niebezpieczeństwo nieskończonego rekurencyjnego zejścia, ale sądzę, że byłby jakiś sposób poinformowania operatora, że ​​jeden z aplikantów nie zdołał uruchomić.

JR

Odpowiedz

3

Oczywiście jak tylko będę pisał na pytanie, przypomniałem sobie coś. log4net ma przełącznik debugowania wewnątrz appSettings. Użyłem tego kodu:

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex); 

wewnątrz bloku catch, a następnie ustawić magię ustawienie na:

<appSettings> 
    <!--this is wonderful magic--> 
    <add key="log4net.Internal.Debug" value="true" /> 
</appSettings> 

Teraz ConsoleAppender (drugi appender używałem) zgasić niestandardowy komunikat wyjątku appender.

JR

0

Upewnij się, że tę linię na górze: wykorzystaniem System.Threading;

+0

Zapomniałem, jaki był pierwotny problem, ale moim celem było uzyskanie niestandardowego aplikatora log4net, aby zalogować się do mechanizmu log4net w czasie wykonywania. O ile mi wiadomo, instrukcja "using" naprawi wszystko tylko podczas kompilacji. W ogóle nie miałem problemu z kompilacją. Musiałem zobaczyć, co dzieje się nie tak podczas uruchamiania. – jrv

Powiązane problemy