簡體   English   中英

如何使用log4net(C#)記錄堆棧跟蹤

[英]How to log stack trace using log4net (C#)

如何使用log4net記錄堆棧跟蹤? 我正在使用.Net版本。

我的方式是Log.Error(ex)

謝謝

用這個:

void Error(object message,Exception t)

原因在於log4net文檔中的void Error(object message)

警告請注意,將Exception傳遞給此方法將打印Exception的名稱,但不會顯示堆棧跟蹤。 要打印堆棧跟蹤,請使用void Error(object,Exception)表單。

Error(object message, Exception t)是記錄異常數據的最靈活的方法,因為它作為異常而不是對象,並且可以在appender中用於將日志縮小到特定的異常類(而不是通過搜索字符串慢得多,不太一致)

所有非格式化日志記錄方法都有特殊版本,它們接收消息和異常:

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);
        ...
    }
}

您需要確保布局模式的定義結構化,以輸出您想要的格式和數據。

log4Net模式布局

用於輸出日志記錄事件的堆棧跟蹤堆棧跟蹤級別說明符可以包含在大括號之間。 例如, %stacktrace {level}。 如果沒有給出堆棧跟蹤級別說明符,則假定為1

輸出使用格式:type3.MethodCall3> type2.MethodCall2> type1.MethodCall1

此模式不適用於Compact Framework程序集。

有兩種基本形式,一種是明確地獲取對象和異常:

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

並且可以獲取任何對象並對其執行ToString()

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

前者允許您首先在日志條目上附加更有意義的消息,以提供您想要的任何其他詳細信息。 后者將完成這項工作,但只使用ToString()打印異常細節,它為您提供:

ToString的默認實現獲取拋出當前異常的類的名稱,消息,在內部異常上調用ToString的結果,以及調用Environment.StackTrace的結果。 如果這些成員中的任何一個為Nothing,則其值不包含在返回的字符串中。

您可以擴展ILog以使用一個方法來記錄其堆棧跟蹤的異常。

public static void ErrorWithStackTrace(this ILog log, Exception exception)
 {
    log.Error(exception.Message,exception);
   }
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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM