目前我有LogWrapper类,它初始化NLog并向它发送信息/调试/警告等。
所以其他类中的每个方法都从
开始LogWrapper.Informational(string.Format(" {0} starts {1}", MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name));
当在LogWrapper:
private static readonly Logger s_log = LogManager.GetCurrentClassLogger();
public static void Informational(string fmt, Exception exception)
{
s_log.Info("{0} {1}",fmt, exception.ToString());
}
问题是,由于调用类不同于访问日志包装器日志总是显示命名空间。LogWrapper的methodname,以便对MethodBase进行无用的调用。
是否有办法从不同的类调用函数实际访问NLog ?
谢谢
如果您主要对使用NLog包装器感兴趣,但仍然能够维护callsite信息,请参阅我对前面问题的回答:
使用包装器时Nlog Callsite错误
简而言之,您可以使用NLog Log方法并传递包装器的类型。然后,如果你使用NLog调用站点LayoutRenderer, NLog将能够计算出调用站点的信息,而不需要你自己计算。
所以,你的LogWrapper可能有这样一个方法:
public static void Informational(string fmt, Exception exception)
{
LogEventInfo le = new LogEventInfo(LogLevel.Info, logger.Name, null, fmt, exception.ToString());
logger.Log(typeof(LogWrapper), le);
}
关键是将包装器的类型(typeof(LogWrapper)
)作为第一个参数传递给Logger.Log
。NLog使用该值向上遍历调用堆栈,直到它看到该类型为当前MethodInfo的DeclaringType。NLog将该堆栈帧作为实际调用之前的最后一个堆栈帧,因此NLog在看到它之后再上升一级。
你应该知道NLog也有一个Exception LayoutRenderer,所以你不必自己使用Exception . tostring()。
虽然Daniel Hilgarth在他的评论中提到的问题有一些有趣的代码,但我认为你应该非常小心地添加一堆代码来确定NLog可以为你"免费"获得的信息。如果您只需要它用于日志记录,我建议让NLog为您解决这个问题。如果你需要其他的目的,那么你可能别无选择,只能自己想办法。
另一方面,我还建议不要使用这种样式进行日志调用:
LogWrapper.Informational(string.Format(" {0} starts {1}",
MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name));
如果您的LogWrapper。信息方法向下委托给NLog的Logger。Info,那么在日志记录未打开或日志记录级别小于Info(例如警告,错误,致命)的情况下,您需要做一些额外的工作。如果由于当前的日志级别设置,语句实际上不会被记录,那么您仍然在格式化字符串,并且您正在进行两次相对昂贵的调用来获取callsite信息。