Пользовательский NLog LayoutRenderer с конструктором, использующим внедрение зависимостейC#

Место общения программистов C#
Ответить
Anonymous
 Пользовательский NLog LayoutRenderer с конструктором, использующим внедрение зависимостей

Сообщение Anonymous »

Я пытаюсь написать собственный 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»