2010-07-29 3 views
5

auf unserem aktuellen Projekt entscheiden wir uns, Enterprise-Bibliothek für die Protokollierung verwenden, bis jetzt haben wir nur log4net verwendet, aber ich kann keinen Rat finden, wie Sie die Bibliothek in flexibler Weise verwenden, was ich meine ist in log4net wäre dies der Weg sein:Muster für die Protokollierung mit Enterprise-Bibliothek

//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"); 

dies mir zu Anwendung gehen später ermöglichen würde, und durch Konfiguration variert werden ich info drehen konnte/warnen levelels für bestimmte Klassen, ohne die Anwendung zu berühren.

Die einzige Probe von Logging-Bibliothek ist im Grunde diese:

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); 

aber als ich auf einigen Strings mit Tipp- und ähnlichen, und jedem Entwickler seine Kategorie-Token würde filtern gebunden würde einführen, was ist Der beste Weg, dies zu begrenzen, sind Best Practices zum Erstellen von Nachrichten, auf einer anderen Seite über Lösung ist nicht sehr Entwickler freundlich zu 10 Zeilen für einzelne Protokollnachricht, die Verwendung einiger statischer Methoden für die gesamte Lösung würde die Flexibilität bei der Filterung, was ist der beste Weg zur Protokollierung?
Haben Sie ein sinnvolles Muster für die Verwendung gefunden?

dank almir

Antwort

4

Ihre Frage berührt eine der „Probleme“ der Enterprise Library. Sicher, es funktioniert einfach (mit einigen Konfigurations-Kopfschmerzen in der Regel), aber wenn Sie etwas mit ein wenig Struktur wollen, ist es nicht da. Außerdem gibt es nicht viel Anleitung von Microsoft.

Hier ist, was ich tun würde:

  • ich eine Fassade mit dem Logging-Block hinzufügen würde, mit dem Sie steuern, wie Sie Ihre Daten protokolliert werden sollen. Wenn Entwickler nicht möchten, dass ihre eigenen Kategorien erstellt werden, muss Ihre Fassade eine Aufzählung durchführen (Sie können sie als Flags markieren, um mehrere Kategorien zuzulassen).

  • Ich würde Priority loswerden, da ich nicht denke, es kauft sehr viel, wenn man bedenkt, dass Sie auch Severity und Kategorie zu filtern haben.

  • Sie könnten auch Überladungen hinzufügen, um Exceptions und ValidationResults zu unterstützen (wenn Sie den Validation Application Block verwenden).

  • Eine andere Funktion, die Sie vielleicht haben möchten, ist das Hinzufügen des Klassennamens als eine Kategorie, um die Protokollierung für bestimmte Klassen zu unterstützen. Sie könnten entweder die Entwickler den Klassennamen übergeben lassen oder Sie könnten dies durch Reflektion bestimmen. Ich ziehe vorbei es in

So könnte man so etwas tun.

[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); 
} 

Dann sind Sie es so nennen könnte:

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); 
    } 
} 

Wenn das immer noch zu viele Argumente dann Sie können eine Überladung verwenden, die weniger Parameter benötigt, und Standardwerte für die anderen Werte bereitstellen. z.B. Wenn Sie sich nicht um EventIDs kümmern, setzen Sie es auf 0.

0

wirklich nicht Ihre Frage zu beantworten, aber ich schließlich mein eigenes Logging-System zu schaffen.

Das einzige, was Sie tun müssen, ist:

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

Alle anderen komplexeren Nutzungen durch unterschiedliche Methoden oder mit Überlastungen getan, zum Beispiel:

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

Oder

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

Ehrlich gesagt, muss ich immer noch auf einen Fall stoßen, in dem all die Überkomplikationen von Lo g4Net und Enterprise Logging sind tatsächlich notwendig oder wünschenswert.

Weitere Informationen finden Sie in meinem Profil (es ist Teil des SixPack library)

Verwandte Themen