Ich möchte grundsätzlich einen Kundenlogger/Tracer schreiben, der auch den Klassen- und Methodennamen der Methode protokolliert, die den Logger/Tracer aufruft. Dies sollte schnell sein, so dass es die Leistung der Anwendung nicht stark beeinflusst, stark typisiert und sauber ist. Hat jemand gute Ideen?Was ist der leistungsfähigste Weg, um den Namen von Klasse und Methode zu protokollieren?
Hier sind die wenigen, die ich hatte, aber ich über die Leistung sorgen durch Reflexion: (zu viel Overhead)
Stacktrace/StackFrame-
MethodInfo.GetCurrentMethod() (noch zu langsam? und nicht sehr sauber)
Pass-Methode als Delegierter (C#, dass implizit tun, und ich habe Zugriff auf die Method, aber nicht sehr sauber)
Ich freue mich über alle Kommentare.
UPDATE:
Ich mochte die cleanless von StackFrame- so fragte ich eine spezifischere Frage here in Bezug auf StackFrame- Leistung und ich habe einige wirklich gute Antwort einschließlich Leistungstests. Es stellt sich heraus, dass MethodInfo.GetCurrentMethod()
ist die schnellste (dauert etwa 1 Mikrosekunde auf meinem Computer) und new StackFrame(1)
kann auf Anfrage angefordert werden (dauert etwa 15-20 Mikrosekunden auf meinem Computer). Ich habe die Methode als Delegate Option weggeworfen, da es zu chaotisch ist, wenn die Methode mehrere Parameter hat.
FAZIT:
Ich habe bei allen Optionen gesucht und das Beste ist, eine benutzerdefinierte Plug-In für Postsharp zu schreiben, die den Methodennamen als String in MSIL während der Kompilierung einspritzt, wenn wie ein benutzerdefiniertes Attribut Anwendung [Trace]
dazu. Es ist meiner Meinung nach die schnellste und wartungsfreundlichste Option. Dies ermöglicht sogar viel mehr Dinge wie das Übergeben der Parameternamen und Argumente ohne irgendeine Art von Reflektion und das automatische Erfassen und Protokollieren von Ausnahmen. Diese my related question für weitere Informationen.
Darf ich fragen, warum Sie log4net nicht verwenden möchten? – nWorx
Ich mag es nicht, sich auf andere Komponenten zu verlassen. Und auch im Fall von log4net ist es viel zu komplex. –
Hermann, das wird in unserer Branche allgemein als "nicht erfundenes Syndrom" bezeichnet und ist am besten zu vermeiden. Hier ist ein Wikipedia-Link mit weiteren Informationen über dieses Leiden: http://en.wikipedia.org/wiki/Not_Invented_Here –