|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
Как логировать?20.10.2020, 14:32. Показов 5694. Ответов 16
Метки нет (Все метки)
В С++ есть препроцессор, это позволяет сделать прекрасный логер, примерно так:
Вопрос: Как подобное реализовать на С# ?
0
|
||||||
| 20.10.2020, 14:32 | |
|
Ответы с готовыми решениями:
16
Как логировать принятые данные? Как мне получить и логировать все данные конкретного ответа HttpResponse в строковом формате? Периодически опрашивать и логировать множество WSDL сервисов |
|
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
|
|
| 20.10.2020, 14:38 | |
|
gumi250, вот так вот кратко - никак) Да и номер строки и имя файла тоже не получить. Да и не особо это должно быть нужным.
А так, практики логирования две: 1. Статический класс Logger 2. Внедрение зависимостей, когда Logger в конструктор каждого класса внедряется
0
|
|
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||
| 20.10.2020, 14:44 [ТС] | ||
0
|
||
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||
| 20.10.2020, 15:09 [ТС] | ||
0
|
||
|
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
* но, как выше правильно заметили, это может быть актуально только в каких-то очень особенных сиутациях, когда нет вообще никакой возможности воспользоваться отладчиком. Добавлено через 2 минуты P.S.: только имейте ввиду, что это всё работает на этапе прекомпиляции, т.е. вызов LogInfo(); будет заменён на LogInfo(@"c:\prj\SampleLog\Program.cs", "Main", 24);. Т.е. внутри сборки будет информация об абсолютных путях той машины, где проект собирался.
3
|
|||||||||||
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
| 20.10.2020, 16:00 [ТС] | |
|
Спасибо, то что нужно.
0
|
|
|
Just Do It!
|
|||||||
| 20.10.2020, 21:02 | |||||||
|
kotelok,
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++?
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
|
|
| 20.10.2020, 21:36 | |
|
1
|
|
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|||||||||||
| 21.10.2020, 01:22 [ТС] | |||||||||||
|
Решил ответить на счет логирования исходя из своего не богатого опыта:
С++ Builder. Брейкпоинты при закрытии/открытии проекта не сохраняются. Есть инструмент логирования CodeSuite https://raize.com/codesite/ . Идеальное окошко с логом (в картинке). Но сделан он через классы, а не макросы, поэтому код лога огромен
С++ Arduino (микроконтроллеры). Брейкпоинтов нет вообще. Только вывод лога в COM-консоль. Лог убог, ни цветовой подсветки ни имени файла ни номера строки. Неудобно. Пришлось писать свой логер с подсветкой, именем файла и номером строки. С# Unity (Игры в моем случае под андроид). Почемуто брейкпоинты срабатывают через раз.,приходится ставить по нескольку брейкпоинтов подряд, в надежде что хоть что то сработает. Лог выводится в консоль самого Юнити, код лога длинный:
В простых проектах можно и без логера, но в сложных случаях хороший лог это мощный инструмент, который прекрасно дополнит брекпоинты и может даже стать основным при отладке в циклах, в нескольких потоках, в системах клиент-сервер, ловли редко повторяющихся багов, багов в релиз версиях на других компах. Проблема в том, что бы логер был удобен: легко читаем, по дабл_клику по строчке лога пересылал в нужное место в коде, а его код был максимально краток и тогда возникает желанием им пользоваться.
1
|
|||||||||||
| 21.10.2020, 07:16 | |
|
0
|
|
|
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
|
|
| 21.10.2020, 08:39 | |
|
gumi250, часть того, что видно на скриншоте есть важные события системы и действительно подлежат журналированию (ошибка авторизации, подтверждение платежа от платёжного шлюза и тд). Такие события не требуют информации и номерах строк, но могут требовать свою, специфичную информацию.
А вот то, что было озвучено в первом посте, с номерами строк и именами файлов исходников, это - костыльный способ замены отладчика. Такое приемлемо только там, где отладчика нет. В каких-нибудь контроллерах без JTAG. В остальных случаях мне кажется использование такого логирования не профессиональным. Смотрите сами: на вставку этих вызовов "профилирования" уходит время, код загаживается, в случае с C# загаживается знатно, аффектится производительность, по крайней мере в Debug'е, притом сильно. Ну и не тренируется скил использования отладки.
0
|
|
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||
| 21.10.2020, 17:28 [ТС] | ||
|
-Номера строк и имя файлов нужно для быстрого поиска источника, что бы не бегать потом по коду в поисках нужного места в коде. -Конечно если код простой, то хватит и брекпоинта, но есть и сложные случай. Если ваш код замусорен логами, значит это был сложный кусок кода, который вы долго отлаживали и логами и брекпоинтами и удаление логов в нем это пустяк. -Если синтаксис логера максимально краткий, то его использование не занимает много времени. -Например в С++ билдере у меня логируется наверно тысяч 10 строк кода в секунду. Для вменяемых размеров лога, приложения не тормозит. Вот примеры моего использования логера,: - Циклы, например у вас ошибка на тысячном шаге цикла. Как найти это с помощью только брекпоинта? Для условного брекпоинта нужен номер шага. А если ошибка в функции, но не на первом ее вызове, а на тысячном, и вызывается она из разных мест? - Несколько потоков, тут брекпоинты кидают вас из потока в поток в середины кода, а в логи можно отсылать номер потока, и в итоге получить для каждого потока свой лог. Можно условные брекпоинты по ID потока, но это долго. - Когда важно время выполнения, у вас нет времени на пошаговое выполнение кода, т.к. важно выполнить код за некоторое время. Например, клиент -серверные приложения, зачастую вы не можете отлаживать брекпоинтами одного из них, т.к. другой посчитает это за ошибку или завалит вас данными, которые вы пропустите. - Отслеживание изменений обрабатываемых данных. - Старые наработки, в которых вы наставили варнингов, и они тут же вываляться в лог в вашем новом еще глючном проекте. В любом случае логер это доп инструмент, который должен быть максимально удобным, а пользоваться или нет каждый решает сам..
0
|
||
|
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
|
||
| 22.10.2020, 06:19 | ||
|
0
|
||
| 22.10.2020, 06:19 | |
|
Помогаю со студенческими работами здесь
17
Как логировать в базу?
Есть ли в log4j возможность одновременно логировать в разные файлы? Ошибка в отслеживании изменений. Перестало "логировать" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Управление камерой с помощью скрипта 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. . .
|