简体   繁体   English

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

[英]How to log stack trace using log4net (C#)

How to log stack trace with log4net ? 如何使用log4net记录堆栈跟踪? I am using .Net version. 我正在使用.Net版本。

They way I have is Log.Error(ex) . 我的方式是Log.Error(ex)

Thanks 谢谢

Use this: 用这个:

void Error(object message,Exception t)

Reason is in log4net documentation for void Error(object message) : 原因在于log4net文档中的void Error(object message)

WARNING Note that passing an Exception to this method will print the name of the Exception but no stack trace. 警告请注意,将Exception传递给此方法将打印Exception的名称,但不会显示堆栈跟踪。 To print a stack trace use the void Error(object,Exception) form instead. 要打印堆栈跟踪,请使用void Error(object,Exception)表单。

Error(object message, Exception t) is the most flexible way to log exception data because it goes as an Exception rather than Object and that can be used in appenders to narrow logs to a particular exception class (rather than by searching for a string which is much slower and less consistent) Error(object message, Exception t)是记录异常数据的最灵活的方法,因为它作为异常而不是对象,并且可以在appender中用于将日志缩小到特定的异常类(而不是通过搜索字符串慢得多,不太一致)

There are special versions of all non-format logging methods that take message and 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);
        ...
    }
}

You need to ensure that the definition of the layout pattern is structured to output what format and data you want. 您需要确保布局模式的定义结构化,以输出您想要的格式和数据。

log4Net Pattern Layout log4Net模式布局

Used to output the stack trace of the logging event The stack trace level specifier may be enclosed between braces. 用于输出日志记录事件的堆栈跟踪堆栈跟踪级别说明符可以包含在大括号之间。 For example, %stacktrace{level}. 例如, %stacktrace {level}。 If no stack trace level specifier is given then 1 is assumed 如果没有给出堆栈跟踪级别说明符,则假定为1

Output uses the format: type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 输出使用格式:type3.MethodCall3> type2.MethodCall2> type1.MethodCall1

This pattern is not available for Compact Framework assemblies. 此模式不适用于Compact Framework程序集。

There are two basic forms, one that takes an object and an exception explicitly: 有两种基本形式,一种是明确地获取对象和异常:

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

And one that takes any object and performs a ToString() on it: 并且可以获取任何对象并对其执行ToString()

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

The former allows you to attach a more meaningful message on the log entry first to give any additional detail you'd like. 前者允许您首先在日志条目上附加更有意义的消息,以提供您想要的任何其他详细信息。 The latter will do the job but only prints the exception details using ToString() , which gives you: 后者将完成这项工作,但只使用ToString()打印异常细节,它为您提供:

The default implementation of ToString obtains the name of the class that threw the current exception, the message, the result of calling ToString on the inner exception, and the result of calling Environment.StackTrace. ToString的默认实现获取抛出当前异常的类的名称,消息,在内部异常上调用ToString的结果,以及调用Environment.StackTrace的结果。 If any of these members is Nothing, its value is not included in the returned string. 如果这些成员中的任何一个为Nothing,则其值不包含在返回的字符串中。

You can extend the ILog to have a method that logs just an exception with his stack trace. 您可以扩展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