Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/141: Рейтинг темы: голосов - 141, средняя оценка - 4.72
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730

Как правильно настроить логирование в Nlog?

09.12.2016, 15:32. Показов 27128. Ответов 11

Студворк — интернет-сервис помощи студентам
ИСПОЛЬЗУЕТСЯ: C#, Visual Studio 2015

Как сделать, чтобы каждое действие в программе записывалось в лог.
ПРИМЕР.
- клик по кнопке;
- поиск элементов;
- выполняется метод "метод 1";
- переменная "n" приняла значение "значение 1";
- ошибка "ошибка 1"
и т.д.
Всё описанный перечень описывается в файл с фиксирование даты и времени.

Попробовал это реализовать в Nlog, но что-то не очень.

КОД основного КЛАССА
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
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using NLog; // добавлено
using NLog.Config; // добавлено
 
namespace rsh
{
    public partial class Form1 : Form
    {
        // *** ЛОГЕР ***. 
        private static Logger logger = LogManager.GetCurrentClassLogger();     
        
        int r;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            r = 1 + 1;
            textBox1.Text = r.ToString();                              
            //Просто информация
            logger.Trace("log {0}", this.Text);
            logger.Debug("log {0}", this.Text);
            logger.Info("log {0}", this.Text);
            logger.Warn("log {0}", this.Text);
            logger.Error("log {0}", this.Text);
            logger.Fatal("log {0}", this.Text);
        }
    }
    
}
КОД Program

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
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using NLog; // добавлено
using NLog.Config; // добавлено
 
 
namespace rsh
{
    static class Program
    {
        // ЛОГЕР
        private static Logger logger = LogManager.GetCurrentClassLogger();
 
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
 
            // КОНФИГУРИРУЕМ ЛОГЕР            
            // NLog.Config.DOMConfigurator.Configure();
 
 
            logger.Trace("logger.Trace");
            logger.Debug("logger.Debug");
            logger.Info("logger.Info");
            logger.Warn("logger.Warn");
            logger.Error("logger.Error");
            logger.Fatal("logger.Fatal");
        }
    }
}
ВОПРОС
1. Как можно логирование в приведённом мной формате?
2. Как можно логирование в приближённом формате к приведённом мной?
3. Как можно вообще правильно сделать логирование?


PS
C# пока только осваиваю, поэтому прошу делать поправку на неточности в терминологии и постановке вопроса
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2016, 15:32
Ответы с готовыми решениями:

Как правильно установить NLOG и куда записать конфигурацию?
Помогите установить пакет NLOG. не могу понять куда писать &lt;nlog xmlns=&quot;http://www.nlog-project.org/schemas/NLog.xsd&quot;...

Как настроить логирование доступа к шарам ?
Доброе время суток. Кто нибудь может подсказать, как в windows 2016 настроить логирование (ведение логов) кто заходил, открывал файл из...

Как настроить логирование запросов больше 5 секунд?
Всем еще раз привет , как настроить логирование запросов больше 5 секунд ? с чего начать и как сделать ?:gsorry:

11
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
09.12.2016, 17:27
zakaz_77, чтобы NLog начал что-либо куда-либо логировать, нужно добавить в проект файл NLog.config, установить для него свойство "copy to output directory" в true. Пример содержимого конфиг-файла:

Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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">
 
  <!-- make sure to set 'Copy To Output Directory' option for this file -->
  <!-- go to [url]http://nlog-project.org/wiki/Configuration_file[/url] for more information -->
 
<targets>
    <target name="run_log"
    xsi:type="File"
    layout="${longdate}|${level}| ${message}"
    deleteOldFileOnStartup="True"
    concurrentWrites="true"
    KeepFileOpen ="False"
    fileName="${basedir}/Application.log"
    encoding="win-1251"/>
</targets>
 
<rules>
    <logger name="*" minlevel="Debug" writeTo="run_log" />
    <logger name="*" minlevel="Trace" writeTo="run_log" />
</rules>
</nlog>
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.12.2016, 18:40  [ТС]
bax_tang,
Забыл упомянуть при начальных настройках NLog.config лог появляется ввиде:
2016/12/09 14:48:15.474|Trace|logger.Trace
2016/12/09 14:48:15.474|Debug|logger.Debug
2016/12/09 14:48:15.474|Info|logger.Info
2016/12/09 14:48:15.474|Warn|logger.Warn
2016/12/09 14:48:15.474|Error|logger.Error
2016/12/09 14:48:15.474|Fatal|logger.Fatal

после внесения настроек согласно ваших рекомендаций, логирование перестало работать.
Выдаёт предупреждения.
1. Атрибут "deleteOldFileOnStartup" недействителен: значение "True" недействительно с точки зрения его типа данных "http://www.w3.org/2001/XMLSchema:boolean" — Строка "True" не является допустимым значением Boolean.

2. Атрибут "KeepFileOpen" не объявлен.

как исправить?
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
09.12.2016, 19:08
zakaz_77, True изменить на true, KeepFileOpen можно вообще удалить. В секции Rules оставить только вторую строку с minLevel = Trace.
Для изменения формата строки в лог-файле необходимо указать значение атрибута layout (разметка) в элементе target.
Например, по-умолчанию используется вот такой формат разметки:
${longdate}|${level:uppercase=true}|${lo gger}|${message}

Официальная вики по NLog на GitHub
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.12.2016, 20:27  [ТС]
bax_tang,
изменил согласно предложенных вами замечаний.
Лог имеет такой же вид
2016-12-09 20:04:23.6917 DEBUG log Form1
2016-12-09 20:04:23.7717 INFO log Form1
2016-12-09 20:04:23.7717 WARN log Form1
2016-12-09 20:04:23.7717 ERROR log Form1
2016-12-09 20:04:23.7747 FATAL log Form1
2016-12-09 20:04:36.8874 DEBUG logger.Debug
2016-12-09 20:04:36.8874 INFO logger.Info
2016-12-09 20:04:36.8874 WARN logger.Warn
2016-12-09 20:04:36.8874 ERROR logger.Error
2016-12-09 20:04:36.8874 FATAL logger.Fatal

Он так и должен выглядеть или можно всё таки детализировать, согласно вопроса в ТС?
ПРИЛАГАЮ КОД
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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">
 
  <!-- make sure to set 'Copy To Output Directory' option for this file -->
  <!-- go to [url]http://nlog-project.org/wiki/Configuration_file[/url] for more information -->
 
  <targets>
    <target name="run_log"
    xsi:type="File"
    layout="${longdate}|${level:uppercase=true}|${logger}|${message}"    
    deleteOldFileOnStartup="true"
    concurrentWrites="true"    
    fileName="${basedir}/Application.log"
    encoding="win-1251"/>
  </targets>
 
  <rules>
    <!--<logger name="*" minlevel="Debug" writeTo="run_log" />-->
    <logger name="*" minlevel="Trace" writeTo="run_log" />
  </rules>
</nlog>
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
09.12.2016, 23:15
zakaz_77, вариант конфиг-файла, который используется в проектах у меня на работе:
Кликните здесь для просмотра всего текста

XML
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
<?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" autoReload="true" throwExceptions="false">
  <targets async="false">
    <!-- file target -->
    <target xsi:type="File" name="LogToFile"
            fileName="${basedir}/Logs/Service.log"
            layout="${date} | ${level:uppercase=true} | ${message}${onexception:${newline}   EXCEPTION\: ${exception:format=ToString}}"
            archiveAboveSize="1048576"
            archiveFileName="${basedir}/Logs/Archives/Service.{#####}.log"
            archiveNumbering="Rolling" />
    <!-- end file target -->
    <!-- console target -->
    <target xsi:type="ColoredConsole" name="LogToConsole"
            layout="${date} | ${level:uppercase=true} | ${message}${onexception:${newline}   EXCEPTION\: ${exception:format=ToString}}"
            useDefaultRowHighlightingRules="true" encoding="unicode" />
    <!-- end console target -->
  </targets>
 
  <variable name="text" value="${message}" />
  <variable name="tags" value="${level}" />
  <variable name="user" value="${identity:authType=false:isAuthenticated=false}" />
  <variable name="source" value="${machinename}" />
  <variable name="br" value="&lt;br/&gt;" />
  <variable name="+b" value="&lt;b&gt;" />
  <variable name="-b" value="&lt;/b&gt;" />
  <variable name="ex-text" value="${message}: ${exception}" />
  <variable name="ex-data" value="@html${newline}${+b}Exception:${-b} ${exception}${br}${br}${+b}Stack Trace:${-b}${stacktrace}" />
 
  <rules>
    <logger name="*" minlevel="Trace" writeTo="LogToFile" />
    <logger name="*" minlevel="Trace" writeTo="LogToConsole" />
  </rules>
</nlog>


Формат результирующего лог-файла:
Кликните здесь для просмотра всего текста

2016/12/06 15:41:49.335 | INFO | Topshelf v4.0.0.0, .NET Framework v4.0.30319.42000
2016/12/06 15:41:49.352 | INFO | Service configuration initializing started...
2016/12/06 15:41:49.457 | INFO | Service configuration initialized successfully.
2016/12/06 15:41:49.457 | DEBUG | Running as a console application, creating the console host.
2016/12/06 15:41:49.474 | DEBUG | Starting up as a console application
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.12.2016, 23:26  [ТС]
Я правильно понял, что дополнительно нужно по всему коду в необходимых местах разместить сообщение о логировании?

У меня оно как-то так выглядит
C#
1
 logger.Trace("сообщение 1 {0}", this.Text);
Как у вас выглядит это сообщение?
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
09.12.2016, 23:39
zakaz_77, правильно поняли; у меня оно выглядит аналогичным образом.
Да, по всему коду логгеры понатыканы - не очень красиво, конечно, зато работает именно так, как нужно.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
10.12.2016, 10:16  [ТС]
bax_tang,
Есть другие инструменты, чтобы где-то, что-то подключил (прописал) один раз и всё, что делаешь в процессе программы(вводишь текст в Текстбокс, нажимаешь на кнопки) всё пишется в лог?

Нашёл пример NLog.Config.
Теперь лог выглядит так
2016-12-10 08:25:01.8803 rsh.Form1.button1_Click Trace: сообщение 1 Form1 Button.OnClick => Control.OnClick => Form1.button1_Click

Это не то, что хотелось, но похоже. Достаточно оставить Form1.button1_Click
ВОПРОС
1. Если я правильно понял это зависит от layout?
2. Как настроить layout, чтобы он выдавал сообщения такого рода ?

КОД НОВОГО NLog.Config.
XML
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >
 
 
  <!-- optional, add some variabeles
  [url]https://github.com/nlog/NLog/wiki/Configuration-file#variables[/url]
  -->
  <variable name="myvar" value="myvalue"/>
 
  <!-- 
  See [url]https://github.com/nlog/nlog/wiki/Configuration-file[/url] 
  for information on customizing logging rules and outputs.
   -->
  <targets>
 
    <!-- 
    add your targets here 
    See [url]https://github.com/nlog/NLog/wiki/Targets[/url] for possible targets.
    See [url]https://github.com/nlog/NLog/wiki/Layout-Renderers[/url] for the possible layout renderers.
    -->
    <target name="console" xsi:type="Console" layout="${date:format=HH\:mm\:ss}|${level}|${message}" />
    <target name="file"
        xsi:type="File"
        fileName="${basedir}/logs/Log.${level}.current.txt"
        layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}"
        archiveFileName="${basedir}/logs/archives/log.error.${shortdate}.{#}.txt"
        archiveAboveSize="5242880"
        archiveEvery="Day"
        archiveNumbering = "Rolling"
        maxArchiveFiles="3" />
    <!--
    Writing events to the a file with the date in the filename. 
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>
 
  <rules>
    <!-- add your logging rules here -->
    <logger name="*" minlevel="Debug" writeTo="file" />
    <logger name="*" minlevel="Trace" writeTo="file" />
    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
10.12.2016, 12:16
Лучший ответ Сообщение было отмечено zakaz_77 как решение

Решение

zakaz_77, Вы хотите каким-либо простым образом реализовать не самое тривиальное поведение.
Ключевой момент в том, что элементы управления Windows Forms понятия не имеют о том, какие события Вы хотите логировать, а какие - нет, и уж точно не знают о выбранном Вами логгере.

Так что так или иначе придется заниматься ручным кодированием.
Самый простой вариант, который я вижу - наследование от стандартных классов элементов управления и перегрузка методов-инициаторов событий с реализацией записи соответствующего сообщения в лог. Соответственно, создавать потом также нужно будет эти элементы управления.
Либо можно повесить обработчик на событие Form.Controls.ControlAdded и в зависимости от типа элемента управления добавлять обработчики нужных событий, в которых уже реализовать запись в лог (я бы выбрал этот вариант).

Добавлено через 1 час 21 минуту
Вышла оговорка, имелось в виду вот это событие.
1
0 / 0 / 0
Регистрация: 04.08.2019
Сообщений: 8
02.11.2019, 16:28
Кто может помочь, смотрите я создал директорию и в ней будут хранится логи, а как можно сделать что бы эти логи отправлались куда-то на хостинг допустим?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
02.11.2019, 23:55
само логирование в уделенную точку или закидывать файлики с периодичностью куда-то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2019, 23:55
Помогаю со студенческими работами здесь

Настроить логирование в веб проекте
Скорее я усложняю и запутался с моделью памяти, к примеру у меня есть веб проект, который использует у себя в зависимостях библиотеку....

Как в веб сервере Apache (ОС Linux Ubuntu) настроить логирование таким образом, чтоб при любом запросе веб-се
Помогите пожалуйста!!!Как в веб сервере Apache (ОС Linux Ubuntu) настроить логирование таким образом, чтоб при любом запросе веб-сервер...

Не получается настроить логирование с slf4 и log4j
Здравствуйте. Изучаю логирование. Нашёл хеллоу ворлд по log4j, всё сделал - всё работает. Попробовал заменить на slf4-log4j, но ничего не...

Как правильно настроить Wi-Fi сеть?
Доброго времени! Надо с настройкой вай-фай сети разобраться. Вернее правильно сконфигурировать, т.к. возможно в чём-то я ошибаюсь и сеть...

COM-порт, как правильно настроить
Доброго времени суток. Прошу помощи в решении следующей проблемы: на COM порте висит железка, которая постоянно посылает данные в порт....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru