Как использовать NLog для DLL

Я пытаюсь реализовать простой журнал, используя 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>

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

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


person Oysio    schedule 11.03.2011    source источник


Ответы (3)


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

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

person Peter    schedule 11.03.2011
comment
Я отредактировал свой вопрос, у меня нет доступа к exe, который вызывает мою dll, я бы предпочел настроить nlog из моей dll. - person Oysio; 11.03.2011
comment
Это следует пометить как ответ, поскольку @Petoj точно указал на использование API конфигурации в качестве решения. Мой плюс! - person Sudhanshu Mishra; 16.10.2012

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

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

В моем случае (и, возможно, в вашем) мы хотели убедиться на 100%, что журналы DLL сохраняются с использованием нашего собственного файла конфигурации, чтобы убедиться, что обо всех фатальных ошибках сообщается на наш SqlServer и т. д. Следовательно, мы не хотим стороннее приложение для установки собственной логики ведения журнала.

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

Единственная альтернатива — настроить NLog (или Log4Net) в вашей DLL с помощью кода. NLog предоставляет вам API конфигурации, чтобы вы могли отказаться от файлов конфигурации. См. API конфигурации NLog.

В моем случае у меня есть статический класс под названием «Utils» в моей DLL, который вызывается из любого стороннего класса, который использует мою 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; 
}
person TheWalkingPanda    schedule 30.05.2016
comment
Можете ли вы объяснить немного больше? - person Dieter Meemken; 30.05.2016
comment
Отредактировано. Вам это помогает? - person TheWalkingPanda; 30.05.2016

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

person Davide Piras    schedule 11.03.2011
comment
nlog поддерживает nlog.config как автономный, поэтому вам не нужно добавлять его в web.config/app.config. - person Peter; 11.03.2011