2012-09-24 11 views
7

Czy istnieje sposób logowania się za pomocą log4net i używania parametru LogLevel as?Logować się przy pomocy log4net z językiem jako parametrem

Oznacza to, że zamiast pisać

Log.Debug("Something went wrong"); 

Chciałbym napisać coś takiego:

Log("Something went wrong", LogLevel.Debug); 
+0

Cóż mogłoby rozszerzyć klasę, ale susopect trzeba powiedzieć to dlaczego chcesz wprowadzić tę zmianę. –

+0

Przeważnie dla wygody. Mam aplikację, którą mogę uruchomić jako usługę systemu Windows lub aplikację konsoli. Podczas uruchamiania jako aplikacja konsolowa dzienniki powinny być drukowane na ekranie zamiast w pliku. Ponieważ została zaimplementowana, metoda, która dokonuje rejestrowania, pobiera parametr jako parametr. Wiem, że prawdopodobnie mógłbym użyć appendera konsoli dla log4net, ale nie wiem, jak wybrać, który z appenderów ma być używany podczas kompilacji. – olif

Odpowiedz

8

zgodnie z dokumentacją log4net here (poszukaj w log4net.Core.ILogger), można użyć dziennika metoda na interfejsie ILogger.

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

logger.Logger.Log(logger.GetType(),LogLevel.Debug,"Something went wrong", ex); 

Parametr Typ jest używany przez funkcję log4net do określenia granicy stosu wywołań między kodem logowania a kodem aplikacji. Jeśli włączone jest rejestrowanie nazw metod, to log4net nawiguje w górę stosu wywołań, dopóki właściwość DeclaringType metody MethodInfo na stosie nie będzie równa typowi przekazywanego typu (typ w dzienniku powyżej). Kiedy odkryje, że DeclaringType, następną metodą w stosie wywołań jest właściwa metoda wywołania (kod aplikacji).

Można również użyć przeciążenia o strukturze LoggingEvent.

Dokumentacja mówi również, że metoda Log jest przeznaczona do użycia przez owijarki. Nie wiem, czy należy to traktować jako komunikat "informacyjny", czy silną sugestię, by nie używać go bezpośrednio.

Jeśli chcesz, aby wszystkie połączenia rejestrowania metodą dziennika można zmienić kod gdzie masz rejestrator tak być (dzięki czemu można wyeliminować za pomocą właściwości Logger dla każdego wywołania Log):

private static ILogger logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType).Logger; 

logger.Log(logger.GetType(),LogLevel.Debug,"Something went wrong", ex); 
6

Rozszerzenie na odpowiedź @ wageoghe, w pisałem następujące metody rozszerzenia:

public static bool Log(this ILog log, Level level, string message, Exception exception = null) 
{ 
    var logger = log.Logger; 
    if (logger.IsEnabledFor(level)) 
    { 
     logger.Log(logger.GetType(), level, message, exception); 
     return true; 
    } 

    return false; 
} 

public static bool LogFormat(this ILog log, Level level, string messageFormat, params object[] messageArguments) 
{ 
    var logger = log.Logger; 
    if (logger.IsEnabledFor(level)) 
    { 
     var message = string.Format(messageFormat, messageArguments); 
     logger.Log(logger.GetType(), level, message, exception: null); 

     return true; 
    } 

    return false; 
}  

te pozwalają na wykonywanie połączeń, takich jak:

Log.Log(Level.Debug, "Something went wrong", myException); 

lub sformatowane wiadomości:

Log.Log(Level.Info, "Request took {0:0} seconds", duration.TotalSeconds); 
+0

To jest to, czego potrzebowałem, potrzebuję rutynowo logować się na jednym poziomie, ale czasami przekraczam poziom, dzięki czemu mogę zrzucać obiekty do pliku dziennika "na żądanie". –

+0

To jest dobre, ale dla większej elastyczności pierwsza metoda powinna akceptować "komunikat obiektowy" zamiast "komunikat tekstowy". – Miral

Powiązane problemy