如何使用log4net(C#)记录堆栈跟踪

Coo*_*Tek 19 c# log4net

如何记录堆栈跟踪log4net?我正在使用.Net版本.

我的方式是Log.Error(ex).

谢谢

Mac*_*iej 26

用这个:

void Error(object message,Exception t)
Run Code Online (Sandbox Code Playgroud)

原因在log4net文档中void Error(object message):

警告请注意,将Exception传递给此方法将打印Exception的名称,但不会显示堆栈跟踪.要打印堆栈跟踪,请改用void Error(object,Exception)表单.

Error(object message, Exception t) 是最灵活的记录异常数据的方法,因为它作为Exception而不是Object,可以在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);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Llo*_*oyd 14

您需要确保布局模式的定义结构化,以输出您想要的格式和数据.

log4Net模式布局

用于输出日志记录事件的堆栈跟踪堆栈跟踪级别说明符可以包含在大括号之间.例如,%stacktrace {level}.如果没有给出堆栈跟踪级别说明符,则假定为1

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

此模式不适用于Compact Framework程序集.

  • 1 级代表什么?我在文档中没有看到它。 (2认同)

Jam*_*are 12

有两种基本形式,一种是明确地获取对象和异常:

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

并且需要任何对象并执行其中的对象ToString():

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

前者允许您首先在日志条目上附加更有意义的消息,以提供您想要的任何其他详细信息.后者将完成这项工作,但仅使用打印异常详细信息ToString(),这将为您提供:

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