【问题标题】:NLog namespace.name from other classNLog namespace.name 来自其他类
【发布时间】:2013-05-06 22:12:58
【问题描述】:

目前我有 LogWrapper 类,它初始化 NLog 并向其发送 Info/Debug/Warning 等。

所以其他类中的每个方法都是从

开始的
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 的 namespace.methodname,因此对 MethodBase 进行了无用的调用。

有什么方法可以从实际访问 NLog 的不同类中调用函数?

谢谢

【问题讨论】:

标签: c# .net nlog


【解决方案1】:

如果您主要对使用 NLog 包装器感兴趣,但仍然能够维护呼叫站点信息,请在此处查看我对先前问题的回答:

Nlog Callsite is wrong when wrapper is used

简而言之,您可以使用 NLog Log 方法并传递包装器的类型。然后,如果您使用 NLog callsite 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.Informational 方法委托给 NLog 的 Logger.Info,那么在未打开日志记录或日志记录级别低于 Info(例如,警告、错误、致命)的情况下,您正在做一些额外的工作.如果由于当前的日志记录级别设置,该语句实际上不会被记录,那么您仍在格式化字符串并且您正在进行两次相对昂贵的调用来获取调用点信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多