NLog可以通过c#扩展方法保存呼叫站点信息吗?

bj0*_*bj0 0 c# nlog

编辑:虽然类似,但这与使用NLog包装器的问题不同.扩展方法增加了另一个间接级别,这使得即使是正确的包装器也会报告错误的调用点

我目前在NLog周围使用了一个日志包装器,我使用他们在源代码中显示的技巧来获取准确的调用点信息.对于我开始的新项目,我想创建一个更简单的类,所以我只是实现了类似下面的接口:

public interface ILogger
{
    void Log( LogEntry entry );
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个扩展方法类,如:

public static class LoggerExtensions
{
    public static void Debug( this ILogger logger, string format, params object[] args)
    {
        logger.Log( new LogEntry( LogLevel.Debug, format, args ) );
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是NLog然后将调用点显示为扩展方法而不是扩展方法的调用者.我做了一些搜索,但找不到有关NLog和扩展方法的任何信息.

在这种情况下是否可以修复呼叫站点信息?或者是在接口本身中包含Debug,Info等功能的唯一方法?

小智 8

迟到了,但是我对这个解决方案有问题,因为我使用了包装器的扩展方法.通过将程序集传递给LogManager,我能够让NLog忽略我的扩展类.

    /// <summary>
    /// Bootstrap the wrapper class
    /// </summary>
    static Logger()
    {
        LogManager.AddHiddenAssembly(typeof(LoggingExtensions).Assembly);
    }
Run Code Online (Sandbox Code Playgroud)

除了以外的文档没有太多细节

添加给定的程序集,当NLog尝试在堆栈跟踪上查找调用方法时将跳过该程序集.

来自NLog文档

通过这种设置,我甚至设法使用SimpleInjector获得扩展方法+ DI.

为了说明您使用此方法仍然可以在同一个程序集中拥有一个调用点

我的Logger()与SettingsHelper()一起存在于Utilities项目中我使用SettingsHelper的输出设置了一个测试:

2015-08-18 20:44:07.5352 | vstest.executionengine.x86 | 调试| Utilities.Settings.SettingsHelper | 来自与Logger()|相同的程序集的测试 ActionTests.LoggingTest + LogTest.RunLogTest

粗体位是$ {callsite}

我的SettingsHelper()测试:

ILogger logger = new Logger(typeof(SettingsHelper));
logger.Debug("A test from the same assembly as Logger()");
Run Code Online (Sandbox Code Playgroud)

不要忘记使用LogEventInfo()的重载

_logger.Log(typeof(Logger), logEvent);
Run Code Online (Sandbox Code Playgroud)