web-dev-qa-db-ja.com

log4net(C#)を使用してスタックトレースを記録する方法

_log4net_でスタックトレースを記録する方法_.Net_バージョンを使用しています。

私が持っている方法はLog.Error(ex)です。

ありがとう

20
CoolArchTek

これを使って:

_void Error(object message,Exception t)
_

理由はvoid Error(object message)のlog4netドキュメントにあります:

警告このメソッドに例外を渡すと、例外の名前が出力されますが、スタックトレースは出力されません。スタックトレースを出力するには、代わりにvoid Error(object,Exception)フォームを使用します。

Error(object message, Exception t)は、例外データをログに記録する最も柔軟な方法です。これは、オブジェクトではなく例外として処理され、ログを特定の例外クラスに絞り込むためにアペンダーで使用できるためです(ある文字列を検索するのではなく)はるかに遅く、一貫性が低い)

メッセージと例外を受け取るすべての非フォーマットロギングメソッドの特別なバージョンがあります。

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

必要なフォーマットとデータを出力するように、レイアウトパターンの定義が構造化されていることを確認する必要があります。

log4Netパターンレイアウト

ロギングイベントのスタックトレースを出力するために使用されます。スタックトレースレベル指定子は中括弧で囲むことができます。たとえば、%stacktrace {level}。スタックトレースレベル指定子が指定されていない場合、1と見なされます。

出力は次の形式を使用します:type3.MethodCall3> type2.MethodCall2> type1.MethodCall1

このパターンはCompact Frameworkアセンブリでは使用できません。

14
Lloyd

2つの基本的な形式があり、1つはオブジェクトと例外を明示的に受け取ります。

_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の場合、その値は返される文字列に含まれません。

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

ただtry ... catchexceptionを使用して、ロギングメソッドにその例外を指定します。

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

このオーバーロードは、呼び出しスタックをログに出力する例外のToString()メソッドを暗黙的に呼び出します。

0
Jens H

ILogを拡張して、スタックトレースで例外のみをログに記録するメソッドを作成できます。

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