2010-01-25 4 views
1

Je sais que je peux enregistrer des exceptions à la base de données en utilisant Log4Net, mais je veux rompre ce qu'il stocke pour une exception dans différentes colonnes.Log4Net Logging Exceptions

Est-ce que quelqu'un sait si cela est disponible, si quelqu'un l'a fait ou est-il simplement plus facile de consigner manuellement les exceptions dans la base de données?

Vive Anthony

MISE À JOUR:

Si elle aide à utiliser peut-être les suivantes:

  • Est-ce que quelqu'un sait si cela est disponible?
    • Ce sont le genre de détails que je suis après:
      • ExceptionType
      • ExceptionMessage
      • ExceptionSource
      • ExceptionTargetSite
      • ExceptionStackTrace
  • Si quelqu'un l'a fait?
  • Est-il simplement plus facile de consigner manuellement les exceptions dans la base de données?

Peut-être que le changement de format aidera.

+2

Sérieusement, qu'est-ce que vous cherchez? Si un Appender personnalisé est trop dur, mais que l'Appender AdoNet n'est pas suffisamment granulaire, que voulez-vous? Quelles données voulez-vous sortir? Selon le type d'exception ou le contenu du message? Quel problème avez-vous eu pour implémenter votre propre version modifiée d'AdoNetAppender? –

+0

qu'est-ce que "Est-il simplement plus facile de consigner manuellement les exceptions dans la base de données?" signifier? –

Répondre

2

Comme l'a demandé, vous pouvez utiliser l'approche décrite ici: Log4Net available database fields for adoappender - seems there are a few more i.e. method_name? à utiliser les propriétés personnalisées dans le log4net ThreadContext pour éventuellement enregistrer ces informations supplémentaires sur les exceptions dans quelque chose comme ce qui suit:

public void LogDetailedException (LogLevel level, string message, Exception exception) 
{ 
    log4net.ThreadContext.Properties["exceptionType"] = exception.GetType().AssemblyQualifiedName; 
    // appropriate logging statement 
    log4net.ThreadContent.Properties.Remove("exceptionType"); // clear it, so it's not used in future calls 
} 

Et t poule dans votre modèle:

<conversionPattern value="%property{exceptionType}" /> 

Il teste la valeur/des recherches pour voir si cela est thread-safe (le nom impliquerait qu'il est, mais il ne peut pas faire du mal à vérifier). Vous devez également vous assurer que les journaux suivants n'incluent pas ces données dans leurs messages (c'est-à-dire, assurez-vous que les données sont effacées).

(marqué Wiki car ce n'est pas spécifiquement ma réponse, juste un rassemblement de diverses informations et discussion dans les commentaires sur Mitch's réponse).

+0

Merci pour cela. J'apprécie vraiment cela. Pour ma question, c'est la meilleure réponse, mais je vais probablement me tourner vers ELMAH pour ma gestion des erreurs et ne pas utiliser Log4Net. –

-1

Utilisez le AdoNetAppender Class, ou cela ne correspond pas à vos besoins, écrivez le vôtre custom Appender.

+2

Pourquoi cela serait-il réduit? AdoNetAppender vous permet de casser les choses, et si vous avez besoin de plus de granularité, vous pouvez également suivre les conseils d'un appender personnalisé. –

+2

La classe AdoNetAppender ne divise pas les détails de l'exception. La réponse générique "custom Appender" n'aide vraiment pas à répondre à la question. –

+0

@Sam merci, mes pensées exactement –

2

Si vous ne voulez pas utiliser quelque chose comme ELMAH, d'une manière douteuse pourrait captera toutes les exceptions en remplaçant Page.ProcessRequest (douteux parce qu'il est marqué pour l'utilisation des infrastructures uniquement)

public override void ProcessRequest(HttpContext context) 
{ 
    try 
    { 
     base.ProcessRequest(context); 
    } 
    catch (Exception e) 
    { 
     log.ErrorFormat(e.Message); // Log exception message, or 
     log.ErrorFormat(e.ToString()); // Log stack trace 
     throw; 
    } 
} 
+0

Merci Si ... C'est vraiment intéressant, je n'avais jamais entendu parler d'ELMAH auparavant. J'essayais d'obtenir Log4Net pour faire ma journalisation des exceptions et pas seulement ma journalisation.Mais ELMAH pourrait être le chemin à parcourir. –

2

ELMAH est un excellent choix. Une bibliothèque moins connue est CuttingEdge.Logging.Tout comme ELMAH, il permet de consigner le type d'exception, le message et le suivi de la pile dans une table de la base de données.