示例实现:
#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