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. P>
Notre contrôleur d'application ressemble à ceci: p> 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: p> évidemment c'est une mauvaise pratique de mise en œuvre. P> tia! p> p>
4 Réponses :
Je suis inconnu avec Nlog mais dans log4net la syntaxe
logManager.getlogger (this.getType ()) code> accomplira ce que vous voulez.
gettype code> renvoie le type de feuille dans votre hiérarchie d'héritage, même si elle est appelée dans la classe
ApplicationController code>, 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 Code> P>
Je pense que this.getType (). Nom code> 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
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. p> blockQuote>
est logique de le faire comme ça p>
xxx pré> p>
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.
API NLOG est légèrement différent de LOG4NET. Vous devez utiliser
Logger = LogManager.GetLogger(GetType().Name);
Je trouve logmanager.getlogger (gettype (). Fullname) pour être plus utile
Merci @davidhayes - d'accord avec vous. Donc, l'équivalent à getcurrentClassLogger () code> pour une propriété de classe de base utiliserait:
obtenez {retour _logger ?? (_logger = logmanager.getlogger (this.getType (). FullName)); } code>
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() { } ... }