繁体   English   中英

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

[英]How to log stack trace using 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)是记录异常数据的最灵活的方法,因为它作为异常而不是对象,并且可以在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);
        ...
    }
}

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

log4Net模式布局

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

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

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

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

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,则其值不包含在返回的字符串中。

您可以扩展ILog以使用一个方法来记录其堆栈跟踪的异常。

public static void ErrorWithStackTrace(this ILog log, Exception exception)
 {
    log.Error(exception.Message,exception);
   }
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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM