Подтвердить что ты не робот

Как использовать 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>

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

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

4b9b3361

Ответ 1

вам нужно добавить nlog.config в местоположение файла exe, использующего dll!

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

Ответ 2

NLog будет искать файл конфигурации из exe, который включает вашу 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 void 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; 
}

Ответ 3

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