NLog: генерировать конфигурации во время выполнения из шаблона - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь генерировать цели и регистратор во время выполнения, основываясь на другой цели.Давайте предположим, что у меня есть регистратор функций Foo: я бы хотел сгенерировать отдельные правила для Foo.1, Foo.2 и т. Д. И т. Д., Но я не знаю, каким будет последний регистратор, который мне придется создать(таким образом, я не могу определить их декларативно).

До сих пор я делал что-то вроде этого:

public GetNewClonedLogger(int fooId)
{
    var config = NLog.LogManager.Configuration;
    var newFooName = $"Foo.{fooId}";
    FileTarget baseTarget = NLog.LogManager.Configuration.FindTargetByName<FileTarget>("Foo");

    // Copy the base target
    var newTarget = new FileTarget(newFooName)
    {
        Layout = baseTarget.Layout,
        CreateDirs = true,
        FileName = baseTarget .FileName.ToString().Replace("${var:filename}", newFooName),
        ArchiveAboveSize = baseTarget.ArchiveAboveSize,
        BufferSize = baseTarget.BufferSize,
        ArchiveFileName = baseTarget.ArchiveFileName,
        MaxArchiveFiles = baseTarget.MaxArchiveFiles,
        ArchiveDateFormat = baseTarget.ArchiveDateFormat,
        ArchiveEvery = baseTarget.ArchiveEvery,
        FileAttributes = baseTarget.FileAttributes,
        KeepFileOpen = baseTarget.KeepFileOpen,
        ArchiveNumbering = baseTarget.ArchiveNumbering,
    };

    // Add configs & flush
    NLog.LogManager.Configuration.AddTarget(newTarget);
    NLog.LogManager.Configuration.AddRuleForAllLevels(newTarget, newFooName);

    // I tried every combinations of the following, without success
    NLog.LogManager.ReconfigExistingLoggers();
    NLog.LogManager.Configuration = config;
    NLog.LogManager.Configuration.Reload();

    NLog.LogManager.GetLogger(newFooName);
}

Эта функция возвращает регистратор, который кажется нормальным в каждой точке:имя цели в порядке, имя файла в порядке, NLog.LogManager.Configuration имеет новое правило с правильным именем (Foo.1, Foo.2, ...), как и AllTargets.Но когда я регистрируюсь, используя возвращенный регистратор, файл не создается, и это точно, как будто ничего не произошло вообще ...

Я пробовал решение, предложенное в этой теме ,без успеха .... Чего мне не хватает?

Спасибо за помощь!

1 Ответ

0 голосов
/ 11 октября 2018

На самом деле, это была действительно глупая ошибка, так как это может сработать, как я и ожидал.Проблема заключалась в том, что baseTarget.FileName - это объект Layout, а при строковом кодировании с использованием .ToString() произошли плохие преобразования, добавив к выводу кавычки ('C:\...').Таким образом, NLog выдавал ошибки, которые были частично заглушены конфигом NLog и довольно трудно понять в любом случае.Я исправил это, проверив, является ли baseTarget.FileName SimpleLayout (единственный класс, который мне пришлось обработать в моем случае), а затем извлек OriginalText из этого макета.Затем это сработало как шарм.

...