log4net vs. Nlog

355

Hat jemand Erfahrung für beide? Wie stapeln sie sich?

Wir planen, eine davon für die Anmeldung in einer Unternehmensanwendung zu verwenden.

Verweise:

log4net

nlog

BEARBEITEN: Wir haben keine Abhängigkeiten zu nlog oder log4net.

Greg Dean
quelle
9
Dies ist der Logger, den ich verwende: System.IO.File.AppendAllText (@ "c: \ log.txt", string.Format ("{0} \ r \ n", Nachricht));
Zumalifeguard
213
Gut für Sie, aber einige Leute benötigen möglicherweise die Fähigkeit, die Protokollierung dynamisch
Tor Hovland
23
Es ist zu beachten, dass die Log4Net-Dokumentation schrecklich ist.
BentOnCoding
Es gibt einen detaillierten Blog-Beitrag robertmccarter.com/switching-to-nlog
Michael Freidgeim
2
Sie sollten ReflectInsight ausprobieren. Viel mächtiger als beide insightextensions.codeplex.com
code5

Antworten:

383

Ich wurde kürzlich beauftragt, einen Prototyp für ein bevorstehendes Projekt zu erstellen. Ich hatte keine Erfahrung mit dem Protokollierungsframework. Ich recherchierte, durchlief Tutorials, erstellte Spielzeug-Apps usw. für einige Tage in Log4Net, NLog und Enterprise Library. Kam 3-4 Wochen später zurück und fügte sie zu einer zusammenhängenden Demo zusammen. Hoffentlich ist einiges davon für Sie nützlich.

Meine Empfehlung für unser Projekt lautet:

  1. Verwenden Sie eine Protokollierungsfassade (z. B. Common.Logging , SimpleLoggingFacade ), um direkte Abhängigkeiten zu vermeiden.
  2. Wenn wir Enterprise Library für andere Einrichtungen verwenden, verwenden Sie es auch für die Protokollierung.
  3. Wenn wir am Ende etwas verwenden, das von Log4Net abhängig ist, verwenden Sie Log4Net.
  4. Wenn dies nicht der Fall ist, verwenden Sie NLog. Was ich vorziehen würde.

Das basiert auf diesen Erkenntnissen (Meinungen!):

  • Alle 3 Frameworks sind in der Lage und können einige anspruchsvolle Dinge tun. Wir wollen eine Qualitätslösung, brauchen aber ehrlich gesagt keine ultrahohe Leistung oder 60 Arten von Ereignissenken.
  • Alle 3 haben sehr ähnliche Grundkonzepte.
  • Jedes hat seine eigenen coolen Tricks, wie wirklich fortgeschrittenes Routing oder dynamische Protokolldateinamen, Abschneiden von Dateien usw.
  • Alle 3 sind auf ihre Weise ziemlich gut dokumentiert.
  • Für einen Neuling wie mich waren sie anfangs alle etwas umständlich. Keine drastischen Unterschiede hier für die Grundlagen. Ich bin darüber hinweggekommen.
  • Bei einem erneuten Besuch einige Wochen später war NLog eindeutig am einfachsten wieder aufzunehmen. Ich brauchte sehr wenig Auffrischung. Mit Log4Net musste ich einige Online-Beispiele erneut besuchen, um loszulegen. Mit EntLib habe ich aufgegeben und die Tutorials noch einmal von Grund auf neu gemacht - ich war total verloren.
  • Ich konnte nicht herausfinden, wie EntLib dazu gebracht werden kann, sich in der Datenbank anzumelden. Es mag einfach sein, aber es war jenseits meines Zeitlimits.
  • Log4Net und NLog haben einen geringen In-Code-Footprint. EntLib ist Spam, aber ich würde trotzdem eine Fassade darüber verwenden.
  • Ich habe EntLib versehentlich falsch konfiguriert und es wurde mir zur Laufzeit mitgeteilt. Log4Net nicht. Ich hatte keine versehentliche Fehlkonfiguration mit NLog.
  • EntLib wird mit einem gut aussehenden app.config-Editor geliefert, den Sie zu 100% benötigen. NLog hat ein Konfigurationsdateischema, so dass Sie "Intellisense" erhalten. Log4Net wird mit nada geliefert.

Offensichtlich mag ich NLog so weit. Nicht genug, um es zu verwenden, obwohl eine andere Lösung verfügbar ist.

Matt
quelle
19
+1 bei der Empfehlung, eine Fassade für echte Trennung von Bedenken (SoC) zu bauen, oder damit Sie Ihre Domain nicht verschmutzen.
eduncan911
66
Die Fassade funktioniert nur, wenn Sie dies tun können, ohne die vom Aufrufstapel abhängigen Diagnosewerte usw. zu beschädigen. Ich habe viele Fassaden gesehen, die diese wesentlichen Diagnosefunktionen beschädigen, die letztendlich mehr Schaden anrichten ...
James Schek
11
Log4Net unterstützt die Client-Profile von .NET 3.5 SP1 und .NET 4 noch nicht, da es auf System.Web verweist. Ich wollte nur darauf hinweisen, obwohl es eigentlich eng mit "mit einer Abhängigkeit von Log4Net, verwenden Sie Log4Net" zusammenhängt.
Simon D.
59
NLog wird aktiv unterstützt ( nlog-project.org/download ), während Log4Net seit Veröffentlichung der Version 1.2.10 am 19. April 2006 nicht mehr aktualisiert wurde ( issue.apache.org/jira/browse/LOG4NET/fixforversion/11128 )
Jay Cincotta
5
Wenn Sie eine Abhängigkeit von einer Bibliothek haben, die log4net verwendet, und stattdessen NLog verwenden möchten (oder umgekehrt), ist es ziemlich einfach, eine benutzerdefinierte Appender-Klasse zu schreiben und zu konfigurieren, um die beiden zu überbrücken.
dbkk
158

Eine wichtige Überlegung, die nicht viel diskutiert wurde, ist Support und Updates.

Log4Net wurde seit Veröffentlichung der Version 1.2.10 am 19. April 2006 nicht aktualisiert .

Im Gegensatz dazu wird NLog seit 2006 aktiv unterstützt. In Kürze wird NLog 2.0 veröffentlicht, das viele Plattformen unterstützt, die zum Zeitpunkt der letzten Aktualisierung von log4net noch nicht vorhanden waren, wie z.

  • NET Framework 2.0 SP1 und höher, 3.5 und 4.0 (Client- und erweiterte Profile)
  • Silverlight 2.0, 3.0, 4.0
  • .NET Compact Framework 2.0, 3.5
  • Mono 2.x Profil
Jay Cincotta
quelle
30
Aber muss es aktualisiert werden? Wenn es nicht kaputt ist, reparieren Sie es nicht?
Glenneroo
24
Es ist kaputt: * Die IP-Adressauflösung zwischen IPv4 / IPv6 für localhost unter Vista und Win7 wird durcheinander gebracht (mehrere inoffizielle Patches schweben herum). *
Wird
6
Für Log4Net scheint eine .NET 4.0-Version in Arbeit zu sein.
scope_creep
38
log4net hat v1.2.11 im Oktober 2011 gestartet . Ich denke, diese Antwort ist jetzt veraltet.
Mariano Desanze
83
Eigentlich war diese Antwort für mich immer noch wertvoll. Ich bin gerade dabei, einen Logger auszuwählen, und diese Antwort sagt uns, dass log4net im letzten halben Jahrzehnt einmal aktualisiert wurde, während NLog ein aktiveres Projekt ist.
Batibix
97

Nachdem ich kürzlich Erfahrungen mit beiden Frameworks gemacht hatte, dachte ich, ich kann meine Ansichten zu jedem Framework teilen.

Ich wurde gebeten, die Protokollierungsframeworks für eine vorhandene Webanwendung zu evaluieren. Nachdem ich verschiedene Online-Foren durchgesehen hatte, beschränkte ich meine Auswahl auf NLog (v2.0) und log4net (v1.2.11). Hier sind meine Ergebnisse:

  1. Das Einrichten / Starten von NLog ist kinderleicht. Sie gehen das Tutorial Erste Schritte auf ihrer Website durch und sind fertig. Sie bekommen eine gute Vorstellung davon, wie es mit nlog sein könnte. Die Konfigurationsdatei ist so intuitiv, dass jeder die Konfiguration verstehen kann. Beispiel: Wenn Sie die interne Anmeldung festlegen möchten, setzen Sie das Flag im Header-Knoten der Nlog-Konfigurationsdatei an der Stelle, an der Sie es erwarten würden. In log4net setzen Sie im Abschnitt appSettings von web.config verschiedene Flags.

  2. In log4net gibt die interne Protokollierung keinen Zeitstempel aus, was ärgerlich ist. In Nlog erhalten Sie ein schönes Protokoll mit Zeitstempeln. Ich fand es sehr nützlich in meinen Bewertungen.

  3. Filter in log4net - Überprüfen Sie besser meine Frage - log4net-Filter - Schreiben und Filtern, um Protokollnachrichten zu ignorieren. Wenn Sie eine Antwort / Lösung dafür finden, lassen Sie es mich bitte wissen. Ich verstehe, es gibt eine Problemumgehung für diese Frage, da Sie Ihren eigenen benutzerdefinierten Filter schreiben können. Aber etwas, das in log4net nicht leicht verfügbar ist.

  4. Leistung - Ich habe ungefähr 3000 Protokollnachrichten mit einer gespeicherten Prozedur in der Datenbank protokolliert. Ich habe simple for loop (int i = 0; i <3000; i ++ ... verwendet, um dieselbe Nachricht 3000 Mal zu protokollieren. Für die Schreibvorgänge: log4net AdoAppender hat fast doppelt so viel Zeit benötigt wie NLog.

  5. Log4net unterstützt keinen asynchronen Appender.

Für mich war es ein ausreichender Vergleich, NLog als Protokollierungsframework zu wählen. :) :)

Narayan Akhade
quelle
Die internen Debugging-Protokolle von log4net
Narayan Akhade
36

Wenn Sie spät zu diesem Thread kommen, sollten Sie einen Blick zurück auf die .Net Base Class Library (BCL) werfen. Viele Leute haben die Änderungen zwischen .Net 1.1 und .Net 2.0 verpasst, als die TraceSource- Klasse eingeführt wurde (ca. 2005).

Die Verwendung der TraceSource ist analog zu anderen Protokollierungsframeworks, mit detaillierter Steuerung der Protokollierung, Konfiguration in app.config / web.config und programmgesteuertem Zugriff - ohne den Overhead des Unternehmensanwendungsblocks.

Es gibt auch eine Reihe von Vergleichen: "log4net vs TraceSource"

Jeremy
quelle
1
EntLib erweitert TraceSource
Michael Freidgeim
34

Für uns liegt der Hauptunterschied in der Gesamtleistung ...

Schauen Sie sich Logger.IsDebugEnabledNLog im Vergleich zu Log4Net an. Aus unseren Tests geht hervor, dass NLog weniger Overhead hat und genau danach streben wir (Dinge mit geringer Latenz).

Prost, Florian

Florian Doyon
quelle
25

Schauen Sie sich zuerst den Rest Ihres Stapels an.

Wenn Sie NHibernate verwenden, wird Log4Net direkt verwendet. Andere Frameworks verfügen möglicherweise über andere spezifische Logger, die sie benötigen.

Davon abgesehen: beide funktionieren gut.

Ich habe mich selbst für Log4Net entschieden. Die Konfiguration kann schwierig sein, und wenn sie nicht richtig konfiguriert ist, ist es schwierig herauszufinden, was schief gelaufen ist. Aber Sie können fast alles tun lassen, was Sie von einem Logger erwarten.

Wenn Sie kein ständiges Problem mit Log4Net haben, habe ich hier einen Artikel darüber geschrieben, wie Sie damit beginnen können: http://elegantcode.com/2007/12/07/getting-started-with-log4net/

Chris Brandsma
quelle
9
@greg: Beachten Sie, dass in NHibernate v3 die Abhängigkeit von log4net dankenswerterweise entfernt wurde - es ist steckbar, sodass Sie NLog verwenden können, wenn Sie dies wünschen.
UpTheCreek
NLog ist genauso schwierig zu konfigurieren / herauszufinden, was auch falsch ist. Zumindest mit log4net finden Sie Dokumentation und / oder Google für Probleme.
Mrchief
Ich kann nicht sagen, dass dies ein Problem ist, das ich auf den ersten Blick in Betracht gezogen hätte. Während NHibernate anscheinend kein Beispiel mehr für dieses Szenario ist, bietet Sitecore ein zeitgemäßes Beispiel dafür, da Log4Net intern verwendet wird. Sitecore ist ziemlich erweiterbar, so dass Sie alles verwenden können, was Sie zum Protokollieren bevorzugen, aber das ist weitaus komplexer als das Bearbeiten der web.config der Website, um Ihre eigenen Logger hinzuzufügen
Scott Simontis
14

Ich stimme dem oben Gesagten zu und bevorzuge nLog. Entlib ist unnötig aufgebläht.

Betreff: Log4net Eine Sache, die ich mit log4net IMMER bekomme, ist zu vergessen, der global.asax Folgendes hinzuzufügen, um die Komponente zu initiieren:

log4net.Config.XmlConfigurator.Configure();
Francis Shanahan
quelle
13

Wenn Sie hierher gehen, finden Sie eine umfassende Matrix, die sowohl die NLog- und Log4Net-Bibliotheken als auch die Enterprise Lib und andere Produkte enthält.

Jemand könnte argumentieren, dass die Matrix so erstellt wurde, dass die Merkmale der einzigen in der Matrix vorhandenen kommerziellen Bibliothek hervorgehoben werden. Ich denke, es ist wahr, aber es war trotzdem nützlich, meine Wahl gegen NLog zu treffen.

Grüße

Lorenzo
quelle
1
Wenn man sich diese Matrix ansieht, scheint sie zumindest in Bezug auf das Framework von The Object Guy, das ein kommerzieller Konkurrent ist, erheblich veraltet zu sein.
Andy Dent
9

Wie ich bemerkt habe, sperrt log4net die Ausgabedateien während der gesamten Ausführung der Anwendung, sodass Sie sie nicht löschen können. Ansonsten sind sie ähnlich.

Also bevorzuge ich NLog.

Vitaliy Ulantikov
quelle
22
Fügen Sie <lockingModel type = "log4net.Appender.FileAppender + MinimalLock" /> zu Ihrer Dateiappender-Konfiguration hinzu, um dies zu verhindern (siehe Seite log4net-Beispiele hier: logging.apache.org/log4net/release/config-examples.html )
EventHorizon
9

Schamloser Plug für ein Open Source-Projekt, das ich ausführe, aber angesichts der lebhaften Diskussion darüber, welches .NET-Protokollierungsframework aktiver ist, dachte ich, ich würde einen obligatorischen Link zu Serilog veröffentlichen .

Für die Verwendung in einer Anwendung ähnelt Serilog log4net (und greift stark darauf zurück). Im Gegensatz zu anderen .NET-Protokollierungsoptionen geht es bei Serilog jedoch darum, die Struktur von Protokollereignissen für die Offline-Analyse beizubehalten. Wenn Sie schreiben:

Log.Information("The answer is {Answer}", 42);

Die meisten Protokollierungsbibliotheken rendern die Nachricht sofort in eine Zeichenfolge. Serilog kann dies auch, behält jedoch die { Answer: 42 }Eigenschaft bei, sodass Sie später mithilfe eines von mehreren NoSQL-Datenspeichern Ereignisse basierend auf dem Wert von ordnungsgemäß abfragen können Answer.

Wir stehen kurz vor 1.0 und unterstützen alle modernen Plattformen (.NET 4.5, Windows Store und Windows Phone 8).

Nicholas Blumhardt
quelle
Aber die Frage ist: Unterstützt es Mono? ;) Es sieht vielversprechend aus (und ich liebe das Faden- und Nadellogo), konnte aber keine Informationen darüber finden, ob es Mono unterstützt oder nicht.
Ashokgelal
Gute Frage :) ... ja, wir haben Benutzer auf Mono - ich bin nicht sicher, ob sie den .NET 4.5- oder 4.0-Build von Serilog verwenden, aber wenn Sie auf Probleme stoßen, helfen wir Ihnen weiter.
Nicholas Blumhardt
Der .NET 4.5-Support hat mich dazu gebracht, Ihre Lösung jetzt herunterzuladen und auszuprobieren
Fat Shogun,
8

Ich habe auch NLog unterstützt, weil es auch mit nicht verwaltetem Code funktioniert. Ich nehme an, es könnte möglich sein, log4net und log4cxx zusammen zu verwenden, aber NLog verarbeitet sowohl verwalteten als auch nicht verwalteten Code sofort.

Ich habe mir auch Common.Logging angesehen , eine Fassade, die eine Abstraktion der Protokollierungs-API ermöglicht und log4net, NLog und Entreprise Library unterstützt. Ich glaube nicht, dass ich es verwenden werde, aber ich mag, wie sie Lambdas verwenden, um die Leistung zu verbessern, wenn die Protokollierung deaktiviert ist (eine Funktion, die mit NLog und wahrscheinlich anderen geteilt wird).

eddycharly
quelle
4

Sie können auch den Microsoft Enterprise Library-Protokollierungsblock in Betracht ziehen . Es kommt mit netten Designer.

Rashack
quelle
3
Ermöglicht die visuelle Konfiguration im Gegensatz zur manuellen Erstellung von XML. Kommt auf deinen Geschmack an ...
Rashack
13
Die Idee, visuelle Werkzeuge für so etwas zu verwenden, ist keine gute Sache.
Adam Dymitruk
4
Vielleicht keine gute Sache, aber für EntLib ist ein visueller Konfigurator erforderlich. Das manuelle Schreiben der Konfiguration ist praktisch unmöglich, es ist zu kompliziert (Sie wissen, es ist von Microsoft).
Pavel Hodek
1
Auch wenn jemand einen visuellen Designer nicht mochte, warum abstimmen? : o
nawfal
EntLib protokolliert synchron, es kann im Wesentlichen die Leistung beeinträchtigen.
Michael Freidgeim
2

Ich denke, der allgemeine Konsens ist, dass nlog etwas einfacher zu konfigurieren und zu verwenden ist. Beide sind jedoch durchaus fähig.

Tsimon
quelle
0

Basierend auf meiner Erfahrung, SmartInspect schlägt sowohl NLog und log4net.

Es ist extrem einfach zu bedienen, die Dokumentation ist großartig und Sie können zuvor protokollierte Nachrichten anzeigen und filtern mit ihrem interaktiven Protokoll-Viewer , was ein großer Vorteil für die reale Welt ist.

Eine Sache, die mir gefällt, sind die Registerkartenansichten von Daten, wie die Browser-Registerkarten in Chrome. Jede Registerkarte kann eine andere gefilterte Ansicht des Protokolls bereitstellen.

Contango
quelle
11
Es ist ein kostenpflichtiges Produkt. NLog & Log4Net sind kostenlos.
Zo hat