Обновить

Комментарии 8

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

На счет строк, может имеет смысл воспользоваться string_view?

Да, асинхронный лог действительно имеет небольшую задержку, но это не влияет на точность информации об ошибках. Когда происходит вызов qDebug() или qWarning(), все метаданные фиксируются синхронно в момент вызова. Асинхронность влияет только на момент записи в файл/консоль, но не на содержимое сообщения. Это стандартный подход во всех серьёзных логгерах.

Когда это может быть проблемой:

  • При краше приложения последние сообщения могут не успеть записаться (для этого есть flush())

  • При отладке в реальном времени вывод может отставать от действий, но это какие-то доли секунды не заметные человеческому глазу.

Самое главное последовательность сообщений в логе сохраняется в любом случае.

Qt API (QMessageLogContext и qDebug()) работают с const char* и QString, использование string_view потребовало бы постоянных конвертаций

Верно подмети. QStringView отличная штука. Но у меня есть поддержка Qt 5.9, да и где бы он был уместен в этой библиотеке я не знаю.

А где бы вы его использовали?

  1. в какой момент осуществляется ротация с сжатие ?

  2. сжатие например 1Гб файл лога замедлит работу основной программы ?

Ротация происходит в тот момент, когда приходит новое сообщение, но места в старом файле уже нет. В этом случае создаётся новый файл и новое сообщение записывается уже в него. Плюс можно настроить логер, чтобы ротация происходила в начале дня или при старте приложения.

По поводу сжатия. Ну, во-первых, не думаю, что целесообразно делать лимиты в 1Гб при использовании сжатия :) А, во-вторых, если использовать логер в асинхронном режиме ( gQtLogger.moveToOwnThread() )то сжатие будет происходить в отдельном потоке. Тот поток, который вызвал qDebug() это никак не заденет.

Но тут есть один нюанс. В библиотеке используются сжатие встроенное в qt, а оно не умеет сжимать частями, только весь объем целиком. Поэтому перед сжатием весь файл лога должен поместиться в оперативную память. Если это 1Мб, то это не проблема. Если это 1Гб, то памяти может уже и не хватить. Так что не рекомендую использовать сжатие при больших размерах файла.

Ротация происходит в тот момент, когда приходит новое сообщение, но места в старом файле уже нет. В этом случае создаётся новый файл и новое сообщение записывается уже в него. Плюс можно настроить логер, чтобы ротация происходила в начале дня или при старте приложения.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации