_log4net
_でスタックトレースを記録する方法_.Net
_バージョンを使用しています。
私が持っている方法はLog.Error(ex)
です。
ありがとう
これを使って:
_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);
...
}
}
_
必要なフォーマットとデータを出力するように、レイアウトパターンの定義が構造化されていることを確認する必要があります。
ロギングイベントのスタックトレースを出力するために使用されます。スタックトレースレベル指定子は中括弧で囲むことができます。たとえば、%stacktrace {level}。スタックトレースレベル指定子が指定されていない場合、1と見なされます。
出力は次の形式を使用します:type3.MethodCall3> type2.MethodCall2> type1.MethodCall1
このパターンはCompact Frameworkアセンブリでは使用できません。
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の場合、その値は返される文字列に含まれません。
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);
}
ただtry ... catch
exception
を使用して、ロギングメソッドにその例外を指定します。
try
{
// ... code that throws exception
}
catch (Exeption ex)
{
myLogger.Error(ex);
}
このオーバーロードは、呼び出しスタックをログに出力する例外のToString()メソッドを暗黙的に呼び出します。
ILogを拡張して、スタックトレースで例外のみをログに記録するメソッドを作成できます。
public static void ErrorWithStackTrace(this ILog log, Exception exception)
{
log.Error(exception.Message,exception);
}