Quelles sont les configurations les meilleures ou les plus utiles pour se connecter avec NLog? (Ceux-ci peuvent être simples ou complexes, tant qu'ils sont utiles.)
Je pense à des exemples comme le survol automatique des fichiers journaux à une certaine taille, la modification de la disposition (message de journal), qu'il y ait ou non une exception, l'augmentation du niveau de journal une fois qu'une erreur s'est produite, etc.
Voici quelques liens:
Réponses:
Certains d'entre eux entrent dans la catégorie des conseils NLog (ou de journalisation) généraux plutôt que des suggestions de configuration strictes.
Voici quelques liens de journalisation généraux d'ici chez SO (vous en avez peut-être déjà vu certains ou tous):
log4net contre Nlog
Journalisation des meilleures pratiques
Quel est l'intérêt d'une façade forestière?
Pourquoi les enregistreurs recommandent-ils d'utiliser un enregistreur par classe?
Utilisez le modèle courant pour nommer votre enregistreur en fonction de la classe
Logger logger = LogManager.GetCurrentClassLogger()
. Cela vous donne un degré élevé de granularité dans vos enregistreurs et vous donne une grande flexibilité dans la configuration des enregistreurs (contrôle global, par espace de noms, par nom de enregistreur spécifique, etc.).Utilisez des enregistreurs non basés sur le nom de classe, le cas échéant. Peut-être avez-vous une fonction pour laquelle vous voulez vraiment contrôler la journalisation séparément. Vous avez peut-être des problèmes de journalisation intersectoriels (journalisation des performances).
Si vous n'utilisez pas la journalisation basée sur le nom de classe, pensez à nommer vos enregistreurs dans une sorte de structure hiérarchique (peut-être par domaine fonctionnel) afin de conserver une plus grande flexibilité dans votre configuration. Par exemple, vous pouvez avoir un domaine fonctionnel "base de données", un FA "analyse" et un FA "ui". Chacun de ces éléments peut avoir des sous-zones. Vous pouvez donc demander des enregistreurs comme celui-ci:
Etc. Avec les enregistreurs hiérarchiques, vous pouvez configurer la journalisation de manière globale (le "*" ou enregistreur racine), par FA (Database, Analysis, UI) ou par sous-zone (Database.Connect, etc.).
Les enregistreurs ont de nombreuses options de configuration:
Consultez l' aide de NLog pour plus d'informations sur la signification exacte de chacune des options. Les éléments les plus notables ici sont probablement la possibilité de joker des règles de journalisation, le concept selon lequel plusieurs règles de journalisation peuvent "s'exécuter" pour une seule instruction de journalisation, et qu'une règle de journalisation peut être marquée comme "finale" afin que les règles suivantes ne s'exécutent pas pour un compte rendu de consignation donné.
Utilisez GlobalDiagnosticContext, MappedDiagnosticContext et NestedDiagnosticContext pour ajouter un contexte supplémentaire à votre sortie.
Utilisez "variable" dans votre fichier de configuration pour simplifier. Par exemple, vous pouvez définir des variables pour vos présentations, puis référencer la variable dans la configuration cible plutôt que de spécifier directement la présentation.
Vous pouvez également créer un ensemble de propriétés "personnalisé" à ajouter à une présentation.
Ou, vous pouvez faire des choses comme créer des rendus de mise en page "jour" ou "mois" strictement via la configuration:
Vous pouvez également utiliser des rendus de mise en page pour définir votre nom de fichier:
Si vous faites rouler votre fichier quotidiennement, chaque fichier pourrait être nommé "Monday.log", "Tuesday.log", etc.
N'ayez pas peur d'écrire votre propre rendu de mise en page. Il est facile et vous permet d'ajouter vos propres informations de contexte au fichier journal via la configuration. Par exemple, voici un rendu de mise en page (basé sur NLog 1.x et non 2.0) qui peut ajouter Trace.CorrelationManager.ActivityId au journal:
Dites à NLog où vos extensions NLog (quel assemblage) comme ceci:
Utilisez le rendu de mise en page personnalisé comme ceci:
Utilisez des cibles asynchrones:
Et les wrappers cibles par défaut:
le cas échéant. Voir les documents NLog pour plus d'informations à ce sujet.
Dites à NLog de regarder et de recharger automatiquement la configuration si elle change:
Il existe plusieurs options de configuration pour faciliter le dépannage de NLog
Voir l'aide de NLog pour plus d'informations.
NLog 2.0 ajoute des wrappers LayoutRenderer qui permettent d'effectuer un traitement supplémentaire sur la sortie d'un rendu de mise en page (comme le découpage des espaces blancs, les majuscules, les minuscules, etc.).
N'ayez pas peur d'envelopper l'enregistreur si vous voulez isoler votre code d'une forte dépendance à NLog, mais envelopper correctement. Il y a des exemples de comment encapsuler dans le référentiel github de NLog. Une autre raison pour encapsuler peut être que vous souhaitez ajouter automatiquement des informations de contexte spécifiques à chaque message enregistré (en les plaçant dans LogEventInfo.Context).
Il y a des avantages et des inconvénients à encapsuler (ou à résumer) NLog (ou tout autre cadre de journalisation d'ailleurs). Avec un petit effort, vous pouvez trouver ici de nombreuses informations sur SO présentant les deux côtés.
Si vous envisagez d' habiller , pensez à utiliser Common.Logging . Cela fonctionne assez bien et vous permet de basculer facilement vers un autre cadre de journalisation si vous le souhaitez. De plus, si vous envisagez d'habiller, pensez à la façon dont vous allez gérer les objets de contexte (GDC, MDC, NDC). Common.Logging ne prend actuellement pas en charge une abstraction pour eux, mais il est censé être dans la file d'attente des capacités à ajouter.
la source
NewLine
mise en page accomplit la tâche. Voici ce que j'ai trouvé. C'est certainement beaucoup plus simple que ce à quoi je m'attendais.Traiter les exceptions différemment
Nous voulons souvent obtenir plus d'informations lorsqu'il y a une exception. La configuration suivante a deux cibles, un fichier et la console, qui filtrent s'il existe ou non des informations d'exception. (EDIT: Jarek a publié une nouvelle méthode pour le faire dans vNext .)
La clé est d'avoir une cible wrapper avec
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
la source
condition="length('${exception}')=0
(ou peut-être que c'est==
) àtarget name="file"
.Apparemment, vous pouvez maintenant utiliser NLog avec Growl pour Windows .
la source
Configurer NLog via XML, mais par programme
Quelle? Saviez-vous que vous pouvez spécifier le XML NLog directement à NLog à partir de votre application, au lieu de le faire lire par NLog à partir du fichier de configuration? Bien, vous pouvez. Disons que vous avez une application distribuée et que vous souhaitez utiliser la même configuration partout. Vous pouvez conserver un fichier de configuration dans chaque emplacement et le conserver séparément, vous pouvez en conserver un dans un emplacement central et le pousser vers les emplacements satellites, ou vous pouvez probablement faire beaucoup d'autres choses. Ou, vous pouvez stocker votre XML dans une base de données, l'obtenir au démarrage de l'application et configurer NLog directement avec ce XML (peut-être en revenant périodiquement pour voir s'il a changé).
Je ne sais pas à quel point c'est robuste, mais cet exemple fournit un point de départ utile pour les personnes qui pourraient vouloir essayer de configurer comme ça.
la source
<?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'>
Journalisation de différents niveaux selon qu'il y a ou non une erreur
Cet exemple vous permet d'obtenir plus d'informations en cas d'erreur dans votre code. Fondamentalement, il met en mémoire tampon les messages et ne sort que ceux à un certain niveau de journal (par exemple Warn) sauf si une certaine condition est remplie (par exemple, il y a eu une erreur, donc le niveau de journal est> = Error), puis il affichera plus d'informations (par exemple tous les messages des niveaux de journal> = Trace). Parce que les messages sont mis en mémoire tampon, cela vous permet de collecter des informations de trace sur ce qui s'est passé avant qu'une erreur ou une exception d'erreur ne soit enregistrée - très utile!
J'ai adapté celui-ci à partir d' un exemple dans le code source . J'ai été renversé au début parce que j'ai laissé de côté
AspNetBufferingWrapper
(car la mienne n'est pas une application ASP) - il s'avère que le PostFilteringWrapper nécessite une cible tamponnée. Notez que l'target-ref
élément utilisé dans l'exemple ci-dessus ne peut pas être utilisé dans NLog 1.0 (j'utilise 1.0 Refresh pour une application .NET 4.0); il est nécessaire de mettre votre cible à l'intérieur du bloc wrapper. Notez également que la syntaxe logique (c.-à-d. Symboles supérieurs ou inférieurs à, <et>) doit utiliser les symboles, et non les échappements XML pour ces symboles (c.>
-à- d. Et<
) sinon NLog provoquera une erreur.app.config:
la source
fileAsCsv
target-ref n'est qu'un artefact de mes tests. Je crois que NLog 2 a / a eu des problèmes avec CsvLayouts que NLog 1 / Refresh n'avait pas.J'ai fourni quelques réponses raisonnablement intéressantes à cette question:
Nlog - Génération d'une section d'en-tête pour un fichier journal
Ajout d'un en-tête:
La question voulait savoir comment ajouter un en-tête au fichier journal. L'utilisation d'entrées de configuration comme celle-ci vous permet de définir le format d'en-tête séparément du format du reste des entrées de journal. Utilisez un seul enregistreur, peut-être appelé "headerlogger" pour enregistrer un seul message au début de l'application et vous obtenez votre en-tête:
Définissez les dispositions d'en-tête et de fichier:
Définissez les cibles à l'aide des dispositions:
Définissez les enregistreurs:
Écrivez l'en-tête, probablement au début du programme:
Il s'agit en grande partie d'une autre version de l'idée "Traiter les exceptions différemment".
Enregistrez chaque niveau de journal avec une disposition différente
De même, l'affiche voulait savoir comment changer le format par niveau de journalisation. Il n'était pas clair pour moi quel était l'objectif final (et s'il pouvait être atteint d'une "meilleure" manière), mais j'ai pu fournir une configuration qui a fait ce qu'il a demandé:
Encore une fois, très similaire à Traiter les exceptions différemment .
la source
GlobalDiagnosticsContext
avant.Connectez-vous à Twitter
Basé sur ce post sur un Appender Twitter log4net, J'ai pensé que j'essaierais d'écrire une cible Twitter NLog (en utilisant le rafraîchissement NLog 1.0, pas 2.0). Hélas, jusqu'à présent, je n'ai pas pu obtenir un Tweet pour publier avec succès. Je ne sais pas si c'est quelque chose de mal dans mon code, Twitter, la connexion Internet / pare-feu de notre entreprise, ou quoi. Je poste le code ici au cas où quelqu'un serait intéressé à l'essayer. Notez qu'il existe trois méthodes "Post" différentes. Le premier que j'ai essayé est PostMessageToTwitter. PostMessageToTwitter est essentiellement le même que PostLoggingEvent dans le message d'origine. Si j'utilise cela, j'obtiens une exception 401. PostMessageBasic obtient la même exception. PostMessage s'exécute sans erreur, mais le message ne parvient toujours pas à Twitter. PostMessage et PostMessageBasic sont basés sur des exemples que j'ai trouvés ici sur SO.
FYI - Je viens de trouver un commentaire de @Jason Diller à 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 c'est maintenant décembre 2010, donc je suppose que cela pourrait être la raison pour laquelle cela ne fonctionne pas.
Configurez-le comme ceci:
Dites à NLog l'assembly contenant la cible:
Configurez la cible:
Si quelqu'un essaie cela et réussit, postez-le avec vos résultats.
la source
Un moyen plus simple de consigner chaque niveau de journal avec une disposition différente à l'aide de dispositions conditionnelles
Voir https://github.com/NLog/NLog/wiki/When-Filter pour la syntaxe
la source
Rapports à un site Web / une base de données externe
Je voulais un moyen de signaler simplement et automatiquement les erreurs (car les utilisateurs ne le font souvent pas) de nos applications. La solution la plus simple que j'ai pu trouver était une URL publique - une page Web qui pourrait prendre des entrées et les stocker dans une base de données - qui envoie des données en cas d'erreur d'application. (La base de données pourrait ensuite être vérifiée par un développeur ou un script pour savoir s'il y a de nouvelles erreurs.)
J'ai écrit la page Web en PHP et créé une base de données mysql, un utilisateur et une table pour stocker les données. J'ai choisi quatre variables utilisateur, un identifiant et un horodatage. Les variables possibles (incluses dans l'URL ou en tant que données POST) sont:
app
(Nom de l'application)msg
(message - par exemple, une exception s'est produite ...)dev
(développeur - par exemple Pat)src
(source - cela proviendrait d'une variable se rapportant à la machine sur laquelle l'application s'exécutait, par exempleEnvironment.MachineName
ou une telle)log
(un fichier journal ou un message détaillé)(Toutes les variables sont facultatives, mais rien n'est signalé si aucune d'entre elles n'est définie - donc si vous visitez simplement l'URL du site Web, rien n'est envoyé à la base de données.)
Pour envoyer les données à l'URL, j'ai utilisé la
WebService
cible de NLog . (Remarque, j'ai eu quelques problèmes avec cet objectif au début. Ce n'est que lorsque j'ai regardé la source que j'ai compris que monurl
ne pouvait pas se terminer par un/
.)Dans l'ensemble, ce n'est pas un mauvais système pour garder un œil sur les applications externes. (Bien sûr, la chose la plus polie à faire est d' informer vos utilisateurs que vous signalerez des données potentiellement sensibles et de leur donner un moyen d'activer / désactiver.)
Trucs MySQL
(L'utilisateur db n'a que des
INSERT
privilèges sur cette seule table dans sa propre base de données.)Code du site Web
(PHP 5.3 ou 5.2 avec PDO activé , le fichier est
index.php
dans le/report
dossier)Code d'application (fichier de configuration NLog)
Note: il peut y avoir quelques problèmes avec la taille du fichier journal, mais je n'ai pas trouvé un moyen simple de tronquer (par exemple à la * Nix
tail
la commande ).la source
url
: InnerException: System.InvalidCastException Message = Cast non valide de 'System.String' en 'System.Uri'. Source = mscorlib StackTrace: sur System.Convert.DefaultToType (IConvertible value, Type targetType, IFormatProvider provider) sur System.String.System.IConvertible.ToType (Type type, IFormatProvider provider) sur System.Convert.ChangeType (Valeur d'objet, Type conversionType , Fournisseur IFormatProvider)Journal de Silverlight
Lorsque vous utilisez NLog avec Silverlight, vous pouvez envoyer la trace côté serveur via le service Web fourni . Vous pouvez également écrire dans un fichier local dans le stockage isolé, ce qui est pratique si le serveur Web n'est pas disponible. Voir ici pour plus de détails, c'est-à-dire utiliser quelque chose comme ça pour vous faire une cible:
la source