
Комментарии 8
Возможно глупый вопрос, а асинхронный лог разве не будет сильно запаздывать, из-за чего мы будем получать не совсем верную информацию о том, где есть возможная ошибка?
На счет строк, может имеет смысл воспользоваться string_view?
Да, асинхронный лог действительно имеет небольшую задержку, но это не влияет на точность информации об ошибках. Когда происходит вызов qDebug() или qWarning(), все метаданные фиксируются синхронно в момент вызова. Асинхронность влияет только на момент записи в файл/консоль, но не на содержимое сообщения. Это стандартный подход во всех серьёзных логгерах.
Когда это может быть проблемой:
При краше приложения последние сообщения могут не успеть записаться (для этого есть flush())
При отладке в реальном времени вывод может отставать от действий, но это какие-то доли секунды не заметные человеческому глазу.
Самое главное последовательность сообщений в логе сохраняется в любом случае.
Qt API (QMessageLogContext и qDebug()) работают с const char* и QString, использование string_view потребовало бы постоянных конвертаций
в какой момент осуществляется ротация с сжатие ?
сжатие например 1Гб файл лога замедлит работу основной программы ?
Ротация происходит в тот момент, когда приходит новое сообщение, но места в старом файле уже нет. В этом случае создаётся новый файл и новое сообщение записывается уже в него. Плюс можно настроить логер, чтобы ротация происходила в начале дня или при старте приложения.
По поводу сжатия. Ну, во-первых, не думаю, что целесообразно делать лимиты в 1Гб при использовании сжатия :) А, во-вторых, если использовать логер в асинхронном режиме ( gQtLogger.moveToOwnThread() )то сжатие будет происходить в отдельном потоке. Тот поток, который вызвал qDebug() это никак не заденет.
Но тут есть один нюанс. В библиотеке используются сжатие встроенное в qt, а оно не умеет сжимать частями, только весь объем целиком. Поэтому перед сжатием весь файл лога должен поместиться в оперативную память. Если это 1Мб, то это не проблема. Если это 1Гб, то памяти может уже и не хватить. Так что не рекомендую использовать сжатие при больших размерах файла.
Ротация происходит в тот момент, когда приходит новое сообщение, но места в старом файле уже нет. В этом случае создаётся новый файл и новое сообщение записывается уже в него. Плюс можно настроить логер, чтобы ротация происходила в начале дня или при старте приложения.
Под капотом qDebug(): как устроено логирование в Qt и что с этим можно сделать