Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Taiphoon
2 / 2 / 0
Регистрация: 15.04.2016
Сообщений: 69
#1

И снова логирование - C++

06.05.2016, 19:08. Просмотров 267. Ответов 6
Метки нет (Все метки)

Есть желание сделать в своём приложении нормальную систему логирования. Должно быть несколько уровней логирования и несколько категорий логирования. Под уровнем понимается
  • Fatal
  • Error
  • Warning
  • Info
  • Debug
  • Trace
Под категорией
  • System
  • Connections
  • Authentication
  • UserInput
Есть несколько вопросов:
  1. Нужно ли выделять уровни Debug и Trace макросами только для сборок Debug, что бы в релизе их вообще не было (вопрос быстродействия)?
  2. Где правильнее делать проверку, попадает ли строчка в лог (вопрос быстродействия и правильности )
    • В тексте кода
    • Внутри фанкции записи в лог
  3. В какой момент производить запись данных в файл:
    • При наступлении события
    • В зависимости от типа события (Fatal и Error сразу, остальные при завершении приложения)
    • По таймеру
    • Гибрид предыдущих двух пунктов
  4. Писать в файл потоком <<, или как?

Добавлено через 29 минут
По пункту 2 дополнение: или сделать в inline функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
06.05.2016, 19:27     И снова логирование #2
Цитата Сообщение от Taiphoon Посмотреть сообщение
Нужно ли выделять уровни Debug и Trace макросами только для сборок Debug, что бы в релизе их вообще не было (вопрос быстродействия)?
Ответ на этот вопрос, казалось бы, должен быть очевиден. Если в приложении есть хоть какие-то собственные средства отладки/трассировки, то отрезать их в релизе не следует. В противном случае всё равно может возникнуть необходимость отлаживать что-то в релизе, так что вместо жёсткой привязки к режиму Debug лучше сделать отдельный макрос-переключатель, что подходит в любом случае. Можно включать его по умолчанию в режиме Debug и отключать в Release, получив такое же поведение, как при жёсткой привязке, но оставив за собой возможность переключить как хочется.

Цитата Сообщение от Taiphoon Посмотреть сообщение
Где правильнее делать проверку, попадает ли строчка в лог
Если речь идёт о проверке уровня, то для неё самое место в функции вывода в журнал.

Цитата Сообщение от Taiphoon Посмотреть сообщение
В какой момент производить запись данных в файл:
Как правило, от лога ждут предельной актуальности, то есть, последние сообщения, которые обычно больше всего интересуют, не должны выпадать оттуда из-за того, что программа аварийно остановилась и не сбросила буфер на диск. Поэтому надо сразу, незамедлительно, выводить в файл и делать принудительный сброс (flush) после каждой строчки. При работе с обычными файлами это неэффективный и не рекомендуемый способ, но в логах актуальность важнее.

Цитата Сообщение от Taiphoon Посмотреть сообщение
Писать в файл потоком <<, или как?
Как удобнее.

Цитата Сообщение от Taiphoon Посмотреть сообщение
По пункту 2 дополнение: или сделать в inline функции?
Не имеет значения, в Debug всё равно функции не инлайнятся, а в Release компилятор сам решит, кого, куда и когда инлайнить, и на слово inline посмотрит в лучшем случае как на ненавязчивую рекомендацию.
Evg
Эксперт CАвтор FAQ
17386 / 5624 / 351
Регистрация: 30.03.2009
Сообщений: 15,402
Записей в блоге: 26
06.05.2016, 19:41     И снова логирование #3
Логирование работы программы...!?
Небольшой пример, там файлы FormDebug.cpp и FormDebug.h
hoggy
6152 / 2518 / 442
Регистрация: 15.11.2014
Сообщений: 5,563
Завершенные тесты: 1
06.05.2016, 19:42     И снова логирование #4
Цитата Сообщение от Taiphoon Посмотреть сообщение
Нужно ли выделять уровни Debug и Trace макросами только для сборок Debug, что бы в релизе их вообще не было (вопрос быстродействия)?
нужно.
и это не только вопрос быстродействия.
но и безопасности так же.
Цитата Сообщение от Taiphoon Посмотреть сообщение
Где правильнее делать проверку, попадает ли строчка в лог
стратегия конкретной политики логгера.

Цитата Сообщение от Taiphoon Посмотреть сообщение
В какой момент производить запись данных в файл:
не принципиальный момент.

Цитата Сообщение от Taiphoon Посмотреть сообщение
В зависимости от типа события (Fatal и Error сразу, остальные при завершении приложения)
требование к разработке: в случае гибели приложения,
данные о последних мнговениях его жизни - самое важное,
и они не должны пропасть.

как вы это реализуете - ваши трудности.
но писать все сразу же на диск - производительность умрет.

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

смысл здесь в том, что это уже вне компетенции механизма "логгер".

логгер принял сообщение, логгер слил её в хранилище.
что с этим дальше будет делать хранилище - его не интересует.

а задача хранилища - не профакапить данные,
в случае гибели рабочего процесса.
и не поставить всю систему колом,
из-за постоянных лагов от записи на диск.

Цитата Сообщение от Taiphoon Посмотреть сообщение
Писать в файл потоком <<, или как?
как удобнее, так и делайте.

Цитата Сообщение от Taiphoon Посмотреть сообщение
inline функции?
не принципиальный момент.
Taiphoon
2 / 2 / 0
Регистрация: 15.04.2016
Сообщений: 69
07.05.2016, 13:22  [ТС]     И снова логирование #5
Evg, отдельное спасибо за fflash().
Цитата Сообщение от Nick Alte Посмотреть сообщение
Ответ на этот вопрос, казалось бы, должен быть очевиден. Если в приложении есть хоть какие-то собственные средства отладки/трассировки, то отрезать их в релизе не следует. В противном случае всё равно может возникнуть необходимость отлаживать что-то в релизе, так что вместо жёсткой привязки к режиму Debug лучше сделать отдельный макрос-переключатель, что подходит в любом случае. Можно включать его по умолчанию в режиме Debug и отключать в Release, получив такое же поведение, как при жёсткой привязке, но оставив за собой возможность переключить как хочется.
Спасибо за идею, так и сделаю.
Evg
Эксперт CАвтор FAQ
17386 / 5624 / 351
Регистрация: 30.03.2009
Сообщений: 15,402
Записей в блоге: 26
07.05.2016, 20:19     И снова логирование #6
Цитата Сообщение от Taiphoon Посмотреть сообщение
Evg, отдельное спасибо за fflash()
fflush - это всё-таки Си, а не Си++. В Си++ есть что-то своё, просто я не знал, а потому написал как смог
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2016, 20:35     И снова логирование
Еще ссылки по теме:

C++ WinAPI Мониторинг реестра WinAPI + логирование (С++)
C++ Снова try catch
C++ Логирование
Логирование запускаемых приложений C++ WinAPI
C++ Логирование ошибок, номер строки ошибки

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
07.05.2016, 20:35     И снова логирование #7
В C++ есть ostream::flush() и многострадальный endl.
Yandex
Объявления
07.05.2016, 20:35     И снова логирование
Ответ Создать тему
Опции темы

Текущее время: 16:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru