8
votes

Le support log4net comprend-il la pile d'appels dans un message de journal

Je souhaite inclure la pile d'appels (par exemple, les méthodes qui m'ont appelé) dans un message log4net. Y a-t-il une façon standard de faire cela?

(Je sais que cela sera lent, mais il suffit de le faire sur certaines erreurs)


2 commentaires

La méthode Log4net Error (String, Exception) n'est-elle pas suffisante pour cela?


@Codemonkeyking - Je pense que l'OP dit qu'il veut enregistrer la trace de la pile dans certains scénarios où il n'a pas d'exception.


4 Réponses :


12
votes

Oui - Vous pouvez obtenir ces informations de pile à l'aide des modèles suivants dans une mise en page de motif: xxx

voir le Cette Documentation sur le modèleLayout pour plus d'informations.

Modifier en réponse au commentaire de Ian ci-dessous : je ne pense log4net peut être configuré pour écrire la pile entière.

Vous pouvez toujours revenir à l'écrire pour vous-même, en utilisant quelque chose comme New StackTrace (). Tostring () , mais je suppose que la raison pour laquelle vous demandez est que vous souhaitez que cela soit configurable dans la configuration de la journalisation.

Je vais avoir un plus profond Regardez, mais mon sentiment d'intestin est qu'il n'ya aucun moyen de configurer cela, et que vous finisez à mettre en œuvre votre propre classe de mise en page.

Edit ++ OK - Voici une classe de mise en page de modèle personnalisée qui dérive de motiflayout mais ajoute dans une mise en page% pile.

Ce code est un peu rugueux - illustratif uniquement - pas la production! (Par exemple, vous n'avez peut-être pas la permission de la sécurité pour accéder à la pile que vous essayez d'imprimer) xxx

Vous pouvez ensuite le configurer avec la configuration de modèle suivante (note% pile à la fin de la mise en page): xxx


8 commentaires

Lorsque je lis cette page, j'ai pris% emplacement pour signifier seulement le nom pleinement qualifié de la méthode d'appel, et non la pile d'appels complète.


Je souhaite inclure la pile d'appels dans certains messages mais pas d'autres par défaut. (E.G. Un journal à Ilog.Error () pour inclure la pile d'appels serait sur place.)


Vous n'avez pas besoin d'utiliser une boucle pour écrire la pile d'appels. Jetez un coup d'œil à la documentation sur StackFrame.tostring: MSDN .microsoft.com / fr-US / Bibliothèque / ...


@Codemonkeyking - Pas sûr de suivre votre suggestion. StackFrame.ToString () Seule uniquement la trame actuelle, pas la trace entière jusqu'à la trame actuelle. Dans tous les cas, comme indiqué dans le commentaire du code, j'ai toujours besoin de boucler toutes les images de la trace afin de "pousser passé" ces cadres internes à log4net. Ai-je mal compris votre suggestion?


Rob - J'aime ton exemple. Avez-vous déjà eu une version de cela pour travailler? Ce que j'aimerais voir serait une méthode comme une méthode, mais qui peut prendre un argument, une intergion spécifiant à quelle vitesse la pile à marcher. Il sortirait la méthode d'appel et son nième appelant, comme dans: Main.Somemethod.somemethodQuelle


@Daniel - Oui - L'exemple ci-dessus est le code de travail - je l'ai testé avant de l'avoir posté. En ce qui concerne le fait d'avoir un argument pour spécifier à quelle vitesse la pile que vous voulez aller: je pense que c'est probablement pourrait être fait , mais je soupçonne que vous devriez écrire du code personnalisé pour analyser le modèle de mise en page , afin que vous puissiez avoir quelque chose comme: Signification "Obtenez-moi 10 lignes de la pile ". Cela dépasse la portée de ce que je répondais ci-dessus, mais n'hésitez pas à lui demander une autre question faisant référence celle-ci.


Est-ce l'espace de noms ou quelque chose? ScratchPad.custompomptMastMayNlayout, ScratchPad


@Jamesbraz - Oui - c'est vrai. J'aurais dû clarifier cela. Lorsque j'ai créé cela comme un exemple pour le tester, je l'ai créé dans un projet (assemblage) nommé "ScratchPad".



3
votes

Si vous attrapez des exceptions, alors connectez-vous simplement Exception. Tostring () , comme cela contiendra la trace de la pile complète et sera disponible en tant que message de journal normal.


0 commentaires

4
votes

Robs La réponse était la meilleure que j'ai trouvée, j'ai décidé de l'étendre un peu à imprimer la trace de la pile complète uniquement pour des exceptions si elle aide toute autre personne. xxx


1 commentaires

Cela a bien fonctionné pour moi - merci! Notez que (peut-être évidemment), vous devez inclure l'exception dans l'appel de journal, par ex. log.fatal (message, ex)



1
votes

Ce n'est pas l'approche la plus propre, mais un moyen rapide d'y parvenir est de créer une exception artificielle contenant la trace de pile souhaitée: xxx pré>

( Source complète ) p>

alors vous pouvez l'utiliser comme: P>

Log.Error("It went kaboom", new ArtificialStackTraceException());


0 commentaires