2009-07-19 14 views
9

mam zwyczaj wdrożenie formatowania XML dla log4.netprzy użyciu klasy otoki z log4net

public class ISDSApplicationEventsLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(...) 
    { 
     //Location Info 
     writer.WriteStartElement("Method"); 
     writer.WriteString(**loggingEvent.LocationInformation.MethodName * *); 
     writer.WriteEndElement(); 
    } 
} 

Problemem jest ... jak się zalogować nazwę metody teraz, kiedy wywołać metodę dziennika z mojego dziennika klasy otoki. .. nazywa rejestrowanie

public static void logEvent(string message) 
{ 
    log.Info(isdsLog); 
} 

mam wyjścia ....

<Method>logEvent</Method> 

Jak to możliwe, aby mieć nazwę metody, które nazywane logEvent, a nie logEvent jako nazwa metody?

Dziękuję

Pytanie Aktualizacja:

Jeżeli powyższe wydaje się nieco skomplikowany - co ja naprawdę pytaniem jest: Jak zachować kontekście sposobu, który wywołał funkcję rejestrowania owijania w log4net ...

... przykład metoda DoWork() wywołuje ... -> rejestrowanie wrapper -> połączenia log4net ....

Jak dokonać methodName = DoWork i nIE zalogowaniu WRA funkcja ppera ...

+0

Możliwy duplikat [Podczas korzystania z opakowania, jak zachować nazwę klasy i metody dla Log4Net do zalogowania?] (Http: // stackoverflow.com/questions/2049992/when-using-wrapper-how-to-keep-class-and-method-name-for-log4net-to-log) –

Odpowiedz

14

W rzeczywistości można to łatwo rozwiązać za pomocą gotowego log4net. Twój wrapper może wywołać Logger.Log i przekazać typ twojej klasy opakowania jako pierwszy parametr. Tak, Twój wrapper może wyglądać mniej więcej tak:

public class MyLog4NetWrapper 
{ 
    ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs"); 

    public void logEvent(string message) 
    {  
    log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null); 
    } 
} 

Kiedy log4net rejestruje wiadomości, przemierza w górę stosu wywołań aż robi się do sposobu, który deklarując typ jest równa typu przekazany jako pierwszy parametr metoda dziennika. Następną metodą na stosie jest faktyczna strona połączenia.

Jeśli chodzi o zawijanie dziennika log4net, nie jestem pewien, czy zaleciłbym tworzenie statycznej klasy opakowania. Głównym problemem jest to, że w pliku app.config można mieć tylko jeden konfigurowalny program rejestrujący. Innymi słowy, nie będziesz w stanie samodzielnie kontrolować rejestrowania z różnych części twojego kodu. Jeśli masz klasę A i klasę B i obie używają statycznego zapakowanego dziennika, obie klasy logują się na tym samym poziomie. Jeśli chciałbyś włączyć rejestrowanie dla klasy A i wyłączyć dla klasy B, nie byłbyś w stanie tego zrobić.

+0

Ach, oczywiście, czasami nie widać, co patrzy w twarz. Cóż, jeśli poprawisz swój kod na 'log.Logger.Log (...)' przynajmniej :) –

+0

Tak, masz rację! Naprawię próbkę kodu. – wageoghe

1

Nie sądzę, że łatwo można to naprawić za pomocą log4net. Jeśli spojrzymy na metodzie ILog.Info w the LogImpl class, że dzwonisz:

virtual public void Info(object message) 
    { 
     Logger.Log(ThisDeclaringType, m_levelInfo, message, null); 
    } 

Gdy wiadomość jest zalogowany, log4net będzie chodzić StackTrace bieżącego połączenia, aby wybrać metodę, która zainicjowała operacja dziennika. Aby to zrobić, Log4net używa typu "ThisDeclaringType" jako granicy wyszukiwania, pierwsze wywołania "powyżej" w tym typie są wybierane jako metoda inicjująca.

W twoim przypadku napotkano pierwszą metodę logEvent. Jeśli upuścisz opakowanie logEvent i użyjesz metod rejestrowania bezpośrednio, otrzymasz żądane informacje.

+0

Właściwie można utworzyć opakowanie programu rejestrującego, które może skutecznie zachować połączenie Informacje o stronie. Zobacz przykład kodu w mojej odpowiedzi na jeden sposób, aby to zrobić. Kluczem jest przekazanie typu zapakowanego rejestratora jako pierwszego parametru do metody Log (zamiast używania metod Info, Debug itp.). – wageoghe

Powiązane problemy