Как да използвате 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 като плъгин. Извикващата програма всъщност е outlook, която използва моя dll като плъгин. Бих искал да поддържам регистър, който е подходящ само за моя dll и няма нищо общо със самия Outlook.


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


Отговори (3)


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

Редактиране: Не е нужно да променяте exe файла, просто поставете 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 ще търси конфигурационен файл от 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 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