webentwicklung-frage-antwort-db.com.de

Protokollieren des Stack-Trace mit log4net (C #)

Wie protokolliere ich den Stack-Trace mit log4net? Ich verwende die .Net-Version. 

So, wie ich es habe, ist Log.Error(ex).

Vielen Dank

18
CoolArchTek

Benutze das:

void Error(object message,Exception t)

Grund ist in der log4net-Dokumentation für void Error(object message):

WARNUNG Beachten Sie, dass bei der Übergabe einer Exception an diese Methode der Name der Exception, aber keine Stack-Trace ausgegeben wird. Verwenden Sie zum Drucken eines Stack-Trace das Formular void Error(object,Exception).

Error(object message, Exception t) ist die flexibelste Möglichkeit, Ausnahmedaten zu protokollieren, da sie als Ausnahme und nicht als Objekt verwendet wird und in Appenders verwendet werden kann, um Protokolle auf eine bestimmte Ausnahmeklasse einzugrenzen (anstatt nach einer Zeichenfolge zu suchen, die viel langsamer und weniger konsistent ist).

Es gibt spezielle Versionen aller Nichtformatierungsprotokollierungsmethoden, die Nachrichten und Ausnahmen akzeptieren:

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

Sie müssen sicherstellen, dass die Definition des Layoutmusters strukturiert ist, um das gewünschte Format und die gewünschten Daten auszugeben.

log4Net Musterlayout

Wird verwendet, um den Stack-Trace des Protokollierungsereignisses auszugeben. Der Bezeichner der Stack-Trace-Ebene kann in geschweifte Klammern eingeschlossen werden. Zum Beispiel % stacktrace {level}. Wenn kein Stack-Trace-Level-Spezifizierer angegeben ist, wird 1 angenommen

Die Ausgabe verwendet das Format: type3.MethodCall3> type2.MethodCall2> type1.MethodCall1

Dieses Muster ist für Compact Framework-Baugruppen nicht verfügbar.

14
Lloyd

Es gibt zwei grundlegende Formen, eine, die ein Objekt und eine Ausnahme explizit akzeptiert:

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

Und eine, die jedes Objekt nimmt und eine ToString() daran ausführt:

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

Mit dem ersteren können Sie zuerst eine aussagekräftigere Nachricht an den Protokolleintrag anhängen, um weitere Details anzugeben. Letzteres erledigt den Job, druckt jedoch nur die Ausnahmedetails mit ToString(). Dadurch erhalten Sie:

Die Standardimplementierung von ToString ermittelt den Namen der Klasse das warf die aktuelle Ausnahme, die Nachricht, das Ergebnis des Aufrufs von ToString für die innere Ausnahme und das Ergebnis des Aufrufs von Environment.StackTrace. Wenn eines dieser Elemente Nothing ist, ist dessen Wert ist nicht in der zurückgegebenen Zeichenfolge enthalten.

12
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

Einfach try ... catch die exception und gib diese Ausnahme in die Protokollierungsmethode ein:

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

Diese Überladung ruft implizit die ToString () - Methode der Ausnahme auf, die den Aufrufstapel in Ihr Protokoll druckt.

0
Jens H

Sie können ILog erweitern, um eine Methode zu haben, die nur eine Ausnahme mit seinem Stack-Trace protokolliert.

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