繁体   English   中英

如何在Qt中限制日志大小

[英]how to limit log size in Qt

在我的服务器应用程序中,我正在创建一个大小为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;
}

示例实现:

#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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM