Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384

Как логировать?

20.10.2020, 14:32. Показов 5694. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В С++ есть препроцессор, это позволяет сделать прекрасный логер, примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifdef DebugLog
    #define _L(text)    LogSend(__FILE__, __LINE__, __FUNC__, text);
#else
    #define _L {};
#endif
 
void LogSend(const char* File, int Line,  const char* Func, String text){
    printf(File+":"+Line+":"+Func+": "+text);
} 
 
/// использование
_L("Message");
Ключевые моменты тут: 1) краткость при использовании и 2) получение в логе имени файла, функции и номера строки.

Вопрос: Как подобное реализовать на С# ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2020, 14:32
Ответы с готовыми решениями:

Как логировать принятые данные?
Хочу сделать логирование чата в программке одной. Нашел как логировать действия выполнения программы, а вот как логировать только принятые...

Как мне получить и логировать все данные конкретного ответа HttpResponse в строковом формате?
Мне нужно получить тело ответа и отправить его в грейлог. Никак не могу получить данные текущего ответа клиенту, чтобы их залогировать....

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

16
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
20.10.2020, 14:38
gumi250, вот так вот кратко - никак) Да и номер строки и имя файла тоже не получить. Да и не особо это должно быть нужным.

А так, практики логирования две:
1. Статический класс Logger
2. Внедрение зависимостей, когда Logger в конструктор каждого класса внедряется
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.10.2020, 14:44  [ТС]
Да и номер строки и имя файла тоже не получить. Да и не особо это должно быть нужным.
А каким образом мне найти место в коде, которое сгенировало интересуемую строчку в логе?
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
20.10.2020, 14:47
gumi250, можно использовать такие вот атрибуты, но это дико код загадит.

Добавлено через 1 минуту
Мне кажется, что вам не нужно то, что вы просите. Это похоже на какую-то отладку методом "MessageBox".
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.10.2020, 15:09  [ТС]
Мне кажется, что вам не нужно то, что вы просите. Это похоже на какую-то отладку методом "MessageBox".
Да, это отладка с помощью лога и есть. Это много удобней MessageBox. Много лет на С++ использую подобный логер, это очень удобно и как писать код без подобной штуки я не представляю.
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
20.10.2020, 15:19
gumi250, а писать код без подобной штуки очень просто. И код чище получается.

Моя практика показывает, что подобный подход совершенно не нужен. По крайней мере в C#. В студии (Visual Studio) замечательный отладчик. Есть даже условные brakepoints и c действиями (можно трейсить в окне вывода, в студии). Я это на полном серьёзе говорю.

Максимум - ассерты.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
20.10.2020, 15:35
Лучший ответ Сообщение было отмечено gumi250 как решение

Решение

gumi250
C#
1
2
3
4
5
6
7
private static void LogInfo(
    [CallerFilePath] string file = null,
    [CallerMemberName] string caller = null,
    [CallerLineNumber] int? line = null)
{
    Debug.WriteLine($"file: {file}, caller: {caller}, line: {line}");
}
C#
1
2
3
4
static void Main(string[] args)
{
    LogInfo();
    ....
Добавлено через 57 секунд
* но, как выше правильно заметили, это может быть актуально только в каких-то очень особенных сиутациях, когда нет вообще никакой возможности воспользоваться отладчиком.

Добавлено через 2 минуты
P.S.: только имейте ввиду, что это всё работает на этапе прекомпиляции, т.е. вызов LogInfo(); будет заменён на LogInfo(@"c:\prj\SampleLog\Program.cs", "Main", 24);. Т.е. внутри сборки будет информация об абсолютных путях той машины, где проект собирался.
3
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.10.2020, 16:00  [ТС]
Спасибо, то что нужно.
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
20.10.2020, 21:02
kotelok,
Цитата Сообщение от kotelok Посмотреть сообщение
C#
1
2
3
4
private static void LogInfo(
    [CallerFilePath] string file = null,
    [CallerMemberName] string caller = null,
    [CallerLineNumber] int? line = null)
чаво не хватает?
Code
1
2
3
4
1>------ Rebuild All started: Project: Test-01, Configuration: Debug x86 ------
1>...\Program.cs(15,2,15,16): error CS0246: The type or namespace name 'CallerFilePathAttribute' could not be found (are you missing a using directive or an assembly reference?)
1>...\Program.cs(15,2,15,16): error CS0246: The type or namespace name 'CallerFilePath' could not be found (are you missing a using directive or an assembly reference?)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
20.10.2020, 21:35
XLAT
Студия ведь должна подсказывать чего не хватает: using System.Runtime.CompilerServices; (Assembly mscorlib, Version=4.0.0.0, \.NETFramework\v4.7.2\mscorlib.dll).
1
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
20.10.2020, 21:36
Цитата Сообщение от XLAT Посмотреть сообщение
чаво не хватает?
C#
1
using System.Runtime.CompilerServices;
1
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
20.10.2020, 22:13
kotelok, TrickyBestia,
using System.Runtime.CompilerServices;
этого было мало:
надо было ещё повысить версию FW
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
21.10.2020, 01:22  [ТС]
Решил ответить на счет логирования исходя из своего не богатого опыта:
С++ Builder. Брейкпоинты при закрытии/открытии проекта не сохраняются. Есть инструмент логирования CodeSuite https://raize.com/codesite/ . Идеальное окошко с логом (в картинке). Но сделан он через классы, а не макросы, поэтому код лога огромен
C++
1
CodeSite.Send('Form Height', Height);//отправили сообщение с числом
Ни имени файла ни номера строки. Неудобно. Пришлось писать свой логер через макросы, который имеет похожее окошко, но код лога короче:_TFl(Height) , а дабл_клик по строчке лога переносит в нужное место кода.
С++ Arduino (микроконтроллеры). Брейкпоинтов нет вообще. Только вывод лога в COM-консоль. Лог убог, ни цветовой подсветки ни имени файла ни номера строки. Неудобно. Пришлось писать свой логер с подсветкой, именем файла и номером строки.
С# Unity (Игры в моем случае под андроид). Почемуто брейкпоинты срабатывают через раз.,приходится ставить по нескольку брейкпоинтов подряд, в надежде что хоть что то сработает. Лог выводится в консоль самого Юнити, код лога длинный:
C#
1
Debug.Log("Message");
При дабл_клике по строчке лога переносит в нужное место кода. Сам лог простой, до CodeSite далеко. Основная проблема, это как вывести этот лог когда игра закачана на телефон (не подключенный к компу), консоль Юнити то уже недоступна.

В простых проектах можно и без логера, но в сложных случаях хороший лог это мощный инструмент, который прекрасно дополнит брекпоинты и может даже стать основным при отладке в циклах, в нескольких потоках, в системах клиент-сервер, ловли редко повторяющихся багов, багов в релиз версиях на других компах. Проблема в том, что бы логер был удобен: легко читаем, по дабл_клику по строчке лога пересылал в нужное место в коде, а его код был максимально краток и тогда возникает желанием им пользоваться.
Миниатюры
Как логировать?  
1
21.10.2020, 07:16

Не по теме:

Цитата Сообщение от gumi250 Посмотреть сообщение
С++ Arduino (микроконтроллеры). Брейкпоинтов нет вообще. Только вывод лога в COM-консоль. Лог убог, ни цветовой подсветки ни имени файла ни номера строки. Неудобно. Пришлось писать свой логер с подсветкой, именем файла и номером строки.
Так это микроконтроллеры, это совсем другая история, там кодят суровые бородатые дядьки, у них отладчик в голове.

0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
21.10.2020, 08:39
gumi250, часть того, что видно на скриншоте есть важные события системы и действительно подлежат журналированию (ошибка авторизации, подтверждение платежа от платёжного шлюза и тд). Такие события не требуют информации и номерах строк, но могут требовать свою, специфичную информацию.

А вот то, что было озвучено в первом посте, с номерами строк и именами файлов исходников, это - костыльный способ замены отладчика. Такое приемлемо только там, где отладчика нет. В каких-нибудь контроллерах без JTAG.

В остальных случаях мне кажется использование такого логирования не профессиональным. Смотрите сами: на вставку этих вызовов "профилирования" уходит время, код загаживается, в случае с C# загаживается знатно, аффектится производительность, по крайней мере в Debug'е, притом сильно. Ну и не тренируется скил использования отладки.
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
21.10.2020, 17:28  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Так это микроконтроллеры, это совсем другая история, там кодят суровые бородатые дядьки, у них отладчик в голове.
Ардуино дети на работотехнике програмируют. В инете много любительских поделок на нем, JTAGа там нет, да и не панацея он.

-Номера строк и имя файлов нужно для быстрого поиска источника, что бы не бегать потом по коду в поисках нужного места в коде.
-Конечно если код простой, то хватит и брекпоинта, но есть и сложные случай. Если ваш код замусорен логами, значит это был сложный кусок кода, который вы долго отлаживали и логами и брекпоинтами и удаление логов в нем это пустяк.
-Если синтаксис логера максимально краткий, то его использование не занимает много времени.
-Например в С++ билдере у меня логируется наверно тысяч 10 строк кода в секунду. Для вменяемых размеров лога, приложения не тормозит.

Вот примеры моего использования логера,:
- Циклы, например у вас ошибка на тысячном шаге цикла. Как найти это с помощью только брекпоинта? Для условного брекпоинта нужен номер шага. А если ошибка в функции, но не на первом ее вызове, а на тысячном, и вызывается она из разных мест?
- Несколько потоков, тут брекпоинты кидают вас из потока в поток в середины кода, а в логи можно отсылать номер потока, и в итоге получить для каждого потока свой лог. Можно условные брекпоинты по ID потока, но это долго.
- Когда важно время выполнения, у вас нет времени на пошаговое выполнение кода, т.к. важно выполнить код за некоторое время. Например, клиент -серверные приложения, зачастую вы не можете отлаживать брекпоинтами одного из них, т.к. другой посчитает это за ошибку или завалит вас данными, которые вы пропустите.
- Отслеживание изменений обрабатываемых данных.
- Старые наработки, в которых вы наставили варнингов, и они тут же вываляться в лог в вашем новом еще глючном проекте.

В любом случае логер это доп инструмент, который должен быть максимально удобным, а пользоваться или нет каждый решает сам..
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
22.10.2020, 06:19
Цитата Сообщение от gumi250 Посмотреть сообщение
а пользоваться или нет каждый решает сам..
Немного не так. "Использовать его как логгер или пользоваться взамен отладчика". Всё-таки, это разные вещи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2020, 06:19
Помогаю со студенческими работами здесь

Как логировать в базу?
Господа подскажите решение по логированию ошибок в базу, при этом не оборачивая каждую функцию в try/except? Ну вот есть например моделька...

Log4j как логировать только один метод из класса
Добрый день. Есть класс с несколькими методами. В нем объявлен лог: private static final Log log = LogFactory.getLog(Example.class); ...

[log4j] Логировать ли все успешные операции?
Логируют ли в коммерческих проектах, например успешное сохранение пользователя в БД успешное получение записи из БД

Есть ли в log4j возможность одновременно логировать в разные файлы?
Не подскажете как можно настроить log4j что бы иметь лог только своего приложения (ejb под jboss), без служебной информации jbossa....

Ошибка в отслеживании изменений. Перестало "логировать"
В книге реализовано сохранение изменений решением Alex_ST, описанное тут. при работе с книгой, если выделить где-то весь лист -...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru