11
votes

C # Type de classe dérivé nécessaire à la base pour la journalisation à l'aide de Nlog

Nous utilisons Nlog pour la journalisation dans une application Web C # MVC3. Tous nos contrôleurs étendent une base personnalisée "ApplicationController" qui nous donne accès à des méthodes et aux membres S constamment nécessaires.

J'aimerais que tous les contrôleurs aient accès à l'enregistreur via cette classe de base, mais que vous voulez le détail de savoir quelle classe dérivée les déclarations de journal sont originées.

Notre contrôleur d'application ressemble à ceci: xxx

si un contrôleur dérivé ne remplace pas l'enregistreur que tout Les déclarations montreront qu'ils sont originaires du contrôleur d'application. Actuellement, j'ai essentiellement la même instruction Logger dans tous les contrôleurs dérivés. Par exemple: xxx

évidemment c'est une mauvaise pratique de mise en œuvre.

  1. Comment puis-je sécher ça? Plus précisément, quelle est ma compréhension de c # Manquer d'accomplir exactement cette tâche spécifique?
  2. Y a-t-il un modèle de journalisation que je devrais suivre où je n'expose pas le Classe de journalisation (Nlog) directement?

    tia!


0 commentaires

4 Réponses :


14
votes

Je suis inconnu avec Nlog mais dans log4net la syntaxe logManager.getlogger (this.getType ()) accomplira ce que vous voulez. gettype renvoie le type de feuille dans votre hiérarchie d'héritage, même si elle est appelée dans la classe ApplicationController , lorsque l'enregistreur est créé pour la première fois (c.-à-d.: Au premier accès à la propriété de l'enregistreur) Il l'instanciera avec le type PropertyController


3 commentaires

Je pense que this.getType (). Nom devrait le faire.


C'est exactement ce que je suis allé avec. Je n'ai pas réalisé que cela reviendrait la classe la plus dérivée. Cela m'a permis de créer une propriété unique sur mon applicationController, puis utilisez cet enregistreur tout au long de l'application.


Mise à jour 07/2017: Ils (Nlog) adressent maintenant cela dans leur tutoriel. Voir: Github.com/nlog/nlog/wiki/ Tutoriel # Expose-Logger-to-Sub-Clas SES



-1
votes

Vérifiez simplement Nlog wiki ici

Dans la plupart des cas, vous aurez un enregistreur par classe, donc il fait Sens de donner l'enregistreur le même nom que la classe actuelle.

est logique de le faire comme ça xxx


2 commentaires

Je n'aime vraiment pas cette approche. Si je fais cela, je copie et colle du code dans chaque contrôleur. Il est faux de disposer de beaucoup de duplication.


@Bobbb Snippet, classe de base commune? Nlog utilise un motif de vol de poids pour les configurations de l'enregistreur afin que les frais généraux soient minimes. Les lignes dus à la journalisation réelle sont en grande partie dupliqués.



5
votes

API NLOG est légèrement différent de LOG4NET. Vous devez utiliser

Logger = LogManager.GetLogger(GetType().Name);


2 commentaires

Je trouve logmanager.getlogger (gettype (). Fullname) pour être plus utile


Merci @davidhayes - d'accord avec vous. Donc, l'équivalent à getcurrentClassLogger () pour une propriété de classe de base utiliserait: obtenez {retour _logger ?? (_logger = logmanager.getlogger (this.getType (). FullName)); }



1
votes

the Comment créer un enregistreur pour SUB Classes Page du NLOG Wiki suggère maintenant le motif suivant:

class BaseClass
{
    protected BaseClass()
    {
        Log = LogManager.GetLogger(GetType().ToString());
    }

    protected Logger Log { get; private set; }
}

class ExactClass : BaseClass
{
    public ExactClass() : base() { }
    ...
}


0 commentaires