2010-02-17 7 views
14

Mogę logować wiadomości bez problemu, ale nie mogę się dowiedzieć, jak logować pełne wiadomości. Każda pomoc będzie mile widziane.Log4net, jak zalogować pełną wiadomość?

Mój problem jest:

loggingEvent.Level można sprawdzić w funkcji Format. Możliwe są wartości: między innymi Info, Debugowanie, Błąd, Verbose, jest ich więcej, ale to są te, których będę używać głównie.

Rzeczywisty przedmiot dziennika ma jedynie następujące metody:

Log.Info Log.Debug Log.Warn Log.Error

Jak widać - nie rozwlekły!

Więc jak mogę się zalogować do opisowy wiadomość, to jest inna debugować

góry dzięki

+0

Krótka odpowiedź brzmi - Nie możesz, chyba że wykonasz jakąś pracę dla instalatorów. Może się to zmienić w późniejszych wersjach. To pytanie zostało zadane z myślą o wersji 1.2 produktu. –

Odpowiedz

29

Możesz dodać Verbose (lub poziom śledzenia) do log4net za pomocą metod rozszerzeń. To właśnie używam: przykład

public static class ILogExtentions 
{ 
    public static void Trace(this ILog log, string message, Exception exception) 
    { 
     log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
      log4net.Core.Level.Trace, message, exception); 
    } 

    public static void Trace(this ILog log, string message) 
    { 
     log.Trace(message, null); 
    } 

    public static void Verbose(this ILog log, string message, Exception exception) 
    { 
     log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
      log4net.Core.Level.Verbose, message, exception); 
    } 

    public static void Verbose(this ILog log, string message) 
    { 
     log.Verbose(message, null); 
    } 

} 

Zastosowanie:

public class ClientDAO 
{ 
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ClientDAO)); 

    public void GetClientByCode() 
    { 
     log.Trace("your verbose message here"); 
     //.... 
    } 
} 

Źródło:

http://www.matthewlowrance.com/post/2010/07/14/Logging-to-Trace-Verbose-etc-with-log4net.aspx

+6

Link jest martwy ... – Vaccano

3

Apache log4net ma następujące poziomy dziennika:

DEBUG < INFO < WARN < ERROR < FATAL

Dla wiadomości należy rozważyć czerwony bardziej szczegółowe niż komunikaty informacyjne (INFO), poziom DEBUG jest opcja, aby przejść. Pisanie wiadomości debugowania powinny być tak proste, jak:

myLog.Debug("This is a pretty verbose message"); 

Jeśli piszesz bardzo wiele wiadomości debugowania i/lub komunikaty są kosztowne w produkcji (np wiąże się z wysokimi ciąg konkatenacji), należy rozważyć dodanie warunkowa wokół wyrębu:

if (myLog.IsDebugEnabled) 
{ 
    myLog.Debug("This is a pretty verbose message"); 
} 

Jeśli znajdziesz się robi to często i chcą wyschnąć swój kod, należy rozważyć użycie extension methods for deferred message formatting, który zamieni powyższe stwierdzenie w ten sposób:

Log.Debug(() => "This is a pretty verbose message"); 
+0

proszę zobaczyć zaktualizowane pytanie ... wyjaśnia bardziej szczegółowo problem. –

+0

Ouy, to dramatycznie zmienia pytanie. Obawiam się, nie mam pojęcia, co odpowiedzieć teraz = \ –

+0

Zauważ, że metody 'ILog.xxxxFormat()' wykonują kontrolę '.IsxxxxEnabled' wewnętrznie –

3

Nie możesz dowiedzieć się, ponieważ AFAIK nie ma poziomu "gadatliwego" w log4net. Czy jest jeden w log4j?

Poniżej przedstawiono poziomy

ALL DEBUG INFO WARN ERROR FATAL OFF

Komunikaty informacyjne są te, gdzie można określić, co robisz obecnie w swojej aplikacji. Te komunikaty wypluwane przez komendy lub narzędzia systemu operacyjnego po wypowiedzeniu -verbose będą tego rodzaju wiadomościami.

komunikaty debugowania są głównie dla programistów i pozwala na zapis informacji, takich jak tworzenie, zmiennym cyklu życia, ślady stosu wyjątku itp coś, że tylko pracownicy programista/support byłby zainteresowany.

[Edytuj ] Pomyśl o tym.Możesz bardzo dobrze dodać przełącznik lub element konfiguracji do aplikacji o nazwie "verbose", a następnie wypluć komunikaty informacyjne, jeśli ustawione na true. Lub zapisz logowanie w metodzie pomocnika, która zaloguje się do log4net, a także wyśle ​​ten sam komunikat do konsoli. Ponadto można użyć konsoli ConsoleAppender, aby logować wiadomości do konsoli. Nigdy jednak tego nie użyłem. Czy tego właśnie szukałeś?

Mam nadzieję, że to pomoże.

+0

Zaktualizowałem pytanie ... zauważ, że LoggingEvent ma właściwość poziomu. Jedną z możliwych wartości jest verbose. –

+1

Niestety, nie widzę tej możliwej wartości w zestawie SDK. http://logging.apache.org/log4net/release/sdk/log4net.Core.Level.html Czy możesz określić, skąd je bierzesz? – Tanmay

+0

Myślę, że rozumiem, co mówisz. OOB (out of box) Log4net nie ma poziomu gadatliwego na wypowiedź, raczej odnosi się do wszystkiego powyżej informacji, które ze względów praktycznych oznaczają debugowanie. właśnie dlatego możesz go sprawdzić tylko podczas właściwego formatowania układu? –

2

Nie próbowałem, ale myślę, że powinno to być całkiem proste: wewnętrznie log4net zna poziom "verbose"; jest to tylko interfejs ILog, który go nie eksponuje. Dlatego powinno być całkiem proste dodanie do tego interfejsu metody IsVerboseEnabled i Verbose(). Oczywiście musisz chcieć zmienić kod źródłowy log4net ...

1

W case od kogoś jeszcze trzeba odpowiedź (bez użycia System.Reflection) Nie trzeba ustawiać opcji DeclaringType, wystarczy ustawić wartość null (automatyczne rozwiązywanie w Lo4Net)

public bool IsVerboseEnable { get { return _log.Logger.IsEnabledFor(Level.Verbose); } } 

public string Verbose(string text) 
{ 
    _log.Logger.Log(null, Level.Verbose, text, null); 
    return text; 
} 

Testowany & Zatwierdzone

użyć kodu w log4net

public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) 
{ 
    try 
    { 
     if (this.IsEnabledFor(level)) 
     { 
      this.ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : Logger.declaringType, level, message, exception); 
     } 
    } 
    catch (Exception exception2) 
    { 
     LogLog.Error(Logger.declaringType, "Exception while logging", exception2); 
    } 
} 
2

Przetestowałem log4net z BasicConfigurator i pisanie wiadomości dziennika generowane wyjście na wszystkich poziomach od ratownictwa dół do debugowania, ale nie dla TRACE lub VERBOSE.

Potrzebowałem wykonać poniższy kod, aby rozpocząć rejestrowanie.

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); 
((Hierarchy)logRepository).Root.Level = Level.All;