Russian Qt Forum
Апрель 25, 2024, 11:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextStream пишет в файл с задержками ( можно ли всегда дергать flush ? )  (Прочитано 2799 раз)
Ivan
Гость
« : Август 21, 2018, 11:08 »

Добрый день.
Пытаюсь реализовать простой логгер - запись логов в файл и вывод их же на виджет.
Проблема в том, что QTextStream использует какой-то буфер, и если программа завершилась не корректно, то в файл ни чего не записывается. Или пропадает часть информации.
Это не допустимо, т.к. задача логгера сообщить мне после какой операции программа вылетела.

Для решения проблемы я поставил QTextStream.flush();
На сколько корректно так делать и есть ли альтернативы гарантирующие немедленную запись в файл?

Запуск логгирования:
Код:
bool LoggerClass::init(const QString &filename)
{
    _logWidget = new LogWidget();

    _logFile = new QFile( filename );
    if( !_logFile->open( QFile::WriteOnly | QIODevice::Append | QIODevice::Unbuffered ) ) return false;

    _logStream = new QTextStream(_logFile);
    if( !(_logStream && _logStream->device()) ) return false;

    log( "\n\n######################################################\n" );
    log( QString("Runned at %1.").arg(QDateTime::currentDateTime().toString("dd.MM.yyyy")) );
    log ( "\n");

    return true;
}

Запись строки логов:
Код:
void LoggerClass::log(const QString &text )
{
    if( _logStream && _logStream->device() ) {
        *_logStream << text;
        _logStream->flush(); // Наверное, это не корректно ???
    } else {
        _logWidget->addLog( "\n\nError write to log-file.\n\n" );
    }
    _logWidget->addLog( text );
}
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #1 : Август 21, 2018, 11:17 »

не хотите делать flush, сделайте логику чтобы перед падением этот flush вызвался. Или для критичных сообщений делайте flush, а обычные(после которых программа не упадет), без сброса на диск.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #2 : Август 22, 2018, 10:04 »

пиши в консоль std::err, это гарантирует, что будет вывод виден
еще есть готовые логгеры, чтобы не писать свой, см. например https://github.com/gabime/spdlog
Записан
Ivan
Гость
« Ответ #3 : Август 22, 2018, 11:00 »

Спасибо за ссылку. Обязательно изучу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 22.