Frage

Ich untersuche die Unterschiede zwischen log4net und System.Diagnostics.Trace für die Protokollierung verwendet wird, und ich bin gespannt auf die Leistungsunterschiede ich beobachtet habe.

Ich habe eine Testanwendung die Leistung der beiden Protokollierungsmethoden in verschiedenen Szenarien zu vergleichen, und ich finde, dass log4net deutlich langsamer als die Trace Klasse. Zum Beispiel in einem Szenario, in dem ich 1.000 Nachrichten ohne Zeichenfolge Formatierung einzuloggen, log4net die mittlere Ausführungszeit über 1.000 Studien ist 9,00ms. Trace führt mit einem Mittelwert von 1.13ms. Viele meiner Testfälle haben eine relativ große Menge an Varianz in den log4net Ausführungszeiten; die periodische Natur der Ausreißer lange Ausführungen scheint GC Störungen vor. Stochern mit CLR Profiler bestätigt es eine große Menge von Sammlungen für eine Tonne log4net.Core.LoggingEvent Objekte ist, die erzeugt werden (um fair zu sein, es sieht aus wie Trace eine Tonne Char[] erzeugt als auch Objekte, aber es ist die große Varianz nicht angezeigt werden, dass log4net tut.)

Eine Sache, die ich im Sinne hier zu halten bin, dass obwohl log4net scheint etwa 9-mal langsamer als Trace, ist der Unterschied 8ms über 1.000 Iterationen; dies ist nicht gerade eine erhebliche Leistungs abtropfen lassen. Dennoch einige meiner erwarteten Anwendungsfälle könnten Aufrufe von Methoden, die Dinge Hunderttausende von Zeiten, und diese Zahlen sind von meinen schnellen Rechnern protokollieren. Auf einer langsameren Maschine mehr typisch für unsere Benutzerkonfigurationen ist der Unterschied 170ms auf 11ms, die ein klein wenig mehr alarmierend ist.

Ist diese Leistung typisch für log4net, oder gibt es einige Fallstricke, die deutlich log4net die Leistung erhöhen kann?

( Hinweis: Ich bin mir bewusst, dass die String-Formatierung die Ausführungszeit ändern kann, ich versuche, Äpfel mit Äpfeln zu vergleichen, und ich habe Testfälle ohne Formatierung und Testfällen mit Formatierung; log4net bleibt als proportional langsam, ob String Formatierung wird verwendet oder nicht. )

Was bisher geschah:

  • Robert Gould hat die beste Antwort auf die Frage; Ich war vor allem gespannt, ob es typisch war log4net zu sehen, führt viel langsamer als die Trace Klasse.
  • Alex Shnayder Antwort interessante Informationen ist aber unter den Anwendungsbereich der Frage nicht wirklich fallen. Die Hälfte der Absicht für diese Protokollierung Einführung ist bei der Fehlersuche sowohl logische als auch Performance-Probleme auf Live-Systemen zu unterstützen; unsere Kunden setzen unsere Produkte in vielen exotischen Szenarien, die oft nur schwer ohne teure und umfangreiche Hardwarekonfigurationen zu reproduzieren. Meine größte Sorge ist, dass eine große Zeitdifferenz zwischen „nicht anmelden“ und „Protokollierung“ das System in einer solchen Art und Weise beeinflussen könnten, die Fehler nicht passieren. Am Ende ist das Ausmaß der Leistungsabnahme groß, aber die Größe ist klein, so dass ich hoffe, dass es kein Problem sein wird.
War es hilfreich?

Lösung

ja log4xxx ist langsamer als Spur, da Spur normalerweise in der Nähe von Kernel-Tool, während log4xxx ein viel leistungsfähigeres Werkzeug ist. Persönlich bevorzuge ich log4xxx, weil es flexibilität ist, aber wenn Sie etwas, das nicht so viel Einfluss, und Sie nicht wirklich brauchen, Protokolle für die Produktion, sagen im Debug nur Spuren genug sein sollte.

Hinweis: Ich benutze log4xxx weil genau das gleiche für alle Sprachen mit einem log4 Bibliothek gilt nicht nur .Net

Andere Tipps

Sie interessieren könnten in der Common.Logging Bibliothek . Es ist eine dünne Abstraktion Wrapper über bestehende Protokollimplementierungen und ermöglicht es Ihnen, in jeder Logging-Framework Sie zur Laufzeit stecken mögen. Auch ist es viel schneller als System.Diagnostics.Trace wie in meinem Blog-Post über die Leistung .

hth, Erich

Aus meiner Erfahrung log4net Leistung ist kein Problem in den meisten Fällen. Die eigentliche Frage ist, warum sollten Sie auch brauchen, um „Protokollierung Dinge Hunderttausende von Zeiten“ in einem Produktionssystem.
Wie ich es sehe, in der Produktion sollten Sie nur Nötigste log (info nd Level warnen, kann), und nur wenn notwendig (Debuggen ein Problem vor Ort) sollte das Debuggen auf Debug-Ebene aktivieren.

Wenn Sie das Beste aus beiden Welten wollen, log4net können Sie auch auf den aspnet Tracer loggt sein. Ich schalte diese Option auf, wenn ich will Performance-Statistiken erhalten, die in auf bestimmte Ereignisse in meiner Protokollierung gebunden ist.

Hat gerade einen Test läuft sequental Schreiben in einem einfachen Datei-Vergleich im Vergleich zur Verwendung Log4Net für die gleiche task.Log4Net ist etwa 400-mal langsamer Comparet zu einem StreamWriter.So Ich halte Log4Net nicht verwendbar, wenn Sie zu riesigen schreiben Log-Dateien . Aber ich finde es sehr nützlich für kleine Mengen von Log-Einträgen und Debugging.

Vielleicht eine Lösung zu isolieren, die Protokollierung in einem separaten Thread in einigen Fällen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top