NLog: добавление целей базы данных грамматически (с использованием AddTarget) - PullRequest
0 голосов
/ 25 марта 2019

Используя многопоточный C # с консольным приложением .NET, в настоящее время я использую NLog для входа в файл и базу данных. Я пишу в несколько разных файлов журнала в зависимости от того, какое «хранилище» обрабатывает транзакцию. Я делаю это, добавляя file targets вот так:

        var targetFileName = Path.Combine(Path.GetDirectoryName(fileName),
            string.Format("{0}-{1}{2}", Path.GetFileNameWithoutExtension(fileName), name, Path.GetExtension(fileName)));
        var target =
            new FileTarget
            {
                FileName = targetFileName,
                Layout = @"${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${logger}|${event-properties:item=StoreID}|${message}${exception:format=tostring}"
            };

        //Add async wrapper here
        var asyncWrapper = new AsyncTargetWrapper
        {
            WrappedTarget = target,
            QueueLimit = 20000,
            OverflowAction = AsyncTargetWrapperOverflowAction.Discard
        };
        //Create rule
        var rule = new LoggingRule(name, LogLevel.Trace, asyncWrapper);
        LogManager.Configuration.LoggingRules.Add(rule);
        //Add target
        LogManager.Configuration.AddTarget(name, asyncWrapper);
        //Tell logmanager to reconfigure itself
        LogManager.ReconfigExistingLoggers();

Затем я могу использовать LogManager.GetLogger(name) для извлечения регистратора.

В моем NLog.config я также захожу в базу данных <target name="Database" xsi:type="Database">

Я запускаю свое приложение и закрываю его каждый день. Используя файловые цели, я могу легко создавать файлы каждый день, создавая новый FileTarget.

Есть ли способ сделать то же самое с базой данных? Конечно, его нужно было бы как-то создать с некоторым кодом инициализации ... но я не вижу документации для добавления чего-либо, кроме цели "file".

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

1 Ответ

0 голосов
/ 23 июня 2019

Все в NLog можно настроить из файла конфигурации (nlog.config) и в коде.

Для этого вам понадобится DatabaseTarget (пространство имен NLog.Targets).

Имена свойств совпадают с атрибутами XML, поэтому документация здесь: Цель базы данных .

Маленький пример:

var config = new LoggingConfiguration();
config.AddRuleForAllLevels(new DatabaseTarget()
{
    ConnectionString = "MyConnectionString",
    CommandText = "INSERT .... ", //todo
    Parameters =
    {
        new DatabaseParameterInfo("@message", "${message}"),
        new DatabaseParameterInfo("@error", "${exception}"),
        new DatabaseParameterInfo("@date", "${date}"){ DbType = "DbType.Date"},
    }
});
LogManager.Configuration = config; // Apply config
...