编辑:虽然类似,但这与使用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)