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

如何使用log4net(C#)记录堆栈跟踪,c#,log4net,C#,Log4net,如何使用log4net记录堆栈跟踪?我正在使用.Net版本 我的方法是Log.Error(ex) 谢谢,有两种基本形式,一种是显式接受对象,另一种是显式接受异常: catch(Exception ex) { // the form that takes two args has an exception as second, prints trace... _log.Error("My custom message", ex); } 以及一个获取任何对象并对其执行ToStrin

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

我的方法是
Log.Error(ex)


谢谢,有两种基本形式,一种是显式接受对象,另一种是显式接受异常:

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打开内部异常,以及调用 环境跟踪。如果这些成员中的任何一个为空,则其值为空 不包括在返回的字符串中


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

用于输出日志事件的堆栈跟踪。堆栈跟踪级别说明符可以用大括号括起来。例如,%stacktrace{level}。如果没有给出堆栈跟踪级别说明符,则假定为1

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

此模式不适用于紧凑型框架组件。

使用此模式:

void Error(object message,Exception t)
原因在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);
        ...
    }
}

您可以扩展ILog,使其具有一个方法,该方法只记录一个异常及其堆栈跟踪

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

您是否对Log.Error(ex)的输出有特殊问题?级别1表示什么?我在文档中没有看到它。虽然这段代码可以回答这个问题,但是提供关于为什么和/或如何回答这个问题的额外上下文可以提高其长期价值。为什么不使用已经支持这个问题的现有ILog实现呢?
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);
}