2010-07-29 29 views
5

przy naszym obecnym projekcie zdecydowaliśmy się użyć biblioteki korporacyjnej do logowania, do tej pory używaliśmy tylko log4net, ale nie mogę znaleźć porady, jak naprawdę korzystać z biblioteki w elastyczny sposób, co mam na myśli w log4net będzie to sposób:wzorzec do logowania przy użyciu biblioteki korporacyjnej

//define this in MyClass 
private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 
//and than in the methods you can call it like this 
log.Info("info message"); 

to pozwoliłoby mi iść do zastosowania nowszej oraz przez chainging konfigurację mogę włączyć info/ostrzec levelels dla poszczególnych klas, bez dotykania aplikację.

Jedyna próbka biblioteki rejestrowania jest w zasadzie tak:

LogEntry logEntry = new LogEntry(); 
logEntry.EventId = 100; 
logEntry.Priority = 2; 
logEntry.Message = "Informational message"; 
logEntry.Categories.Add("Trace"); 
logEntry.Categories.Add("UI Events"); 
Logger.Write(logEntry); 

ale nie chciałbym być zobowiązany do filtrowania na podstawie pewnych ciągów z literówek i podobne, a każdy deweloper wprowadzi swoje Category-znaków, co jest najlepszy sposób na ograniczenie tego, jakie są najlepsze praktyki dotyczące konstruowania komunikatów, po drugiej stronie powyższego rozwiązania nie jest zbyt przyjazne dla programistów, aby wymagać 10 wierszy dla pojedynczego logarytmu, użycie niektórych statycznych metod dla całego rozwiązania zmniejszyłoby elastyczność filtrowania, więc co to jest najlepszy sposób na wykorzystanie rejestrowania?
znalazłeś jakiś znaczący wzór, jak z niego korzystać?

dzięki almir

Odpowiedz

4

swoje akcenty pytanie na jednym z „problemów” Enterprise Library. Oczywiście, po prostu działa (zwykle z typowymi problemami), ale jeśli chcesz czegoś z odrobiną struktury, to go nie ma. Poza tym nie ma zbyt wielu wskazówek od Microsoft.

Oto co zrobię:

  • Dodam fasadę do bloku rejestrowania, który pozwala kontrolować sposób chcesz rejestrować dane. np. jeśli nie chcesz, aby programiści tworzyli własne kategorie, niech elewacja zajmie się wyliczeniem (możesz oznaczyć je jako flagi, aby umożliwić korzystanie z wielu kategorii).

  • Pozbyłbym się Priorytetu, ponieważ nie sądzę, że kupuje bardzo dużo, biorąc pod uwagę, że masz także Filie w Kategoriach ważności i Kategoriach.

  • Możesz również dodać przeciążenia do obsługi wyjątków i poprawności wyników (jeśli korzystasz z bloku aplikacji sprawdzania poprawności).

  • Inną możliwą funkcją jest dodanie nazwy klasy jako kategorii do obsługi rejestrowania dla poszczególnych klas. Możesz poprosić programistów o podanie nazwy klasy lub określić ją za pomocą refleksji. Wolę przepuszczenie go w

Więc można zrobić coś takiego:.

[Flags] 
public enum EventDataTypeCategory 
{  
    None = 0x0, 
    Failure = 0x1, 
    Error = 0x2 , 
    Warning = 0x4, 
    Information = 0x8, 
    Debug = 0x10, 
    Trace = 0x20, 
    UIEvents = 0x40, 
    DataAccess = 0x80 
} 

public static void LogMessage(string message, string className, int eventId, 
    EventDataTypeCategory categories) 
{ 
    // Create LogEntry 
    LogEntry logEntry = new LogEntry(...); 

    // Add all categories 
    foreach (EventDataTypeCategory enumValue in System.Enum.GetValues(typeof(EventDataTypeCategory))) 
    { 
     if ((enumValue & categories) == enumValue) 
     { 
      logEntry.Categories.Add(enumValue.ToString()); 
     } 
    } 

    if (className != null) 
    { 
     logEntry.Categories.Add(className); 
    } 

    ... 

    Logger.Write(logEntry); 
} 

Następnie można nazwać to tak:

public class MyClass 
{ 
    private static readonly string ClassName = typeof(MyClass).FullName; 

    public void DoSomething() 
    { 
     MyLogger.LogMessage("I'm going to DoSomething now!", 
      ClassName, 
      1001, 
      EventDataTypeCategory.Trace | EventDataTypeCategory.UIEvents); 
    } 
} 

Jeśli to nadal zbyt wiele argumentów następnie możesz mieć przeciążenie, które pobiera mniej parametrów i zapewnia wartości domyślne dla innych wartości. na przykład jeśli nie dbasz o EventIDs, ustaw go na 0.

0

Naprawdę nie odpowiadając na pytanie, ale skończyło się na tworzenie mój własny system rejestrowania.

Jedyną rzeczą, którą musisz zrobić, to:

Log.Instance.Add("This is a message"); 

wszystkich innych, bardziej złożonych zastosowań wykonywane są za pomocą różnych metod lub przeciążeń, na przykład:

Log.Instance.AddFormat("My favourite number is {0}", 42); 

Albo

Log.Instance.Add("This is an important message", LogLevel.Critical); 

Szczerze mówiąc, wciąż muszę spotkać się z przypadkiem, w którym wszystkie nadmierne komplikacje Lo Rejestrowanie g4Net i Enterprise są rzeczywiście niezbędne lub pożądane.

Aby uzyskać więcej informacji, zobacz mój profil (to część SixPack library)

Powiązane problemy