#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