powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / NLog. Есть вопросы.
10 сообщений из 10, страница 1 из 1
NLog. Есть вопросы.
    #38526300
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет !

Мне нужно реализовать относительно усложненный алгоритм логера. Решил изучить и начать наконец применять в программах известные марки.

Остановился на NLog. В процессе гугления решил что он лучше log4net.
Если вы считаете, что log4net лучше - сообщите о его уникальных достоинствах пожалуйста :)


Вот такой алгоритм хотелось бы сделать.

1. Нужно уметь логироватся в DB и в простой файл.
Лог в ДБ - тут все ясно. Лог в файл тоже крайне часто используется - для отладки на месте, или решено, что здесь программе вообще БД не нужна.
Думаю лог будет либо туда, либо туда. Вряд ли в оба места сразу. Хотя может во время каких то отладок на месте кто то пожелает включить оба лога - так, что лучше сразу отладить оба варианта параллельно.

PS. С этим пунктом, как я понимаю, сложностей нет - создавай несколько Таржетов и вперед.

2. Если во время лога в БД происходит ошибка, то нужно записать в лог-файл. Даже если он отключен. Чтобы не потерять ошибку.
Причем хотелось бы не просто записать то, что хотели залогировать, но и сам факт того, что лог в DB не удался. Иначе потом по логу будет видна ошибка, но не будет видно что она не попала в БД.

Примерно так:

"
ДатаВремя.
Ошибка: неконтролируемое расплавление реактора началось."
"
"
ДатаВремя.
Текст ошибки при записи в БД: 'Нет связи с БД'
Пытались записать: <Уровень:Ошибка. Неконтролируемое расплавление реактора началось>
"

Я нашел какой-то FallbackGroup-target
https://github.com/nlog/NLog/wiki/FallbackGroup-target
Возможно это то, что нужно,но, паршиво документировано это.


Еще вопрос.
В программе крутится 2 потока.
Если я каждому потоку создам свой инстанс логера, но чтобы они записывали ошибки в один файл - будет работать ? Я хочу, чтобы их сообщения в лог попадали с уникальными именами. Чтобы понять, кто из потоков сглючил и нагадил в лог-файл.
Насколько я понял по документации, логгер потоко-защищенный. Надеюсь, что это означает что он сам себе файл не заблочит, и не получится, что в середину сообщения в файле вписалось другое сообщение ("aaaaaaaabbbbbbbbaaaaaaa").
Или
Нужно,использовать один инстанс на файл, но так, чтобы он делал уникальные пометки от разных потоков. Как ?
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38526315
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF Падаван,

по поводу потоков: можно указывать в паттерне логирования номер потока. Будет что-то типа MyClass ThreadID:111 ....
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38526975
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivanWPF Падаван,

по поводу потоков: можно указывать в паттерне логирования номер потока. Будет что-то типа MyClass ThreadID:111 ....

Это с одним инстансом логера или с двумя?
По идее, один не сможет, как я понял ему при инициализации задается какое то уникальное имя (как я понимаю то самое "MyClass ThreadID"). И можно сохранять уже сообщения по паттерну.

А с двумя у меня все еще сомнения в логе в один файл - сложно протестировать, сложно создать такую тестовую ситуацию: одновременной записи в один файл, все равно могут разойтись на микросекунды и тест провалится. Тут нужно только знать :)
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38527276
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как сделать, чтобы можно было залогировать 2 сообщения:

"
ДатаВремя.
Текст ошибки при записи в БД: 'Нет связи с БД' (раз)
Пытались записать: <Уровень:Ошибка. Неконтролируемое расплавление реактора началось> (два)
"
Или это все нужно тупо формировать вручную при формировании сообщения? Я все же думаю, придется - логгер оперирует лишь константой ""${message}".


Думаю над предустановленным "LayoutWithHeaderAndFooter" - но не могу его настроить.
PS. Мне нужно настраивать программно.
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38527382
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF Падаван,

а как он должен понимать, где надо ставить \r\n? Конечно message сами форматируете)
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38527407
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivanWPF Падаван,

а как он должен понимать, где надо ставить \r\n? Конечно message сами форматируете)

NLog очень наворочен Чувствую я еще долго буду постигать его возможности. Чего только стоит такой наворот:
http://nlog-project.org/2011/04/20/exception-logging-enhancements.html

В принципе получилось сделать логирование с двумя (и сколько угодно в принципе) частями.
Хотя я наверное все очень криво написал - помогите улучшить, у Вас гораздо больше опыта с ним вроде бы :)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
private static NLog.Logger logger;

        public static void InitLogger()
        {
            logger = LogManager.GetLogger("DeviceManager");

            LoggingConfiguration config = new LoggingConfiguration();

            FileTarget fileTarget1 = new FileTarget();            
            config.AddTarget("file", fileTarget1);

            fileTarget1.ConcurrentWrites = true;
            fileTarget1.FileName = @"${basedir}\ServerLog\${level}.log";
            fileTarget1.Layout = "${longdate} | ${callsite} | ${level}"+ Environment.NewLine + "${message}" + Environment.NewLine + "${event-context:item=MySubMessage1}";                

            LoggingRule rule2 = new LoggingRule("*", LogLevel.Fatal, fileTarget1);
            config.LoggingRules.Add(rule2);

            LogManager.Configuration = config;
        }

        public static void Log(string message1, string message2)
        {
            LogEventInfo theEvent = LogEventInfo.Create(NLog.LogLevel.Fatal, "DeviceManager", message1);

            theEvent.Properties["MySubMessage1"] = message2;

            logger.Log(theEvent);
        } 

        static void Main(string[] args)
        {
            InitLogger();
            Log("Main error", "Sub Error: la la la");
        }



Результат
Код: c#
1.
2.
3.
2014-01-15 18:13:09.0303 | ConsoleApplication1.Program.Log | Fatal
Main error
Sub Error: la la la



Хорошо бы еще мне понять как реализовать Failover с записью в БД, а при ошибке - дублированием в файл. В принципе все это можно сделать простым C# кодом. Но хочется задействовать то, что уже реализованно в NLog.

Буду копать дальше...
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38527416
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправил
Код: c#
1.
fileTarget1.Layout = "${longdate} | ${callsite} | ${level}${newline}${message}${newline}${event-context:item=MySubMessage1}";



Оказывается можно перевод строки сделать встроенной константой
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38527429
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF ПадаванПоправил
Код: c#
1.
fileTarget1.Layout = "${longdate} | ${callsite} | ${level}${newline}${message}${newline}${event-context:item=MySubMessage1}";



Оказывается можно перевод строки сделать встроенной константойкруто, не знал. Да , молодцы разрабы
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38529955
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста по NLog еще.

1 Я правильно понимаю, что логгер можно настроить ЛИБО на обработку одного типа сообщений (Debug, Trace и т.д.) ЛИБО задать отрезок "от... до" с помощью MinLevel и MaxLevel ?

А как быть, если нужно включить несколько типов, которые не идут подряд? Ну например Debug+Fatal.

2. Вот еще не понятно.
Нашел код.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
конструктор
fileLogger = LogManager.GetLogger("file");

инициализация
FileTarget fileTarget = new FileTarget();
LoggingRule rule1 = new LoggingRule("*", LogLevel.Fatal, fileTarget);

LoggingConfiguration config = new LoggingConfiguration();
config.AddTarget("file", dbTarget);    Тут мне не ясно что это за имя
config.LoggingRules.Add(rule1);
LogManager.Configuration = config;                    



Я не понял, а что за имя задается в config.AddTarget ?
По идее мы создаем Логгер, с именем. Потом создаем Правило, где указываем к каким логгерам применяется (*), какой уровень и куда отправляется.

А вот что за имя, при добавлении Таржета ? И чему оно должно соответствовать ? Оно должно совпадать с именем логгера ?
...
Рейтинг: 0 / 0
NLog. Есть вопросы.
    #38776859
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите почему нлог дублирует записи?
10/15/2014 10:14:46|Debug|select "Date_Add" || SELECT "Date_Add" FROM "SC_Post16"."TPost16" order by "Date_Add" desc limit 1;
10/15/2014 10:14:46|Debug|select "Date_Add" || SELECT "Date_Add" FROM "SC_Post16"."TPost16" order by "Date_Add" desc limit 1;
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / NLog. Есть вопросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]