如何在 Qt 中限制日志大小

Posted

技术标签:

【中文标题】如何在 Qt 中限制日志大小【英文标题】:how to limit log size in Qt 【发布时间】:2013-08-10 04:42:14 【问题描述】:

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

【问题讨论】:

你看起来很困惑;在你的项目中使用 boost 有什么问题? boost没用过,只是找了个例子,没必要用,只想在qt中实现一下。 【参考方案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

在烘焙中

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

【讨论】:

非常感谢 CapelliC :) 为什么不使用openStream()方法或者不一定? 对不起,我从 cpp 中删除了它,因为绑定 m_CurrentStream.setDevice(&amp;m_File); 可以立即完成,但忘记从标题中删除。 好的,QTextStream &GetCurrentStream() 方法呢,我想在main中调用它,为什么不在构造函数中调用它? 因为该调用可以检查文件溢出限制。这就是这个 sn-p 的核心目的,即在透明切换日志目标设备的同时重用 QTextStream 格式化功能。【参考方案2】:

您可以将boost::filesystem::&lt;functions&gt; 替换为QFile::&lt;functions&gt;。检查文档以查看用法和确切的签名。

【讨论】:

嗯,有 QFile::exists(const QString &filename), QFile::remove() 和 QFile::rename() 方法谢谢你,但是什么是“static_cast(m_CurrentStream.tellp()" 和QTextStream有关吗? 这是可能不兼容的类型之间的简单转换。 C++ 是一种类型非常严格的语言。

以上是关于如何在 Qt 中限制日志大小的主要内容,如果未能解决你的问题,请参考以下文章

如何限制 Apache 访问日志的大小,并限制它保留的归档日志的数量?

如何在ansible中指定docker的log-opt来限制容器的日志大小?

Qt 4 - QuaZip - 文件大小限制和内存问题

如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小

如何在 Spring Boot 应用程序中使用 log4j2 根据大小生成新的日志文件

如何实现日志的集中化存储以及使用loganalyzer做日志分析