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

时间:2012-02-16 22:05:54

标签: c# log4net

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

我的方式是Log.Error(ex)

由于

5 个答案:

答案 0 :(得分:24)

使用此:

void Error(object message,Exception t)

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

  

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

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

答案 1 :(得分:14)

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

log4Net Pattern Layout

  

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

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

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

答案 2 :(得分:12)

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

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,那么它的价值   不包含在返回的字符串中。

答案 3 :(得分:0)

您可以扩展ILog,使其具有仅使用其堆栈跟踪记录异常的方法。

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

答案 4 :(得分:0)

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);
}