【发布时间】:2017-03-10 06:40:44
【问题描述】:
我正在尝试编写一个自定义 LayoutRenderer 来记录从对象读取的数据,但 NLog 似乎无法与依赖注入一起正常工作。
这是我的 CustomLayoutRenderer:
[LayoutRenderer("custom-value")]
public class CustomLayoutRenderer : LayoutRenderer
{
private readonly RequestContext _context;
public CustomLayoutRenderer(RequestContext context)
{
_context = context;
}
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append(_context.CustomValue);
}
}
它正在使用这个 RequestContext 对象:
public class RequestContext
{
public string CustomValue { get; set; } = "Valid custom value";
}
我也在连接 DI,配置 NLog 并在 Startup.cs 中注册我的 LayoutRenderer:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped<RequestContext>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
LayoutRenderer.Register<CustomLayoutRenderer>("custom-value");
loggerFactory.AddNLog();
app.AddNLogWeb();
env.ConfigureNLog("nlog.config");
// ...
}
然后我尝试在 nlog.config 中使用我的 ${custom-value},但在调用 AddNLog() 时遇到错误:
2017-02-03 13:08:08.0284 从 [project-folder]\bin\Debug\net452\win7-x64\NLog.config 解析配置失败。 异常:NLog.NLogConfigurationException:解析 [项目文件夹]\bin\Debug\net452\win7-x64\NLog.config 时出现异常。 NLog.NLogConfigurationException:无法访问类型的构造函数:ATest.CustomLayoutRenderer。是否授予了所需的权限? 在 NLog.Internal.FactoryHelper.CreateInstance(类型 t) ...
注意事项
我尝试这样做的原因是我想记录一些只能从控制器访问的信息(如 TraceIdentifier、部分 URL 和一些特定于请求的自定义内容)。 RequestContext 中的值将由控制器在收到请求时设置。
以下渲染器按预期工作,这让我认为这是一个依赖注入问题:
[LayoutRenderer("custom-value")]
public class CustomLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append("Hello, World!");
}
}
我确实看到了这个NLog bug,但它现在被标记为已修复,这就是我在这里而不是那里发帖的原因。
为了完整起见,这是我在project.json 中添加的内容:
"dependencies": {
...
"NLog.Extensions.Logging": "1.0.0-*",
"NLog.Web.AspNetCore": "4.3.0"
},
【问题讨论】:
标签: c# asp.net-core nlog