Я пытаюсь написать собственный 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 и регистрирую свой LayoutRenderer в Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
LayoutRenderer.Register("custom-value");
loggerFactory.AddNLog();
app.AddNLogWeb();
env.ConfigureNLog("nlog.config");
// ...
}
Затем я пытаюсь использовать свой ${custom-value в nlog.config, но получаю ошибку в AddNLog()
code> вызов:
2017-02-03 13:08:08.0284 Ошибка анализа конфигурации из [папка-проекта]\bin\Debug\ Ошибка net452\win7-x64\NLog.config.
Исключение: NLog.NLogConfigurationException: Исключение при анализе [папки проекта]\bin\Debug\net452\win7-x64\NLog.config.
NLog. NLogConfigurationException: невозможно получить доступ к конструктору типа: ATest.CustomLayoutRenderer. Предоставлено ли необходимое разрешение?
в NLog.Internal.FactoryHelper.CreateInstance(Type t)
...
< h2>Примечания
Причина, по которой я пытаюсь это сделать, заключается в том, что я хотел бы регистрировать некоторую информацию, доступную только с контроллера (например, TraceIdentifier, части URL-адреса и некоторые пользовательские вещи, специфичные для конкретного запроса). Значения в RequestContext будут установлены контроллером при получении запроса.
Следующий рендерер работает должным образом, что заставляет меня думать, что это проблема внедрения зависимостей:< /p>
[LayoutRenderer("custom-value")]
public class CustomLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append("Hello, World!");
}
}
Я видел эту ошибку NLog, но сейчас она помечена как исправленная, поэтому я пишу здесь, а не там.
И для полноты картины, вот что я добавил в свой project.json:
"dependencies": {
...
"NLog.Extensions.Logging": "1.0.0-*",
"NLog.Web.AspNetCore": "4.3.0"
},
Подробнее здесь: https://stackoverflow.com/questions/420 ... -injection