NLog命名空间.name来自其他类



目前我有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信息。

最新更新