2

QFile と QTextStream を使用して Logger クラスを作成しようとしていますが、効率的な方法が見つかりません。その中に log(...) 関数を作成したいだけです。

次のようにするとうまくいくことがわかっています。

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' で宣言されたプライベート メンバーにアクセスできません

2 つ目では、*m_pLogStream は QTextStream& と同等ではありません。

私は何を間違っていますか?

4

1 に答える 1

4

実際、何かをログに記録する必要があるたびにログファイルを開く(そして閉じる)のはそれほど悪い解決策ではありません(毎秒1000回ログを記録しない限り...しかし、誰もその量のデータを処理することはできません... )。これにより、非常に安定したログが得られるだけでなく (ファイルを常に開いたままにしておく必要がないため、オペレーティング システムのフラッシュに依存しないため)、次のような機能を実装できるようになります。ログローリング、およびその他の機能。

ログ ファイルを開いたままにしておくと、望ましくない「クラッシュ」が発生した場合に、もちろん、OS がこの不審な終了をどのように処理しているかによって、すべてのログ行を取得できない可能性があります。

ロギングに使用するコードの一部を次に示します。

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;

これはメソッドに入り、デストラクタがデバイスのクローズを処理します。

于 2013-11-06T09:40:27.953 に答える