如何使用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)是记录exception数据的最灵活的方法,因为它作为exception而不是对象,并且可以在appender中用于将日志缩小到特定的exception类(而不是通过搜索字符串慢得多且不太一致)

所有非格式化日志记录方法都有特殊版本,它们接收消息和exception:

 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程序集。

有两种基本forms,一种是明确地获取对象和exception:

 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()打印exception细节,它为您提供:

ToString的默认实现获取抛出当前exception的类的名称,消息,在内部exception上调用ToString的结果,以及调用Environment.StackTrace的结果。 如果这些成员中的任何一个为Nothing,则其值不包含在返回的字符串中。

只需try ... catch exception并将该exception提供给日志记录方法:

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

此重载隐式调用exception的ToString()方法,该方法将调用堆栈打印到您的日志中。

您可以扩展ILog以获得一个方法,该方法仅使用其堆栈跟踪记录exception。

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