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? P>
(Je sais que cela sera lent, mais il suffit de le faire sur certaines erreurs) p>
4 Réponses :
Oui - Vous pouvez obtenir ces informations de pile à l'aide des modèles suivants dans une mise en page de motif: voir le Cette Documentation sur le modèleLayout pour plus d'informations. P> Modifier en réponse au commentaire de Ian ci-dessous : strong> je ne pense em> log4net peut être configuré pour écrire la pile entière. P> Vous pouvez toujours revenir à l'écrire pour vous-même, en utilisant quelque chose comme 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. p> Edit ++ strong>
OK - Voici une classe de mise en page de modèle personnalisée qui dérive de 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) p> Vous pouvez ensuite le configurer avec la configuration de modèle suivante (note% pile à la fin de la mise en page): p> New StackTrace (). Tostring () Code>, mais je suppose que la raison pour laquelle vous demandez est que vous souhaitez que cela soit configurable dans la configuration de la journalisation. P>
motiflayout code> mais ajoute dans une mise en page% pile. P>
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 i>, 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:
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".
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. P>
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.
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) code>
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: ( Source complète ) p> alors vous pouvez l'utiliser comme: P> Log.Error("It went kaboom", new ArtificialStackTraceException());
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.