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

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
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");
А в итоге он не создает папку для логов и вообще их не пишет. Доступ к папке настроил, что бы файл конфига копировался в выходной каталог, сделал. Один фиг логов не видать. Может кто подсказать в чем может быть проблема?
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
А в итоге он не создает папку для логов и вообще их не пишет. Доступ к папке настроил, что бы файл конфига копировался в выходной каталог, сделал. Один фиг логов не видать. Может кто подсказать в чем может быть проблема?
Чтобы логирование работало, надо чтобы подхватился конфиг. Куда пихнуть конфиг, это уже интересный вопрос.
Поэтому как вариант, настроить конфиг через код. Я так делаю.
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
113
Чтобы логирование работало, надо чтобы подхватился конфиг. Куда пихнуть конфиг, это уже интересный вопрос.
Поэтому как вариант, настроить конфиг через код. Я так делаю.
Попробовал, не помогло, один фиг файл не создается
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
113
Разобрался, в конфиге путь указан вот такой (
fileName="${basedir}/logs/${shortdate}.log") по логике лог должен был писаться в папку где солюшн лежит, а по факту он его писал в папку с установленным зенопостером.

Ну там ад конечно, зенопостер сам использует NLog, в итоге он в мои логи пишет свои логи о работе ЗП
 
Последнее редактирование:
  • Спасибо
Реакции: djaga

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Я 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.

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

Вложения

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
113
Я 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 как то ближе, так что буду по вашему способу пробовать.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
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

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
113
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);
Главное потом не забыть обновить конфиг.))
Сделал как вы посоветовали, заработало. Спасибо
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
  • Спасибо
Реакции: Moadip

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
113
Кому интересно, вот тут полный список атрибутов которые можно отобразить в логе.
94736
 
  • Спасибо
Реакции: Mikhail B.

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 262
Благодарностей
680
Баллы
113
Разобрался
 
Последнее редактирование:

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