1

在我的服务器应用程序中,我正在创建一个大小为 5kb 的日志文件。如果我超过 5 kb 的文件大小,我必须在新内容的帮助下覆盖旧内容。如果您有任何想法,请与我分享。

我还需要在qt中实现这种技术。

我在 c++ 中找到了一些示例,但是使用我不熟悉的 boost 库,你能帮我在 qt 中实现吗?

std::ostream & libLogging::FileRotationLogSink::GetCurrentStream( 
    std::string::size_type required )
{
    if ( static_cast<std::string::size_type>(m_CurrentStream.tellp( )) + 
        required > m_Limit ) {
        m_CurrentStream.close();
        // remove old backup
        if ( boost::filesystem::exists( m_BackupPath ) ) {
            boost::filesystem::remove( m_BackupPath );
        }
        // backup current logfile
        boost::filesystem::rename( m_LogFilePath, m_BackupPath );
        // open new logfile
        m_CurrentStream.open( m_LogFilePath );
    }
    return m_CurrentStream;
}
4

2 回答 2

1

示例实现:

#ifndef FILEROTATIONLOGSINK_H
#define FILEROTATIONLOGSINK_H

#include <QFile>
#include <QTextStream>

namespace libLogging {

class FileRotationLogSink
{
public:

    explicit FileRotationLogSink(size_t Limit = 5 * (1 << 10));
    QTextStream &GetCurrentStream(size_t required = 0);

private:

    size_t m_Limit;
    QString m_LogFilePath, m_BackupPath;
    QTextStream m_CurrentStream;
    QFile m_File;

    void openStream();
};
}

#endif // FILEROTATIONLOGSINK_H

与相关cpp

#include "FileRotationLogSink.h"

libLogging::FileRotationLogSink::FileRotationLogSink(size_t Limit) :
    m_Limit(Limit),
    m_LogFilePath("log"),
    m_BackupPath("bak")
{
    m_File.setFileName(m_LogFilePath);
    m_File.open(QIODevice::WriteOnly | QIODevice::Text);
    m_CurrentStream.setDevice(&m_File);
}

QTextStream& libLogging::FileRotationLogSink::GetCurrentStream(size_t required) {

    if (m_File.size() + required > m_Limit) {
        m_File.flush();
        m_File.close();

        // remove old backup
        if (QFile::exists(m_BackupPath))
            QFile::remove(m_BackupPath);

        // backup current logfile
        QFile::rename(m_LogFilePath, m_BackupPath);
        m_File.open(QIODevice::WriteOnly | QIODevice::Text);
    }

    return m_CurrentStream;
}

示例使用:

#include "mainwindow.h"
#include "FileRotationLogSink.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    libLogging::FileRotationLogSink log(100);
    for (int i = 0; i < 100; ++i)
        log.GetCurrentStream() << "line " << i << endl;
}

对数产量

line 92
line 93
line 94
line 95
line 96
line 97
line 98
line 99

在bak

line 79
line 80
line 81
line 82
line 83
line 84
line 85
line 86
line 87
line 88
line 89
line 90
line 91
于 2013-08-10T07:06:08.107 回答
0

您可以将 替换boost::filesystem::<functions>QFile::<functions>。检查文档以查看用法和确切的签名。

于 2013-08-10T05:17:12.303 回答