Как использовать NLog в плагине

#c# #.net #logging #nlog

#c# #.net #ведение журнала #nlog

Вопрос:

Я хотел бы использовать NLog в плагине и использовать configuration API для его настройки. Однако, поскольку LogManager статичен, как я могу это сделать, не мешая другим плагинам, которые делают то же самое?

Примеры использования конфигурационного API, которые я вижу, предполагают замену LogManager.Полная настройка. Я мог бы попробовать изменить любую существующую конфигурацию, но я не уверен, что это будет потокобезопасно.

Комментарии:

1. Вы хотите настроить ведение журнала с помощью плагина? Я бы подумал, что это будет зависеть от основного приложения.

2. @Inuyasha В этом случае я хочу, чтобы каждый плагин настраивал ведение журнала отдельно. Вы также можете представить основное приложение, над которым у вас нет контроля, которое не предоставляет службу ведения журнала, но вы не хотите вмешиваться в другие плагины, использующие NLog.

Ответ №1:

Вы пробовали что-то подобное:

 // This could got into a static constructor somewhere in the plugin to make sure it happens early
LoggingConfiguration config = LogManager.Configuration;
ColoredConsoleTarget consoleTarget = new ColoredConsoleTarget();
config.AddTarget("myplugin", consoleTarget);
LoggingRule rule = new LoggingRule("myplugin", LogLevel.Debug, consoleTarget);
config.LoggingRules.Add(rule);

// Whenever my plugin creates a logger it'll obtain it like this
var log = LogManager.GetLogger("myplugin");
log.Error("Some message.");
  

Ответ №2:

NLog на самом деле имеет нестатический режим, который удобен для плагинов и параллельного выполнения модульных тестов.

LogManager — это интерфейс, основанный на глобальной LogFactory. Но вы можете создать свой собственный локальный LogFactory для настройки вашей локальной конфигурации. Он будет выполняться параллельно с глобальным LogFactory.

 // This could got into a static constructor somewhere in the plugin to make sure it happens early
LogFactory logFactory = new LogFactory();
LoggingConfiguration config = new LoggingConfiguration();
ColoredConsoleTarget consoleTarget = new ColoredConsoleTarget();
config.AddTarget("mypluginconsole", consoleTarget);
config.AddRuleForAllLevels(consoleTarget, "myplugin")
logFactory.Configuration = config;

// Whenever my plugin creates a logger it'll obtain it like this
var log = logFactory.GetLogger("myplugin");
log.Error("Some message.");
  

https://github.com/NLog/NLog/wiki/Configure-component-logging