Quand dois-je utiliser Tracing vs Logger.NET, Enterprise Library, log4net ou Ukadc.Diagnostics?

Comment choisir entre le suivi standard, Logger.NET, Enterprise Library, log4net ou Ukadc.Diagnostics?

Y a-t-il une situation où l’un est plus approprié que l’autre? … qu’est-ce que ce serait? (ASP.NET, application console, Azure Cloud, SOHO, Enterprise …)

Quels sont les avantages ou les inconvénients?

Ai-je manqué d’autres grandes structures de journalisation?

Il y a beaucoup de questions similaires ici sur SO:

  • Meilleures pratiques de journalisation
  • log4net versus TraceSource
  • Silverlight Logging Framework et / ou meilleures pratiques
  • log4net vs Nlog
  • A quoi sert une façade forestière?
  • C # Logging. Que dois-je utiliser?

Vous avez manqué plusieurs frameworks de journalisation couramment utilisés. Voici une liste des frameworks couramment utilisés, dont certains sont répertoriés:

  • Diagnostique du systeme
  • log4net
  • NLog
  • Bibliothèque d’entreprise
  • L’object Guy

Abstractions de journalisation:

  • Common.Logging
  • SLF

System.Diagnostics addons:

  • Ukadc.Dianostique
  • Essential.Diagnostics

Autre

  • Elmah

Quelques autres frameworks de journalisation de codeplex (que j’ai vu mentionné ici sur SO):

  • CuttingEdge.Logging
  • SpringTail

Pourquoi pourriez-vous choisir l’un sur l’autre? C’est difficile. Beaucoup sont des préférences personnelles. Une partie est une supériorité technique (ou caractéristique).

Un inconvénient évident de toute structure de journalisation (en particulier des systèmes tiers) est la qualité du support. Que faire si vous rencontrez un problème avec log4net, NLog, Common.Logging, etc.? Serez-vous capable d’obtenir un correctif auprès des développeurs de ces frameworks? Cela peut ne pas être extrêmement important car le code source est disponible pour ces frameworks. Cependant, vous pouvez préférer ne pas “hériter” de l’arborescence source uniquement pour apporter une correction ou append une amélioration. Je dirai que les frameworks sont tellement extensibles que de nombreuses améliorations pourraient être apscopes via des points d’extension normaux.

Si vous lisez les liens que j’ai publiés ci-dessus, je pense qu’il est juste de dire, en se basant uniquement sur le volume des mentions favorables, que log4net serait clairement le “gagnant”. Il sera mentionné plus fréquemment comme le favori historique de l’enregistrement et ce que de nombreuses personnes choisiront d’utiliser.

NLog a ses partisans, il ne semble tout simplement pas avoir la pénétration ou la conscience «top of mind» que fait log4net, même s’ils sont très similaires. Les capacités de NLog sont très similaires à celles de log4net et présentent l’avantage supplémentaire d’avoir connu un cycle de développement important récemment.

Enterprise Library est souvent considéré comme un bon choix, mais est presque aussi souvent présenté comme un choix terrible. Peut-être qu’une partie de sa réputation négative n’est peut-être pas aussi bonne que les premières versions? Peut-être que c’est mieux maintenant?

System.Diagnostics est souvent recommandé comme un choix raisonnable avec au moins trois avantages importants: pas de dépendance de tiers, de nombreux composants Microsoft sont équipés de System.Diagnostics, il est facilement extensible (sans doute pour append des fonctionnalités déjà présentes “gratuitement”) dans des frameworks tels que log4net et NLog?). Si vous utilisez System.Diagnostics, je pense que le consensus serait (comme le ferait ma recommandation) d’utiliser des objects TraceSource plutôt que Trace.WriteLine / Debug.WriteLine.

Notez également que System.Diagnostics et WCF fonctionnent bien ensemble. Le trafic de messages WCF peut être consigné avec System.Diagnostics et WCF propagera également des informations sur l’activité System.Diagnostics (System.Diagnostics.CorrelationManager.ActivityId) sur les appels de limites du service WCF.

Je ne suis pas certain que log4net devrait continuer à conserver son statut privilégié. Comme cela a été noté ailleurs sur SO, log4net ne semble pas avoir beaucoup de développement récemment (notez que je pense que “log4net est mort” est une exagération) alors que NLog 2.0 est actuellement en version bêta avec la version finale attendue au premier sortingmestre. 2011 (Mise à jour: NLog 2.0 a été publié le 17 juillet 2011). Est-ce que cela fait de NLog un meilleur choix que log4net? Je ne sais pas, mais je pense que, relativement parlant, NLog devrait recevoir au moins une considération égale lors du choix entre les deux et devrait probablement être le favori présumé pour les nouveaux développements, du moins jusqu’à ce que le développement de log4net montre plus de signes de vie.

log4net et NLog offrent des options de configuration très flexibles. Ils vous permettent d’avoir une granularité très fine dans la définition de vos instructions de journalisation (par le modèle “standard” de définition d’un enregistreur par type). Ils permettent également l’extension facile des bibliothèques en vous permettant de développer vos propres objects “destination de journalisation” (Annexes Log4net et Cibles NLog) et objects de “mise en forme” (convertisseurs de modèles log4net et NLog LayoutRenderers).

Outre un choix de structure de journalisation, certains (nombreux?) Préconisent d’isoler le code de votre application d’une dépendance matérielle sur une structure de journalisation particulière en utilisant une couche d’abstraction. Cela peut prendre la forme de votre propre interface ILogger que vous implémentez, peut-être par-dessus une structure existante. À l’avenir, vous pourriez modifier les frameworks en implémentant votre ILogger sur une infrastructure différente. Ou, vous pouvez utiliser DI / IoC pour injecter “ILogger” dans votre code. De nombreux frameworks DI / IoC fournissent une abstraction ILogger intégrée qui peut être configurée pour utiliser log4net, NLog ou Enterprise Library ou vous pouvez écrire votre propre implémentation ILogger et injecter cela. Qui se soucie de la mise en œuvre? Une autre façon d’isoler votre code d’une dépendance à un environnement de journalisation spécifique consiste à utiliser une structure d’abstraction de journalisation telle que Common.Logging ou SLF. L’avantage est que, encore une fois, votre application ne dépend pas d’une structure de journalisation spécifique. Cependant, certains diront que vous venez d’échanger une dépendance (sur une structure de journalisation) avec une autre (structure d’abstraction de journalisation).

Deux autres remarques sur la journalisation de l’abstraction:

  1. Une bonne abstraction de journalisation devrait vous permettre de capturer la sortie de différentes infrastructures de journalisation dans le même fichier de sortie. Common.Logging appelle ce “pontage”. Dites que vous avez écrit une application en utilisant Common.Logging, soutenu par NLog. Dites maintenant que vous utilisez une bibliothèque de classes tierces écrite directement à l’aide de log4net. Avec un système de pontage, vous pouvez capturer la sortie log4net (via un appender personnalisé) et la redirect via Common.Logging afin que la sortie de journalisation de la bibliothèque de classes tierce puisse être affichée dans le contexte de la sortie de journalisation de votre application.

  2. L’utilisation d’une abstraction de journalisation vous permet également de “tester” les structures de journalisation pendant le développement. Vous pourriez commencer par penser que log4net est la solution, mais vous voulez vous laisser tenter par NLog. En utilisant une abstraction de journalisation, il est relativement facile de basculer entre les deux. En fin de compte, vous pouvez faire le choix de la structure de journalisation, mais, entre-temps, vous avez été capable d’écrire des montagnes de code qui ne dépendent en aucune façon d’une structure de journalisation spécifique.

Une autre raison pour laquelle vous pouvez choisir un cadre par rapport à un autre est l’environnement dans lequel vous travaillez. Si vous utilisez déjà une partie de la bibliothèque d’entreprise, cela peut suffire à vous forcer à utiliser la journalisation de la bibliothèque d’entreprise.

Et si vous développez dans Silverlight? Vous pouvez choisir d’utiliser quelque chose comme Clog – une partie du calcium . Vous pouvez également choisir d’utiliser NLog 2.0, compatible avec Silverlight ET WP7.

System.Diagnostics addons (Ukadc.Diagnostics, Essential.Diagnostics). Ce ne sont pas des frameworks de journalisation en soi. Ils représentent plutôt des collections d’objects utiles et de points d’extension pouvant être utilisés avec la structure System.Diagnostics existante. Une des meilleures choses, à mon avis, que chacun de ces addons ajoute est la possibilité de formater votre sortie de journalisation, comme vous pouvez le formater avec log4net et NLog. Je n’ai pas utilisé Essential.Diagnostics, mais j’ai expérimenté avec Ukadc.Diagnostics et pense que c’est vraiment cool. Il est même facile d’écrire vos propres “jetons de formatage”.

Je ne sais pas si cela a complètement répondu à votre question (ce qui est assez large de toute façon), mais je pense qu’il y a beaucoup de matière à reflection ici.

Je viens de commencer à utiliser log4net dans VS2010 et j’ai découvert qu’il dépendait de System.Web … ce qui le rend incompatible avec les cibles du framework “.NET xx Client Profile” … Considérant ce que quelqu’un a publié sur Windows Update en utilisant le Le profil client en tant que .NET redissortingbuable au choix, cela signifie que log4net ne peut plus être le logger de choix si vous voulez que votre code fonctionne sur la majorité des machines …

Merci pour l’info sur d’autres options – je vais les vérifier …

Juste pour append quelques choses apsockets de la conférence Build 2013 de Microsoft:

  • Log4NET sous forte charge a écrit dans un fichier principalement parce que ce processus est synchrone. Il est possible d’obtenir des conflits et des délais d’attente dans certaines conditions. Cela peut être vérifié en utilisant AppDynamics ou tout autre outil similaire.

  • NLog n’implémente pas la mise en queue sous charge, les appels IO s’emstacknt.

  • Selon Microsoft, l’ETW utilise des tampons d’anneau de kernel très efficaces. .NET 4.5 et la structure du journal des événements, combinés à l’ application Semantic Logging Application Bock (AKA SLAB), le rendront beaucoup plus efficace.

Je ne suis pas un fan de log4j ou de log4net. J’aime la fonction de journalisation java.util.net, et je l’ai donc recréée, pour la plupart, sur le projet github nommé NetLog à l’ adresse https://github.com/greggwon/NetLog/ . N’hésitez pas à nous faire part de vos commentaires. J’essaie de mettre du temps pour installer la configuration basée sur ConfigurationManager dans liu d’un fichier logging.properties. Avec java.util.logging, il était toujours assez simple d’utiliser les parameters de propriété de la ligne de commande pour spécifier l’emplacement de la configuration du journal. C’est beaucoup plus difficile avec .net, si vous n’utilisez pas ConfigurationManager. Fournir un soutien à CM, ouvrira la porte à certaines relations différentes entre les enregistreurs et les gestionnaires, ce qui pourrait améliorer certaines choses.

NetLog inclut un EventLogHandler qui se connectera au journal des événements du système. Il a également un niveau Level.EventLog placé juste en dessous de “warning” qui vous permettra d’avoir un “level” nommé pour cibler EventLog sans utiliser “WARNING” ou “SEVERE”. J’ai aussi un TCPSocketHandler qui vous permet de faire un telnet dans le “logging” afin que vous puissiez avoir un “tail” sur Windows, sans qu’un programme “tail” soit disponible.

Regardez le paquet NetLog.Logging sur GitHub, c’est ma création. Il dispose d’une application de surveillance et suit le paradigme de l’API java.util.logging, car c’est ce que j’aime utiliser. Il a un verrou de rotation pour accéder à «écriture», et le détenteur de la serrure écrit tous les enregistrements en queue, jusqu’à une limite, avant de continuer. Cela permettra à la journalisation d’être moins d’E / S basée sur la contention et constitue un bon compromis.

Pour une raison quelconque, System.Diagnostics ne prend pas en charge un moyen de diriger toutes les sorties de trace vers un seul écouteur. Si vous voulez que plusieurs sources soient dirigées vers le même écouteur, vous devez lister explicitement chaque source par nom.

Dans un grand système avec de nombreuses dépendances, vous ne connaissez peut-être pas toutes les sources et vous ne vous en souciez probablement pas. Vous voulez juste que la sortie voie ce qui se passe sous les couvertures. Avoir à configurer individuellement des écouteurs pour chaque source rend l’utilisation de System.Diagnostics beaucoup plus difficile à utiliser dans les grands systèmes.

log4net prend non seulement en charge un écouteur de niveau racine (écouteur), mais prend également en charge la journalisation hiérarchique qui vous permet de configurer la journalisation pour un ensemble logique de sources en tant que groupe. Dans mon esprit, cela fait de log4net un choix clair.