Используя NLog, как я могу заставить свои модули регистрироваться в их собственном уникальном файле журнала - PullRequest
1 голос
/ 11 апреля 2019

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

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

<variable name="module" value="Service"/>

<targets>
   <target name="logFile" xsi:type="File" fileName="${basedir}Logs/${var:module}.txt"
            layout="${time} ${uppercase:${level}} ${var:module} ${logger} ${message}" />
</targets>

Затем я сохраняю LoggingConfiguration, чтобы каждый раз при загрузке модуля я создавал новую LogFactory на основе конфигурации, изменял значение настраиваемой переменной и вставлял его как зависимость от модуля, чтобы он мог использовать для создания егособственные регистраторы.

Проблема, с которой я постоянно сталкиваюсь, даже когда я пишу сложный метод для попытки клонировать конфигурацию LoggingConfiguration, всегда приводит ко всему, включая сервис, ведение журнала со спецификациями последнего созданного LogFactory.

I fугрожал, что я что-то упустил и мог бы действительно использовать некоторую помощь, либо выяснить, как я могу заставить это решение работать, либо любые предложения для лучшего понимания того, как я мог бы достичь той же цели уникального файла журнала для модуля.

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Вы также можете предоставить общий интерфейс для всех модулей. Этот интерфейс также включает в себя возможность получения пользовательского объекта Logger, который упаковывает NLog Logger.

Затем пользовательский объект Logger вводит имя модуля в LogEventInfo.Properties. Может быть извлечено из:

System.Reflection.Assembly.GetCallingAssembly().Name

Тогда вы можете использовать ${event-properties:item=ModuleName} в имени файла.

См. Также https://github.com/NLog/NLog/wiki/EventProperties-Layout-Renderer

1 голос
/ 11 апреля 2019

Вы пытались использовать имя логгера?

<targets>
   <target name="ModulesTarget" xsi:type="File" fileName="${basedir}Logs/${logger:shortname=true}.txt" />
</targets>
<rules>
   <logger name="Modules.*" target="ModulesTarget"/>
</rules>

Затем создайте логгер модуля следующим образом:

var moduleLogger = NLog.LogManager.GetLogger("Modules.MyModuleName");
0 голосов
/ 12 апреля 2019

Вы также можете создать изолированный LogFactory для каждого модуля:

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

...