web-dev-qa-db-fra.com

Comment enregistrer la trace de la pile en utilisant log4net (C #)

Comment enregistrer la trace de pile avec log4net? J'utilise la version .Net

Ils sont comme ça Log.Error(ex).

Merci

18
CoolArchTek

Utilisez ceci:

void Error(object message,Exception t)

La raison est dans la documentation de log4net pour void Error(object message):

AVERTISSEMENT Notez que le fait de passer une exception à cette méthode imprimera le nom de l'exception mais pas de trace de pile. Pour imprimer une trace de pile, utilisez plutôt le formulaire void Error(object,Exception).

Error(object message, Exception t) est le moyen le plus flexible de consigner des données d'exception, car il s'agit d'exception plutôt que d'objet et peut être utilisé dans les appenders pour restreindre les journaux à une classe d'exception particulière (plutôt qu'en recherchant une chaîne beaucoup plus lente et moins cohérente).

Il existe des versions spéciales de toutes les méthodes de journalisation non-format qui prennent des messages et des exceptions:

namespace log4net
{
    public interface ILog
    {
        ...
        /* Log a message object and exception */
        void Debug(object message, Exception t);
        void Info(object message, Exception t);
        void Warn(object message, Exception t);
        void Error(object message, Exception t);
        void Fatal(object message, Exception t);
        ...
    }
}
24
Maciej

Vous devez vous assurer que la définition du modèle de mise en page est structurée pour produire le format et les données souhaités.

Schéma de modèle log4Net

Utilisé pour générer la trace de pile de l'événement de journalisation. Le spécificateur de niveau de trace de pile peut être placé entre accolades. Par exemple, % stacktrace {level}. Si aucun spécificateur de niveau de trace de pile n'est donné, on suppose que 1

La sortie utilise le format: type3.MethodCall3> type2.MethodCall2> type1.MethodCall1

Ce modèle n'est pas disponible pour les assemblys Compact Framework.

14
Lloyd

Il existe deux formes de base, une qui prend explicitement un objet et une exception:

catch(Exception ex)
{
    // the form that takes two args has an exception as second, prints trace...
    _log.Error("My custom message", ex);
}

Et celui qui prend n'importe quel objet et effectue une ToString() dessus:

catch(Exception ex)
{
    // the form that takes one arg uses ToString()
    _log.Error(ex);
}

Le premier vous permet d’attacher d’abord un message plus significatif sur l’entrée du journal pour donner les détails supplémentaires que vous souhaitez. Ce dernier fera le travail, mais n'imprimera que les détails de l'exception à l'aide de ToString(), ce qui vous donnera:

L'implémentation par défaut de ToString obtient le nom de la classe qui a jeté l'exception en cours, le message, le résultat de l'appel de ToString sur l'exception interne et le résultat de l'appel Environment.StackTrace. Si l'un de ces membres est Nothing, sa valeur n'est pas inclus dans la chaîne renvoyée.

12
James Michael Hare
public static Logger SetIfNeededAndGetLogger(string serviceName, string methodName)
{
    Logger logger = null;

    try
    {
        if (!string.IsNullOrWhiteSpace(serviceName) && !string.IsNullOrWhiteSpace(methodName))
        {
            ILog log = null;
            var traceSourceName = string.Format("{0}{1}", serviceName, methodName);
            if (!string.IsNullOrWhiteSpace(traceSourceName))
            {
                logger = LogSources.FirstOrDefault(x => x.ServiceLogType == traceSourceName);
                if (logger == null)
                {
                    log = LogManager.GetLogger(traceSourceName);
                    //logger = new Logger(log, IHEService.MediLogClientGuid, traceSourceName, methodName);
                    logger = new Logger(log, System.Guid.NewGuid(), traceSourceName, methodName);
                    SetLoggingSource(logger);
                }
            }
        }
    }
    catch (Exception)
    {
        //silent faiure
    }

    return logger;
}

private static void SetLoggingSource(Logger value)
{
    LogSources.Add(value);
}
0
user10767645

Juste try ... catch la exception et donnez cette exception dans la méthode de journalisation:

try
{
  // ... code that throws exception
}
catch (Exeption ex)
{
  myLogger.Error(ex);
}

Cette surcharge appelle implicitement la méthode ToString () de l'exception qui imprime la pile d'appels dans votre journal.

0
Jens H

Vous pouvez étendre ILog pour avoir une méthode qui enregistre juste une exception avec sa trace de pile.

public static void ErrorWithStackTrace(this ILog log, Exception exception)
 {
    log.Error(exception.Message,exception);
   }
0
Valentin