QFile и QTextStream для класса регистратора

Я пытаюсь создать класс Logger, используя QFile и QTextStream, но я не могу найти эффективный способ сделать это. Я просто хочу создать функцию журнала (…) в нем.

Я знаю, что это работает, если я делаю следующее:

void CLogger::log(QString strLog,int nType) {
QFile file(m_strFileName);
file.open( QIODevice::Append | QIODevice::Text );
QTextStream logStream(&file);
logStream << nType << "-" << strLog;
file.close();
}

Но это довольно противно. Я не хочу создавать объект QFile в каждой строке журнала, которую я вставляю.

Исходя из этого, я попробовал несколько разных способов, таких как:

1) (с QFile * m_pFile в качестве члена)

CLogger::CLogger()
{
m_pFile = new QFile(m_strFileName);
}
void CLogger::log(QString strLog,int nType)
{
m_pFile->open( QIODevice::Append | QIODevice::Text );
QTextStream logStream(m_pFile);
logStream << nType << "-" << strLog;
m_pFile.close();
}

или же

2) (с QFile * m_pFile и QTextStream * m_pLogStream в качестве членов)

CLogger::CLogger()
{
m_pFile = new QFile(m_strFileName);
m_pFile->open( QIODevice::Append | QIODevice::Text );
m_pLogStream = new QTextStream(m_pFile);
}
void CLogger::log(QString strLog,int nType)
{
*m_pLogStream << nType << "-" << strLog;
}

В первом случае я получаю:

C2248: ‘QTextStream :: QTextStream’: не может получить доступ к приватному члену
объявлен в классе ‘QTextStream’

во втором случае * m_pLogStream не эквивалентен QTextStream&,

Что я делаю неправильно?

2

Решение

На самом деле это не такое плохое решение — открывать (и закрывать) файл журнала каждый раз, когда вам нужно что-то регистрировать (если вы не регистрируетесь 1000 раз каждую секунду … но тогда никто не сможет обработать такой объем данных … ). Это не только позволяет иметь очень стабильный журнал (так как вы не сохраняете файл открытым все время, поэтому вы не зависите от очистки операционной системы), но также позволит вам реализовать такие функции как бревно и другие тонкости.

Если вы сохраняете файл журнала открытым, в случае нежелательного «сбоя» вы можете не получить все строки журнала, в зависимости, конечно, от того, как ваша ОС обрабатывает эти неблагодарные выходы.

Вот фрагмент кода, который мы используем для регистрации:

QMutexLocker locker(&m_lineLoggerMutex);

QFile f(getLogFileName());
doRollLogsIfNeeded(static_cast<qint64>(f.size() + lineToBelogged.length()));

// Do not open in append mode but seek() to avoid warning for unseekable
// devices, note that if open is made with WriteOnly without Append, the
// file gets truncated
if (!f.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream out(stdout);
out << "CANNOT OPEN LOG FILE: " << getLogFileName();
return;
}
// seek() does nothing on sequential devices, this is in essence what QFile
// does when Append flag is set in open() but without warning (on Qt 4.8.3)
// However, Qt 4.8.1 issues the warning, so check it explicitly
if (!f.isSequential())
{
f.seek(f.size());
}

QTextStream out(&f);
out << lineToBelogged;

Это происходит в методе, и деструкторы заботятся о закрытии устройств.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]