Plus utile NLog configurations
Quels sont les meilleurs ou les plus utiles configurations pour un enregistrement NLog? (Ceux-ci peuvent être simples ou complexes, tant qu'ils sont utiles.)
Je pense à des exemples comme automatiquement rouler sur les fichiers log à une certaine taille, changer la mise en page (message du journal) qu'il existe ou non une exception, de la hausse le niveau de journal une fois qu'une erreur s'est produite, etc.
Voici quelques liens:
- Voici certains de réglage des performances de conseils sur la base de test: deep-depth.blogspot.com/2014/01/...
Vous devez vous connecter pour publier un commentaire.
Certains de ces tombent dans la catégorie générale NLog (ou l'enregistrement) des conseils plutôt que strictement configuration des suggestions.
Voici quelques journalisation des liens à partir d'ici, DONC (vous pourriez avoir vu une partie ou la totalité de ces déjà):
log4net vs Nlog
La journalisation des meilleures pratiques
Quel est le point de journalisation de façade?
Pourquoi ne enregistreurs de recommander à l'aide d'un enregistreur par classe?
Utiliser le même schéma de nommage de votre enregistreur basé sur la classe
Logger logger = LogManager.GetCurrentClassLogger()
. Cela vous donne un haut degré de granularité dans votre bûcherons et vous donne une grande flexibilité dans la configuration des enregistreurs (contrôle à l'échelle mondiale, par l'espace de noms, par nom de l'enregistreur, etc).Utilisation non-classname à base de bûcherons, le cas échéant. Peut-être que vous avez une fonction pour laquelle vous voulez vraiment pour contrôler l'enregistrement séparément. Peut-être que vous avez quelques transversale de la journalisation des préoccupations (enregistrement des performances).
Si vous n'utilisez pas classname l'enregistrement, envisager la possibilité de nommer vos bûcherons dans une sorte de structure hiérarchique (peut-être par domaine fonctionnel), de sorte que vous pouvez maintenir une plus grande flexibilité dans votre configuration. Par exemple, vous pourriez avoir une "base de données" domaine fonctionnel, une "analyse" de la FA, et une "interface utilisateur" FA. Chacun de ces pourrait avoir des sous-domaines. Alors, vous pourriez vous demander bûcherons comme ceci:
Et ainsi de suite. Avec hiérarchique des bûcherons, vous pouvez configurer la journalisation à l'échelle mondiale (le "*" à la racine ou enregistreur), par FA (Base de données, l'Analyse, l'INTERFACE utilisateur), ou par sous-zone (Base de données.Se connecter, etc).
Enregistreurs de nombreuses options de configuration sont:
Voir le NLog aider pour plus d'info sur exactement ce que chacune des options de moyens. Probablement les éléments les plus notables ici sont la capacité d'générique enregistreur de règles, le concept que plusieurs enregistreur de règles peut "exécuter" pour une seule déclaration logging, et qu'un enregistreur de règle peut être marquée comme "final" donc, les règles suivantes s'exécute pas pour une déclaration logging.
Utiliser le GlobalDiagnosticContext, MappedDiagnosticContext, et NestedDiagnosticContext pour ajouter un contexte supplémentaire à votre sortie.
Utiliser "variable" dans votre fichier de config pour simplifier. Par exemple, vous pouvez définir des variables pour vos mises en page, puis de référence de la variable dans la configuration cible plutôt que de spécifier la mise en page directement.
Ou, vous pouvez créer une "coutume" ensemble de propriétés à ajouter à une mise en page.
Ou, vous pouvez faire des choses comme créer "jour" ou "mois" convertisseurs de mise en page strictement via la configuration:
Vous pouvez également utiliser la mise en page rend à définir votre nom de fichier:
Si vous roulez votre fichier de tous les jours, le fichier pourrait être nommée "lundi.journal", "mardi.journal", etc.
N'hésitez pas à écrire votre propre convertisseur de mise en page. Il est facile et vous permet d'ajouter vos propres informations de contexte pour le fichier journal à l'aide de la configuration. Par exemple, voici un convertisseur de mise en page (basé sur NLog 1.de x, et non 2.0) qui peuvent ajouter à la Trace.CorrelationManager.ActivityId pour le journal:
Dire NLog où votre NLog (extensions de ce que l'assemblée) comme ceci:
Utiliser l'outil de convertisseur de mise en page comme ceci:
Utiliser asynchrone objectifs:
Et de la cible par défaut wrappers:
le cas échéant. Voir la NLog docs pour plus d'informations sur ceux-ci.
Dire NLog à regarder et à recharger automatiquement la configuration en cas de changement:
Il y a plusieurs options de configuration pour aider à la résolution des problèmes NLog
Voir NLog Aide pour plus d'informations.
NLog 2.0 ajoute LayoutRenderer des emballages qui permettent un traitement supplémentaire à effectuer sur la sortie d'un convertisseur de mise en page (telles que couper la les espaces, uppercasing, la mise en minuscules, etc).
N'hésitez pas à envelopper l'enregistreur si vous souhaitez isoler votre code à partir d'une unité de dépendance sur NLog, mais les envelopper correctement. Il existe des exemples de la façon d'envelopper dans la NLog dépôt github. Une autre raison pour envelopper peut-être que vous souhaitez ajouter automatiquement des informations de contexte spécifiques à chaque connecté message (en le plaçant dans un LogEventInfo.Contexte).
Il y a des avantages et des inconvénients à l'enchaînement (ou abstraction) NLog (ou de toute autre structure de journalisation d'ailleurs). Avec un peu d'effort, vous pouvez trouver beaucoup d'info ici AFIN de présenter les deux côtés.
Si vous envisagez d'emballage, pensez à utiliser Commun.La journalisation. Il fonctionne très bien et permet de changer facilement de journalisation si vous le désir de le faire. Aussi, si vous envisagez d'emballage, pensez à comment vous allez gérer le contexte des objets (GDC, MDC, NDC). Commun.La journalisation n'est pas actuellement en charge d'une couche d'abstraction pour eux, mais il est censé être dans la file d'attente de fonctionnalités à ajouter.
NewLine
disposition accomplit la tâche. Ici ce que j'ai trouvé. C'est sûr que beaucoup plus simple que ce que je m'attendais à être.Le traitement des exceptions différemment
Nous souhaitent souvent obtenir plus d'informations quand il y a une exception. La configuration suivante a deux objectifs, un fichier et de la console, qui filtre sur si oui ou non il n'y a aucune exception à l'info. (EDIT: Jarek a posté sur un nouvelle méthode de faire cela dans vNext.)
La clé est d'avoir un wrapper de la cible avec le
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
callsite:includSourcePath=true
devrait probablement êtrecallsite:includeSourcePath=true
, mais je ne vais pas changer jusqu'à ce que je peux confirmer que le type n'est pas en NLog.)condition="length('${exception}')=0
(ou c'est peut-être==
) àtarget name="file"
.Apparemment, vous pouvez maintenant utiliser NLog avec Growl pour Windows.
Configurer NLog via XML, mais par programmation
Quoi? Saviez-vous que vous pouvez spécifier la NLog XML directement à NLog à partir de votre application, plutôt que d'avoir NLog lire à partir du fichier de config? Eh bien, vous le pouvez. Disons que vous avez une application distribuée et que vous voulez utiliser la même configuration de partout. Vous pouvez garder un fichier de config à chaque endroit et de les conserver séparément, vous pouvez maintenir un dans un emplacement central et de le pousser à l'emplacement des satellites, ou vous pourriez probablement faire beaucoup d'autres choses. Ou, vous pouvez stocker vos données XML dans une base de données, l'obtenir à l'application de démarrage, et de configurer NLog directement avec le XML (peut-être vérifier régulièrement pour voir s'il a changé).
Je ne suis pas sûr de la qualité de ce qui est, mais cet exemple fournit un point de départ utile pour les personnes qui pourraient vouloir essayer de configurer comme ceci.
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
La journalisation des niveaux différents selon qu'il existe ou non une erreur
Cet exemple vous permet d'obtenir plus d'informations quand il ya une erreur dans votre code. En gros, c'tampons de messages et sorties seulement ceux qui, à un certain niveau de log (par exemple, Avertir) sauf une certaine condition est remplie (par exemple, il y a eu une erreur, de sorte que le niveau de journalisation est >= Erreur), alors il sera de sortie plus d'informations (par exemple, tous les messages de journal des niveaux >= Trace). Parce que les messages sont mises en mémoire tampon, ce qui permet de recueillir des informations de trace de ce qui s'est passé avant une Erreur ou ErrorException a été connecté très utile!
J'ai adapté de celui de la un exemple dans le code source. J'ai été expulsé à la première parce que j'ai quitté le
AspNetBufferingWrapper
(car le mien n'est pas un ASP app) - il s'avère que le PostFilteringWrapper nécessite quelques tampon cible. Notez que letarget-ref
élément utilisé dans le ci-dessus lié exemple ne peut pas être utilisé dans NLog 1.0 (je suis en utilisant 1.0 de Rafraîchissement pour une .NET 4.0 app); il est nécessaire de mettre votre cible à l'intérieur de l'emballage du bloc. Notez également que la logique de la syntaxe (c'est à dire supérieur ou inférieur symboles, < et >) a l'utilisation des symboles, pas le XML s'échappe de ces symboles (c'est à dire>
et<
) ou d'autre NLog l'erreur.app.config:
fileAsCsv
cible-ref est juste un artefact de mes tests. Je crois NLog 2 a/avait des problèmes avec CsvLayouts que NLog 1/l'Actualisation n'a pas.J'ai fourni un couple de raisonnablement intéressant réponses à cette question:
Nlog Génératrices de Section d'en-Tête d'un fichier journal
L'ajout d'un en-Tête:
La question voulais savoir comment faire pour ajouter un en-tête dans le fichier journal. À l'aide de config inscriptions comme celui-ci vous permettent de définir le format d'en-tête séparément à partir du format et du reste des entrées de journal. L'utilisation d'un seul enregistreur, peut-être appelé "headerlogger" pour vous connecter un unique message au début de l'application et vous obtenez votre en-tête:
Définir l'en-tête de fichier et de mises en page:
Définir les cibles à l'aide de mises en page:
Définir les bûcherons:
Écrire l'en-tête, probablement au début du programme:
C'est en grande partie juste une autre version de la "Traiter les exceptions différemment" idée.
Journal chaque niveau de journal avec une mise en page différente
De même, l'affiche voulais savoir comment faire pour modifier le format par niveau d'enregistrement. Il n'était pas clair pour moi ce que l'objectif final était (est-ce qu'il pourrait être réalisé en une "meilleure" façon), mais j'ai été capable de fournir une configuration qui a fait ce qu'il a demandé:
Encore une fois, très semblable à le Traitement des exceptions différemment.
GlobalDiagnosticsContext
avant.Connecter à Twitter
Basé sur ce post sur un log4net Twitter Appender, j'ai pensé que je voudrais m'essayer à l'écriture d'un NLog Twitter Cible (à l'aide de NLog 1.0 actualisation, pas 2.0). Hélas, jusqu'à présent, je n'ai pas été en mesure d'obtenir un Tweet à fait post avec succès. Je ne sais pas si c'est quelque chose qui cloche dans mon code, Twitter, notre société de connexion internet/pare-feu, ou quoi. Je vous poste le code ici au cas où quelqu'un est intéressé, en l'essayant. Notez qu'il existe trois différents "Post" méthodes. Le premier que j'ai essayé est PostMessageToTwitter. PostMessageToTwitter est essentiellement la même que PostLoggingEvent dans l'original post. Si j'utilise que je reçois un 401 exception. PostMessageBasic obtient la même exception. PostMessage s'exécute sans erreur, mais le message n'est toujours pas le faire à Twitter. PostMessage et PostMessageBasic sont fondées sur des exemples que j'ai trouvé ici sur DONC.
FYI - je viens de trouvé un commentaire de @Jason Diller, d'une réponse dans ce post qui dit que twitter va désactiver l'authentification de base "le mois prochain". C'était en Mai 2010 et il est maintenant en décembre 2010, donc je suppose que peut-être pourquoi cela ne fonctionne pas.
Le configurer comme ceci:
Dire NLog l'assemblée contenant la cible:
Configurer la cible:
Si quelqu'un essaie cela et a du succès, post de retour avec vos conclusions.
Reporting vers un site externe/base de données
Je voulais simplement et automatiquement des rapports d'erreur (puisque les utilisateurs n'ont pas souvent) à partir de nos applications. La solution la plus simple que je pouvais venir avec une URL publique - une page web qui pourrait prendre d'entrée et de les stocker dans une base de données qui est envoyé des données sur une erreur d'application. (La base de données peut ensuite être vérifiées par un dev ou un script pour savoir si il y a de nouvelles erreurs.)
J'ai écrit la page web en PHP et créé une base de données mysql, de l'utilisateur, et une table pour stocker les données. J'ai décidé sur quatre variables utilisateur, un identifiant et un horodatage. Les variables possibles (soit inclus dans l'URL ou de publier des données) sont:
app
(nom de l'application)msg
(message - par exemple, une Exception s'est produite ...)dev
(développeur, par exemple Pat)src
(source - ce serait à partir d'une variable se rapportant à la machine sur laquelle l'application est en cours d'exécution, par exempleEnvironment.MachineName
ou quelque chose du genre)log
(un fichier journal détaillé message)(Toutes les variables sont en option, mais rien n'est dit si aucun d'entre eux sont donc, si vous venez de visiter l'URL du site web, rien n'est envoyé à la db.)
Pour envoyer les données à l'URL, j'ai utilisé NLog de
WebService
cible. (Remarque, j'ai eu quelques problèmes avec cet objectif au premier abord. Il n'était pas jusqu'à ce que j'ai regardé la source que j'ai compris que monurl
ne pouvait pas terminer avec un/
.)Dans l'ensemble, ce n'est pas un mauvais système pour garder un œil sur les applications externes. (Bien sûr, il est poli chose à faire est de informer vos utilisateurs que vous allez déclarer éventuellement des données sensibles et de leur donner un moyen de l'opt-in/out.)
MySQL trucs
(Le db utilisateur n'a qu'
INSERT
privilèges sur cette table dans sa propre base de données.)Le code du site web
(PHP 5.3) ou (5.2) avec AOP activé, le fichier est
index.php
dans/report
dossier)Le code de l'application (NLog fichier de config)
Remarque: il peut y avoir quelques problèmes avec la taille du fichier journal, mais je n'ai pas trouvé un moyen simple de le tronquer (par exemple, à la *nix est
queue
commande).url
: InnerException: Système.InvalidCastException Message=non Valide cast de 'Système.Chaîne' de 'Système.Uri". Source=mscorlib StackTrace: au Système.Convertir des.DefaultToType(IConvertible de la valeur, Tapez targetType, fournisseur IFormatProvider) au Système.Chaîne de caractères.Système.IConvertible.ToType(Type, fournisseur IFormatProvider) au Système.Convertir des.ChangeType(la valeur de l'Objet, de Type conversionType, fournisseur IFormatProvider)Moyen plus facile Pour vous Connecter à chaque niveau de journal avec une mise en page différente Conditionnelle à l'aide de Mises en page
Voir https://github.com/NLog/NLog/wiki/When-Filter pour la syntaxe
Journal de Silverlight
Lors de l'utilisation de NLog avec Silverlight, vous pouvez envoyer la trace sur le côté serveur via la fourni service web. Vous pouvez aussi écrire dans un fichier local dans le Stockage Isolé, qui viennent dans maniable si le serveur web n'est pas disponible. Voir ici pour plus de détails, c'est à dire utiliser quelque chose comme cela pour faire vous-même une cible: