如何在 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(&m_File);
可以立即完成,但忘记从标题中删除。
好的,QTextStream &GetCurrentStream() 方法呢,我想在main中调用它,为什么不在构造函数中调用它?
因为该调用可以检查文件溢出限制。这就是这个 sn-p 的核心目的,即在透明切换日志目标设备的同时重用 QTextStream 格式化功能。【参考方案2】:
您可以将boost::filesystem::<functions>
替换为QFile::<functions>
。检查文档以查看用法和确切的签名。
【讨论】:
嗯,有 QFile::exists(const QString &filename), QFile::remove() 和 QFile::rename() 方法谢谢你,但是什么是“static_cast以上是关于如何在 Qt 中限制日志大小的主要内容,如果未能解决你的问题,请参考以下文章
如何限制 Apache 访问日志的大小,并限制它保留的归档日志的数量?
如何在ansible中指定docker的log-opt来限制容器的日志大小?
如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小