log4net contre Nlog

355

Quelqu'un a de l'expérience pour les deux? Comment s'empilent-ils les uns contre les autres?

Nous prévoyons d'utiliser l'un d'entre eux pour se connecter à une application d'entreprise.

Références:

log4net

nlog

EDIT: Nous n'avons aucune dépendance existante à nlog ou log4net.

Greg Dean
la source
9
Voici l'enregistreur que j'utilise: System.IO.File.AppendAllText (@ "c: \ log.txt", string.Format ("{0} \ r \ n", message));
zumalifeguard
213
Bon pour vous, mais certaines personnes peuvent avoir besoin d'activer / désactiver la journalisation de manière dynamique, d'utiliser différents niveaux de journal, de supprimer automatiquement les anciennes données de journal, etc.
Tor Hovland
23
Il convient de noter que la documentation Log4Net est terrible.
BentOnCoding
Il y a un article de blog détaillé robertmccarter.com/switching-to-nlog
Michael Freidgeim
2
Vous devriez essayer ReflectInsight. Beaucoup plus puissant que les deux insightextensions.codeplex.com
code5

Réponses:

383

J'ai récemment été chargé de "prototyper une connexion" pour un projet à venir. Je n'avais aucune expérience de cadre de journalisation. J'ai fait des recherches, parcouru des didacticiels, créé des applications de jouets, etc. sur Log4Net, NLog et Enterprise Library pendant quelques jours. Nous sommes revenus 3-4 semaines plus tard et les avons rassemblés dans une démo cohérente. J'espère que cela vous sera utile.

Ma recommandation pour notre projet est la suivante:

  1. Utilisez une façade de journalisation (par exemple Common.Logging , SimpleLoggingFacade ) pour éviter les dépendances directes.
  2. Si nous finissons par utiliser Enterprise Library pour d'autres fonctionnalités, utilisez-le également pour la journalisation.
  3. Si nous finissons par utiliser quelque chose qui dépend de Log4Net, utilisez Log4Net.
  4. Si rien de ce qui précède, utilisez NLog. Ce que je préfère.

C'est basé sur ces résultats (opinions!):

  • Les 3 cadres sont capables et peuvent faire des choses sophistiquées. Nous voulons une solution de qualité, mais franchement, nous n'avons pas besoin de très hautes performances ou de 60 types d'éviers.
  • Tous les 3 ont des concepts de base très similaires.
  • Chacun a ses propres astuces, comme le routage vraiment avancé, ou les noms de fichiers de journaux dynamiques, la troncature de fichiers, etc.
  • Tous les 3 sont assez bien documentés à leur manière.
  • Pour un newb complet comme moi, ils étaient tous un peu maladroits au départ. Pas de différences drastiques ici pour les bases. Je m'en remets.
  • En revisitant les choses quelques semaines plus tard, NLog était clairement le plus facile à reprendre. J'avais besoin de très peu de pinceaux dessus. Avec Log4Net, j'ai dû revoir quelques exemples en ligne pour commencer. Avec EntLib, j'ai abandonné et j'ai recommencé les tutoriels à partir de zéro - j'étais totalement perdu.
  • Je ne pouvais pas comprendre comment obtenir EntLib pour faire certaines choses comme se connecter à la base de données. Cela pourrait être facile, mais cela dépassait mon délai.
  • Log4Net et NLog ont une petite empreinte dans le code. EntLib est du spam, mais j'utiliserais quand même une façade dessus.
  • J'ai accidentellement mal configuré EntLib et il me l'a dit au moment de l'exécution. Log4Net ne l'a pas fait. Je n'ai pas eu de mauvaise configuration accidentelle avec NLog.
  • EntLib est livré avec un bel éditeur app.config, dont vous avez besoin à 100%. NLog a un schéma de fichier de configuration pour que vous obteniez "intellisense". Log4Net est fourni avec nada.

Donc, évidemment, j'aime NLog jusqu'à présent. Pas assez pour l'utiliser malgré une autre solution disponible.

Mat
la source
19
+1 sur la recommandation de construire une façade pour une véritable séparation des préoccupations (SoC), ou alors vous ne polluez pas votre domaine.
eduncan911
66
La façade ne fonctionne que si vous pouvez le faire sans casser les valeurs de diagnostic qui dépendent de la pile d'appels, etc. J'ai vu beaucoup de façades qui cassent ces fonctionnalités de diagnostic essentielles qui ont fini par faire plus de mal que de bien ...
James Schek
11
Log4Net ne prend pas encore en charge les profils client de .NET 3.5 SP1 et .NET 4, car il fait référence à System.Web. Je voulais juste le souligner, bien qu'il soit en fait étroitement lié à «avec une dépendance à Log4Net, utilisez Log4Net».
Simon D.
59
NLog est activement pris en charge ( nlog-project.org/download ) tandis que Log4Net n'a pas été mis à jour depuis la publication de la version 1.2.10 publiée le 19 avril 2006 ( issues.apache.org/jira/browse/LOG4NET/fixforversion/11128 )
Jay Cincotta
5
Si vous dépendez d'une bibliothèque utilisant log4net et que vous souhaitez utiliser NLog à la place (ou vice-versa), il est assez simple d'écrire et de configurer une classe Appender personnalisée pour combler les deux.
dbkk
158

Un support clé qui n'a pas été beaucoup discuté est le support et les mises à jour.

Log4Net n'a pas été mis à jour depuis la publication de la version 1.2.10 le 19 avril 2006 .

En revanche, NLog a été activement pris en charge depuis 2006 et publiera bientôt NLog 2.0 prenant en charge de nombreuses plates-formes qui n'existaient pas lors de la dernière mise à jour de log4net, telles que:

  • NET Framework 2.0 SP1 et supérieur, 3.5 et 4.0 (profils client et étendu)
  • Silverlight 2.0, 3.0, 4.0
  • .NET Compact Framework 2.0, 3.5
  • Profil Mono 2.x
Jay Cincotta
la source
30
Mais a-t-il besoin d'être mis à jour? S'il n'est pas cassé, ne le répare pas?
glenneroo
24
Il est cassé: * Détruit la résolution d'adresse IP entre IPv4 / IPv6 pour localhost sur Vista et Win7 (plusieurs correctifs non officiels flottent) * Ne compile pas dans le profil client .Net 4.0
Tormod Hystad
6
Il semble y avoir une version .NET 4.0 en préparation pour Log4Net.
scope_creep
38
log4net a lancé la v1.2.11 en octobre 2011 . Je pense que cette réponse est obsolète maintenant.
Mariano Desanze
83
En fait, cette réponse était toujours valable pour moi. Je suis en train de choisir un enregistreur, et cette réponse nous dit que log4net a été mis à jour une fois au cours de la dernière décennie, tandis que NLog est un projet plus actif.
Batibix
97

Ayant eu une expérience avec les deux frameworks récemment, j'ai pensé pouvoir partager mon point de vue sur chaque framework.

On m'a demandé d'évaluer les cadres de journalisation pour une application Web existante, j'ai limité mes choix à NLog (v2.0) et log4net (v1.2.11) après avoir parcouru divers forums en ligne. Voici mes découvertes:

  1. La configuration / démarrage avec NLog est très simple. Vous passez par le tutoriel Mise en route sur leur site Web et vous avez terminé. Vous avez une idée juste, comment cela pourrait être avec nlog. Le fichier de configuration est si intuitif que n'importe qui peut comprendre la configuration. Par exemple: si vous souhaitez définir la connexion interne, vous définissez l'indicateur dans le nœud d'en-tête du fichier de configuration Nlog, où vous vous attendez à ce qu'il soit. Dans log4net, vous définissez différents indicateurs dans la section appSettings de web.config.

  2. Dans log4net, la journalisation interne ne produit pas d'horodatage qui est ennuyeux. Dans Nlog, vous obtenez un joli journal avec des horodatages. Je l'ai trouvé très utile dans mes évaluations.

  3. Filtres dans log4net - Vous feriez mieux de vérifier ma question - filtre log4net - comment écrire ET filtrer pour ignorer les messages du journal et si vous trouvez une réponse / solution pour cela, veuillez me le faire savoir. Je comprends, il existe une solution de contournement pour cette question, car vous pouvez écrire votre propre filtre personnalisé. Mais quelque chose qui n'est pas facilement disponible dans log4net.

  4. Performance - J'ai enregistré environ 3000 messages de journal dans la base de données à l'aide d'une procédure stockée. J'ai utilisé simple for loop (int i = 0; i <3000; i ++ ... pour enregistrer le même message 3000 fois. Pour les écritures: log4net AdoAppender a pris presque le double du temps que NLog.

  5. Log4net ne prend pas en charge l'appender asynchrone.

C'était une comparaison suffisante pour moi de choisir NLog comme cadre de journalisation. :)

Narayan Akhade
la source
journaux de débogage internes de log4net
Narayan Akhade
36

Pour quiconque accède à ce fil tardivement, vous voudrez peut-être jeter un œil à la bibliothèque de classes de base .Net (BCL). Beaucoup de gens ont manqué les changements entre .Net 1.1 et .Net 2.0 lorsque la classe TraceSource a été introduite (vers 2005).

L'utilisation de TraceSource est analogue à d'autres infrastructures de journalisation, avec un contrôle granulaire de la journalisation, la configuration dans app.config / web.config et l'accès programmatique - sans la surcharge du bloc d'application d'entreprise.

Il existe également un certain nombre de comparaisons qui flottent: "log4net vs TraceSource"

Jeremy
la source
1
EntLib étend TraceSource
Michael Freidgeim
34

Pour nous, la principale différence réside dans la performance globale ...

Jetez un œil à Logger.IsDebugEnabledNLog contre Log4Net, d'après nos tests, NLog a moins de surcharge et c'est ce que nous recherchons (trucs à faible latence).

À la vôtre, Florian

Florian Doyon
la source
25

Regardez d'abord le reste de votre pile.

Si vous utilisez NHibernate, il utilise directement Log4Net. D'autres frameworks peuvent avoir d'autres enregistreurs spécifiques dont ils ont besoin.

Autre que cela: les deux fonctionnent bien.

Je me suis installé sur Log4Net moi-même. Il peut être difficile de configurer, et s'il n'est pas configuré correctement, il est difficile de comprendre ce qui n'a pas fonctionné. Mais vous pouvez lui faire faire presque tout ce que vous voudriez d'un enregistreur.

Si vous n'avez pas de problème permanent avec Log4Net, voici un article que j'ai écrit sur la façon de commencer avec lui: http://elegantcode.com/2007/12/07/getting-started-with-log4net/

Chris Brandsma
la source
9
@greg: Notez que dans NHibernate v3, la dépendance sur log4net est heureusement supprimée - il est enfichable afin que vous puissiez utiliser NLog si vous le souhaitez.
UpTheCreek
NLog est une douleur égale pour configurer / comprendre ce qui ne va pas aussi. Au moins avec log4net, vous pouvez trouver de la documentation et ou google pour les problèmes.
Mrchief
Bon point pour prendre en compte le reste de votre pile, je ne peux pas dire que c'est une préoccupation que j'aurais envisagée du haut de ma tête. Bien qu'il semble que NHibernate ne soit plus un exemple pour ce scénario, Sitecore en fournit un exemple contemporain, car il utilise Log4Net en interne. Sitecore est assez extensible, vous pouvez donc utiliser ce que vous préférez pour vous connecter, mais c'est beaucoup plus complexe que de modifier le web.config du site pour ajouter vos propres enregistreurs
Scott Simontis
14

Je fais écho à ce qui précède et préfère nLog. Entlib est inutilement gonflé.

Re: Log4net Une chose que je reçois TOUJOURS avec log4net oublie d'ajouter ce qui suit au global.asax pour lancer le composant:

log4net.Config.XmlConfigurator.Configure();
Francis Shanahan
la source
13

Si vous allez ici, vous pouvez trouver une matrice complète qui comprend à la fois les bibliothèques NLog et Log4Net ainsi que Enterprise Lib et d'autres produits.

Quelqu'un pourrait soutenir que la matrice est faite de manière à souligner les caractéristiques de la seule bibliothèque commerciale présente dans la matrice. Je pense que c'est vrai, mais cela a quand même été utile pour faire mon choix par rapport à NLog.

Cordialement

Lorenzo
la source
1
En regardant cette matrice, elle semble considérablement obsolète en ce qui concerne au moins le cadre de The Object Guy, qui est un concurrent commercial.
Andy Dent
9

Comme je l'ai remarqué, log4net verrouille leurs fichiers de sortie pendant toute la durée de l'application, vous ne pouvez donc pas les supprimer. Sinon, ils sont similaires.

Je préfère donc NLog.

Vitaliy Ulantikov
la source
22
Ajoutez <LockModel type = "log4net.Appender.FileAppender + MinimalLock" /> à votre configuration de fileeappender pour éviter cela (mentionné sur la page d'exemples de log4net ici: logging.apache.org/log4net/release/config-examples.html )
EventHorizon
9

Prise sans vergogne pour un projet open source que je dirige, mais étant donné la discussion animée sur le cadre de journalisation .NET plus actif, j'ai pensé publier un lien obligatoire vers Serilog .

Pour une utilisation dans une application, Serilog est similaire (et s'appuie fortement) sur log4net. Contrairement à d'autres options de journalisation .NET, Serilog consiste cependant à préserver la structure des événements de journal pour une analyse hors ligne. Lorsque vous écrivez:

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

La plupart des bibliothèques de journalisation rendent immédiatement le message dans une chaîne. Serilog peut également le faire, mais il conserve la { Answer: 42 }propriété de sorte que plus tard, en utilisant l'un des nombreux magasins de données NoSQL, vous pouvez correctement interroger les événements en fonction de la valeur de Answer.

Nous sommes proches d'une version 1.0 et prenons en charge toutes les plates-formes modernes (.NET 4.5, Windows Store et Windows Phone 8).

Nicholas Blumhardt
la source
Mais la question est: prend-il en charge Mono? ;) Il semble prometteur (et j'adore le logo du fil et de l'aiguille) mais je n'ai trouvé aucune information pour savoir s'il prend en charge Mono ou non.
ashokgelal
Bonne question :) ... oui, nous avons des utilisateurs sur Mono - je ne sais pas s'ils utilisent la version .NET 4.5 ou 4.0 de Serilog, mais si vous rencontrez des problèmes, nous vous aiderons.
Nicholas Blumhardt
Le support de .NET 4.5 m'a permis de télécharger et d'essayer votre solution dès maintenant
Fat Shogun
8

J'appuie également NLog car il fonctionne également avec du code non managé. Je suppose qu'il pourrait être possible d'utiliser log4net et log4cxx ensemble, mais NLog gère à la fois le code managé et non managé.

J'ai également regardé Common.Logging , une façade qui fait abstraction de l'api de journalisation, il prend en charge log4net, NLog et Entreprise Library. Je ne pense pas que je vais l'utiliser, mais j'aime la façon dont ils utilisent les lambdas pour améliorer les performances lorsque la journalisation est désactivée (une fonctionnalité partagée avec NLog et probablement d'autres).

eddycharly
la source
4

Vous pouvez également envisager le bloc de journalisation Microsoft Enterprise Library . Il est livré avec un joli designer.

Rashack
la source
3
Vous permet de le configurer visuellement par opposition à la création manuelle de XML.
Cela
13
L'idée d'utiliser des outils visuels pour une telle chose n'est pas une bonne chose.
Adam Dymitruk
4
Ce n'est peut-être pas une bonne chose, mais pour EntLib, le configurateur visuel est nécessaire. Écrire une configuration manuellement est pratiquement impossible, c'est trop compliqué (vous savez, c'est de Microsoft).
Pavel Hodek
1
Même si quelqu'un n'aimait pas un concepteur visuel, pourquoi downvote! : o
nawfal
EntLib se connecte de manière synchrone, il peut essentiellement affecter les performances.
Michael Freidgeim
2

Je pense que le consensus général est que nlog est un peu plus facile à configurer et à utiliser. Les deux sont tout à fait capables, cependant.

tsimon
la source
0

D'après mon expérience, SmartInspect bat à la fois NLog et log4net.

Sa documentation extrêmement simple à utiliser est excellente et vous pouvez afficher et filtrer les messages précédemment enregistrés avec leur visionneuse de journaux interactive, ce qui est un énorme avantage dans le monde réel.

Une chose que j'aime, ce sont les vues tabulées des données, comme les onglets du navigateur dans Chrome. Chaque onglet peut fournir une vue filtrée différente du journal.

Contango
la source
11
C'est un produit payant. NLog & Log4Net sont gratuits.
Zo a