如何使用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);
}