NLog будет искать файл конфигурации из exe-файла, который включает вашу DLL.Поэтому вам нужно будет копировать файл конфигурации для NLog каждый раз, когда вы хотите использовать свою DLL.
Теоретически это правильный шаблон проектирования, поскольку многие сторонние приложения могут использовать вашу DLL по-разному и хотели быцентрализованно журналы вашей DLL с их журналами.
В моем случае (и, возможно, у вас) мы хотели на 100% убедиться, что журналы DLL сохранены с использованием нашего собственного файла конфигурации, чтобы убедиться, что всеФатальные ошибки сообщаются нашему SqlServer и т. д. Следовательно, мы не хотим, чтобы стороннее приложение устанавливало свою собственную логику ведения журнала.
У нас была та же проблема, когда NLog (или Log4Net) не мог найти файл конфигурациитаким образом, никакие действия регистрации не были начаты, и никакие сообщения об исключениях / ошибках не были напечатаны из NLog или Log4Net.
Единственная альтернатива - настроить NLog (или Log4Net) в вашей DLL с использованием кода.NLog предоставляет вам API конфигурации, чтобы вы могли отказаться от файлов конфигурации.См. API конфигурации NLog
В моем случае в моей DLL есть статический класс с именем «Utils», который вызывается из любого стороннего класса, использующего мою DLL (например, они делаютUtils.doSomething()
).Поэтому я настраиваю NLog в статическом конструкторе:
static Utils() // static constructor
{
// Step 1. Create configuration object
var config = new LoggingConfiguration();
// Step 2. Create targets and add them to the configuration
var consoleTarget = new ColoredConsoleTarget();
config.AddTarget("console", consoleTarget);
var fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
// Step 3. Set target properties
consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}";
fileTarget.FileName = @"C:\global-logs\logs.txt";
fileTarget.Layout = "${message}";
// Step 4. Define rules
var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget);
config.LoggingRules.Add(rule1);
var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule2);
// Step 5. Activate the configuration
LogManager.Configuration = config;
}