Как использовать NLog для DLL - PullRequest
14 голосов
/ 11 марта 2011

Я пытаюсь реализовать простой журнал, используя Nlog Refresh 1.0 для проекта библиотеки классов. Кажется, что nlog не создает файл журнала, когда он создается из библиотеки DLL.

Есть ли другой способ обойти это?

мой конфигурационный файл выглядит так:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="true">

    <targets>
      <target name="file" xsi:type="File" fileName="${basedir}/nlog.txt" />
        <target name="console" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="file" />
        <logger name="*" minlevel="Info" writeTo="console" />
    </rules>

</nlog>

Я знаю, что в этом конфиге нет ничего плохого, потому что он работает из exe-проекта.

Edit: просто для ясности: У меня нет доступа к вызывающей программе, которая использует мою DLL в качестве плагина. Вызывающая программа на самом деле является outlook, которая использует мою DLL в качестве плагина. Я хотел бы вести журнал, который имеет отношение только к моей DLL и не имеет ничего общего с самим внешним видом.

Ответы [ 3 ]

32 голосов
/ 11 марта 2011

Вы должны добавить nlog.config в расположение exe-файла, который использует dll!

Редактировать: вам не нужно изменять exe-файл, просто поместите nlog.config в тот же файлкаталог, если это не вариант, я думаю, вам придется настроить его из кода https://github.com/nlog/NLog/wiki/Configuration-API

7 голосов
/ 30 мая 2016

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; 
}
2 голосов
/ 11 марта 2011

Вы должны поместить часть файла конфигурации, как указано выше, в web.config для веб-приложений или в app.config для Windows-приложений. Это не выполняется автоматически, и если в вашей библиотеке классов есть файл app.config, он все равно не используется, когда библиотека классов вызывается другим приложением.

...