Dois-je déclarer log4net enregistreur une fois par classe ou dans la classe de base?
Il semble plus propre à déclarer un enregistreur et d'appel LogManager.GetLogger
dans une classe de base afin que tout le monde qui hérite de pouvoir l'utiliser. Cependant, sur log4net site et sur d'autres blogs, comme dans ce blog il indique qu'il est préférable de déclarer un enregistreur par classe parce que:
Vous pouvez utiliser les enregistreurs de cette façon à isoler la journalisation des préoccupations dans tous vos objets, et j'ai totalement vous recommandons de le faire. Cela vous permettra de gaz et de diriger la sortie du journal de personne enregistreurs utilisant log4net hiérarchique de configuration du mécanisme.
Est-ce à dire si je l'ai mis dans la classe de base, il va faire que l'exploitant d'un goulot d'étranglement?
Si oui, existe-il d'autres solutions ou dois-je créer un logger par classe?
Vous devez vous connecter pour publier un commentaire.
Le poste n'est pas spécifiquement pour vous dire d'utiliser un enregistreur différente dans chaque dérivés classe, mais à la place un autre enregistreur par type de classe en général. Vous pouvez, mais ne pas avoir à utiliser un nouveau journal instance dans chaque classe dérivée.
Une manière de regarder, c'est qu'il peut être déroutant d'avoir deux enregistreurs de instancié dans le même temps (parce que la base de l'un existe toujours), surtout si vous masquez la base de l'un à l'aide du même nom de l'enregistreur. Votre base de méthodes de classe (elle n'est pas remplacée) continuent de référence de la base statique enregistreur, et remplacé ceux d'en utiliser un autre.
Aussi, l'article instancie l'enregistreur de données comme ceci:
tandis qu'un peu plus simple peut-être à utiliser:
Tout d'abord, il est marqué
readonly
, ce qui signifie que vous ne serez pas en mesure de modifier le champ accidentellement, une fois initialisé. Et en utilisant le type fonctionnera de la même manière que la réflexion, mais légèrement plus rapide (résolu au moment de la compilation). Visual Studio va aussi mettre à jour le nom de la classe automatiquement si vous choisissez de le renommer (qui elle ne serait-ce pas que vous avez utilisé la chaîne de surcharge).typeof(YourClass)
. Avec réflexion, vous pouvez copier-coller le code réutilisable, et vous n'avez pas à faire face à une situation où quelqu'un a copier-collé de l'enregistreur et j'ai oublié de changertypeof(YourClass)
. L'appel pourrait alors ressembler à ceci:LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Pratique courante est d'avoir un enregistreur par classe, PAS classe de base. De cette façon, vous pouvez activer/désactiver l'enregistrement par la classe de base.
Je pourrait aussi suggérer d'examiner l'utilisation de la Commune de Journalisation 2.0, http://netcommon.sourceforge.net/.
La condition déclaration ne fait pas référence à un goulot d'étranglement. Déclarer votre enregistreur dans une classe de base limite le contrôle que vous avez sur l'exploitation forestière dans les classes dérivées. Si vous avez des classes A et B dérivant de la même enregistreur de données contenant la classe de base, vous êtes coincé avec les mêmes paramètres d'enregistrement pour tous les enregistrement fait dans les classes A et B.
log4net permet de configurer les enregistreurs de base sur la classe ou de l'espace qu'ils sont créés, vous donnant un contrôle très strict de ce qui est enregistré. Par exemple, avoir la classe d'Un journal de bord au niveau de l'info et de la classe B log au niveau de débogage.
L'ajout d'une seule ligne de code pour chaque catégorie que vous souhaitez enregistrer des choses en est une très petite charge pour la souplesse qu'elle offre.
- Je utiliser un dictionnaire statique dans la classe de base, à la clé sur le nom de type:
Avec une méthode (sur la classe de base) pour retourner un logger:
J'ai aussi les méthodes de journalisation sur la classe de base:
Je suppose que cela me permettrait de configurer l'enregistrement par type (bien que je n'ai pas à le faire) et le GetLogger méthode pourrait être exposé à des classes dérivées afin qu'ils puissent faire leur propre exploitation forestière.
Habituellement, vous devriez avoir un seul enregistreur de la classe, vous pouvez utiliser le pattern singleton et assurez-vous que vous avez une seule instance d'enregistreur de données pour votre application.
Edit: il est thread-safe maintenant, merci pour les commentaires.
Espère que cette aide
public class Logger { public static readonly Logger Instance = new Logger(); }
instance
à null de nouveau à l'intérieur de la serrure pour être thread-safe, depuis un autre thread peut sauter après le premier si, mais avant de la verrouiller. Voir double-vérifier le verrouillage pour plus de détails.