log4net-Strategie, die auf namens-Logger?
Ich in der Regel erklären die folgenden, in jeder Klasse:
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
- und die static-member innerhalb der jeweiligen Klasse anmelden, die auf verschiedenen Ebenen (info, debug, etc.)
Ich sah, dass irgendwo und mit etwas gedankenlos, mit der Begründung, daß die Einrichtung ist flexibel genug, um mir zu helfen filter von namespace und ein Protokoll zu den einzelnen Formen, wenn ich wollte, um bei der Fehlerbehebung von Produktionsproblemen und was nicht.
Aber ich habe selten in Benutzung hatte, die "Ebene" der bildenden Protokollierung. Also, würde ich mag, um zu sehen, was andere verwenden. Verwenden Sie die oben, da habe ich das Gefühl, viele sind mit nur dass, oder tun Sie erstellen benannter Logger wie "debug", "trace", "error", "moduleA", etc. und teilen Sie den logger bei den verschiedenen Arten, Baugruppen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich benutze grundsätzlich
denen Melden.Sie ist eine Klasse, die im Grunde bedeutet dies intern
Den startup-Kosten ist noch kleiner als die Reflexion sowie cleaner imo.
Update: da meine Erfahrung in späteren Jahren mit dependency injection, unit-testing und fakes kann ich nicht mehr sagen, dass ich gut, den Ansatz, die oben beschriebenen. Das problem mit dem Ansatz (sowohl meine und die des OP) ist, dass der code haben explizites wissen über wie die log-Instanz erstellt.
Einer eine Seite, diese erhöhte Kupplung macht es schwieriger, um zu testen: es gibt keine einfache Möglichkeit, anstelle der
ILog
Instanz mit einer gefälschten. Auf der anderen Seite werden änderungen an meinemLog
Klasse verursachen änderungen der welligkeit durch alle Klassen, der es verwendet.Ich gehe deshalb den Weg der Injektion die
ILog
Instanz, in der Regel über Konstruktor-Injektion und auslagern der wie konstruieren Sie einen logger zu mein DI-framework der Wahl:Dies ermöglicht für die richtige Entkopplung. Der code nicht mehr benötigen, zu wissen, wie Holzfäller gebaut werden. Die meisten dependency injection-frameworks haben, bedeutet der Blick auf die Art injiziert werden, und dann mit, dass zum erstellen der log-Instanz. Hier ist ein Ansatz für log4net und Autofac.
LogManager.GetLogger(typeof(MyClass))
wenn immer dieILog
Instanz?Die Kosten, es zu tun, Ihre originelle Art und Weise wird eine Instanz des ILog-Implementierung und die Zeit, die es braucht, um laufen " - System.Reflexion.MethodBase.GetCurrentMethod().DeclaringType" beim Start.
Ich erinnere mich daran, dass in ein paar Jahren zurück, und unsere startup-Kosten in der Größenordnung von 1 Sekunde pro 10000 Klassen, und weniger als ein megabyte pro 10k Klassen.
Gegeben, die eine so niedrige Kosten, habe ich nie bereut angesichts der incredibe Flexibilität log4net bietet.
Hinweis: ich kann nicht kommentieren, die andere Lösung hier, da ich neu bin.. aber diese Zeile:
Methode = neue System.Diagnostik.StackTrace().GetFrame(1).GetMethod();
Ist teuer, vor allem, wenn es für jede log-Meldung.
Einem Werkzeug, das Sie verwenden können mit der Protokollierung ist PostSharp (http://www.postsharp.org/). Es gibt eine kostenpflichtige und eine Kostenlose (Express) version. Ich habe es nur verwendet, um log-Methode Grenzen, aber ich weiß, Sie können es auch verwenden, für error-handling. Zwischen den beiden, das würde kümmern sich um die meisten Ihrer Anmeldung braucht, ohne das schreiben von code in jeder Klasse.
In letzter Zeit, ich habe so etwas wie dieses:
es lässt mich log4net verwenden, ohne die Erstellung einer Instanz in jeder Klasse, die ich brauche, es zu benutzen, und ich immer noch Klasse name und Methode, wo ich angemeldet die Aktion.
Beispiel für die Nutzung: