Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ivan от Август 21, 2018, 11:08



Название: QTextStream пишет в файл с задержками ( можно ли всегда дергать flush ? )
Отправлено: 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 );
}


Название: Re: QTextStream пишет в файл с задержками ( можно ли всегда дергать flush ? )
Отправлено: deMax от Август 21, 2018, 11:17
не хотите делать flush, сделайте логику чтобы перед падением этот flush вызвался. Или для критичных сообщений делайте flush, а обычные(после которых программа не упадет), без сброса на диск.


Название: Re: QTextStream пишет в файл с задержками ( можно ли всегда дергать flush ? )
Отправлено: qate от Август 22, 2018, 10:04
пиши в консоль std::err, это гарантирует, что будет вывод виден
еще есть готовые логгеры, чтобы не писать свой, см. например https://github.com/gabime/spdlog


Название: Re: QTextStream пишет в файл с задержками ( можно ли всегда дергать flush ? )
Отправлено: Ivan от Август 22, 2018, 11:00
Спасибо за ссылку. Обязательно изучу.