Логирование с помощью Nlog

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 668
Реакции
962
Баллы
113
Доброго времени суток. Пытаюсь прикрутить к проекту систему логирования, для этого решил использовать библиотечку Nlog, вроде как по уму все настроил,
создал файл config, туда все прописал.

XML:
Развернуть Свернуть Копировать
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
         <target xsi:type="File" name="filedata" fileName="${basedir}/logs/${shortdate}.log"
                  layout="${longdate} ${uppercase:${level}} ${message}" />
    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="filedata" />
    </rules>
</nlog>

Выполняю тестовый код.

C#:
Развернуть Свернуть Копировать
Logger logger = LogManager.GetCurrentClassLogger();
            logger.Trace("Trace");
            logger.Info("Info");
            logger.Debug("Debug");
            logger.Warn("Warn");
            logger.Error("Error");
А в итоге он не создает папку для логов и вообще их не пишет. Доступ к папке настроил, что бы файл конфига копировался в выходной каталог, сделал. Один фиг логов не видать. Может кто подсказать в чем может быть проблема?
 
А в итоге он не создает папку для логов и вообще их не пишет. Доступ к папке настроил, что бы файл конфига копировался в выходной каталог, сделал. Один фиг логов не видать. Может кто подсказать в чем может быть проблема?
Чтобы логирование работало, надо чтобы подхватился конфиг. Куда пихнуть конфиг, это уже интересный вопрос.
Поэтому как вариант, настроить конфиг через код. Я так делаю.
 
Чтобы логирование работало, надо чтобы подхватился конфиг. Куда пихнуть конфиг, это уже интересный вопрос.
Поэтому как вариант, настроить конфиг через код. Я так делаю.
Попробовал, не помогло, один фиг файл не создается
 
Разобрался, в конфиге путь указан вот такой (
fileName="${basedir}/logs/${shortdate}.log") по логике лог должен был писаться в папку где солюшн лежит, а по факту он его писал в папку с установленным зенопостером.

Ну там ад конечно, зенопостер сам использует NLog, в итоге он в мои логи пишет свои логи о работе ЗП
 
Последнее редактирование:
  • Спасибо
Реакции: djaga
Я NLog юзаю для своих прог, в зенке не пробовал.
Оказывается зенка сама юзает NLog, как то даже не заострял на этом внимание.

94720


Поэтому получается что свои правила логирования по сути будут добавляются в конфиг, который уже загружает зенка/мейкер.
В общем поковырялся из интереса.))
Dll добавляем из папки зенки, а не свою, чтобы не было конфликта версий.

C#:
Развернуть Свернуть Копировать
var name = "имя логгера";
var path = project.Directory;
project.Variables["loggerName"].Value = name;


if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

if (LogManager.Configuration.FindRuleByName(name) != null || LogManager.Configuration.FindTargetByName(name) != null) return "";

var target = new FileTarget();
target.Layout = "${longdate} | ${logger} | ${level} | ${message}";
target.FileName = $"{path}/{name}.txt";
target.KeepFileOpen = false;
target.Encoding = Encoding.UTF8;
target.Name = name;

var rule = new LoggingRule(name)
{
    DefaultFilterResult = FilterResult.Ignore
};

rule.Filters.Add(new ConditionBasedFilter()
{
    Condition = "'${logger}' == '" + name + "'",
    Action = FilterResult.Log
});

LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Fatal, target, name);
LogManager.ReconfigExistingLoggers();
Что делается, создается цель - куда будет идти инфа, а также правила фильтрации, ну чтобы все не валило в одну кучу. Это делаем где то в начале шаба.


C#:
Развернуть Свернуть Копировать
var logger = LogManager.GetLogger(project.Variables["loggerName"].Value);
logger.Info("Info");
logger.Debug("Debug");
logger.Error("Error");
Это уже вызываем где надо. Логи будут рядом с шабом.


94721


Вот тут если поставить бряк, то внутрь не зайдет. Те о чем и писал выше, конфиг уже подгружен, нам надо только добавить свои правила и "обновить" все это дело.
Для этого же потом идут проверки на цель и правило, чтобы по несколько раз не пихалось, к примеру если запустить шаб в многопоток. Ну и естественно если запускать создание логгера в многопоточном шабе, то это место надо обернуть в lock.

И под конец, зачем все эти пляски с бубном.
В качестве цели может выступать не только файл, а много других интересных штук.)) При желании даже можно свое сделать. Какие есть цели, можно глянуть на их сайте.
 

Вложения

Я NLog юзаю для своих прог, в зенке не пробовал.
Оказывается зенка сама юзает NLog, как то даже не заострял на этом внимание.

Посмотреть вложение 94720

Поэтому получается что свои правила логирования по сути будут добавляются в конфиг, который уже загружает зенка/мейкер.
В общем поковырялся из интереса.))
Dll добавляем из папки зенки, а не свою, чтобы не было конфликта версий.

C#:
Развернуть Свернуть Копировать
var name = "имя логгера";
var path = project.Directory;
project.Variables["loggerName"].Value = name;


if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

if (LogManager.Configuration.FindRuleByName(name) != null || LogManager.Configuration.FindTargetByName(name) != null) return "";

var target = new FileTarget();
target.Layout = "${longdate} | ${logger} | ${level} | ${message}";
target.FileName = $"{path}/{name}.txt";
target.KeepFileOpen = false;
target.Encoding = Encoding.UTF8;
target.Name = name;

var rule = new LoggingRule(name)
{
    DefaultFilterResult = FilterResult.Ignore
};

rule.Filters.Add(new ConditionBasedFilter()
{
    Condition = "'${logger}' == '" + name + "'",
    Action = FilterResult.Log
});

LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Fatal, target, name);
LogManager.ReconfigExistingLoggers();
Что делается, создается цель - куда будет идти инфа, а также правила фильтрации, ну чтобы все не валило в одну кучу. Это делаем где то в начале шаба.


C#:
Развернуть Свернуть Копировать
var logger = LogManager.GetLogger(project.Variables["loggerName"].Value);
logger.Info("Info");
logger.Debug("Debug");
logger.Error("Error");
Это уже вызываем где надо. Логи будут рядом с шабом.


Посмотреть вложение 94721

Вот тут если поставить бряк, то внутрь не зайдет. Те о чем и писал выше, конфиг уже подгружен, нам надо только добавить свои правила и "обновить" все это дело.
Для этого же потом идут проверки на цель и правило, чтобы по несколько раз не пихалось, к примеру если запустить шаб в многопоток. Ну и естественно если запускать создание логгера в многопоточном шабе, то это место надо обернуть в lock.

И под конец, зачем все эти пляски с бубном.
В качестве цели может выступать не только файл, а много других интересных штук.)) При желании даже можно свое сделать. Какие есть цели, можно глянуть на их сайте.
Спасибо, буду пробовать) Вообще думал просто другую библиотеку использовать, но nlog как то ближе, так что буду по вашему способу пробовать.
 
C#:
Развернуть Свернуть Копировать
var rule = new LoggingRule(name)
{
    DefaultFilterResult = FilterResult.Ignore
};

rule.Filters.Add(new ConditionBasedFilter()
{
    Condition = "'${logger}' == '" + name + "'",
    Action = FilterResult.Log
});

Вот эту часть можно выкинуть, она не используется, работает без нее. Перемудрил.))
Тк тот код который я юзаю в своих прогах, он не работает в зенке, хз почему. Поэтому добавление правил пробовал делать по разному.
Можно так LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Info, target, name);
Или так LogManager.Configuration.LoggingRules.Add(rule);
Главное потом не забыть обновить конфиг.))
 
  • Спасибо
Реакции: Sherminator и djaga
C#:
Развернуть Свернуть Копировать
var rule = new LoggingRule(name)
{
    DefaultFilterResult = FilterResult.Ignore
};

rule.Filters.Add(new ConditionBasedFilter()
{
    Condition = "'${logger}' == '" + name + "'",
    Action = FilterResult.Log
});

Вот эту часть можно выкинуть, она не используется, работает без нее. Перемудрил.))
Тк тот код который я юзаю в своих прогах, он не работает в зенке, хз почему. Поэтому добавление правил пробовал делать по разному.
Можно так LogManager.Configuration.AddRule(LogLevel.Trace, LogLevel.Info, target, name);
Или так LogManager.Configuration.LoggingRules.Add(rule);
Главное потом не забыть обновить конфиг.))
Сделал как вы посоветовали, заработало. Спасибо
 
Разобрался
 
Последнее редактирование:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)