原文链接
前言
Qt
日志输出重定向示例,这里增加自动将不同日期的日志分开存储的逻辑,方便日志管理和查阅
实现
关键函数就一个
typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
Q_CORE_EXPORT QtMessageHandler qInstallMessageHandler(QtMessageHandler);
我们只需要在代码初始位置,将自己的处理方法由qInstallMessageHandler
注入,即可实现日志输出的多态,这里给出简单示例
头文件log_record.h
#ifndef LOGRECORD_H
#define LOGRECORD_H
#include <QDateTime>
#include <QDebug>
#include <QFile>
#include <QIODevice>
#include <QObject>
class LogRecord : public QObject
{
Q_OBJECT
public:
explicit LogRecord(QObject* parent = nullptr);
~LogRecord();
public:
void installLogHandle();
public:
static void rebuildLogFile();
static void closeLogFile();
static QFile* getCurFilePtr();
static QString getCurDate();
private:
static QString s_curDate;
static QFile* s_logFilePtr;
};
#endif // LOGRECORD_H
源文件log_record.cpp
#include "log_record.h"
QFile* LogRecord::s_logFilePtr = nullptr;
QString LogRecord::s_curDate = "";
void handle(QtMsgType, const QMessageLogContext& context, const QString& msg)
{
if (LogRecord::getCurDate() != QDateTime::currentDateTime().toString("yyyyMMdd"))
{
LogRecord::closeLogFile();
LogRecord::rebuildLogFile();
}
auto logFile = LogRecord::getCurFilePtr();
if (logFile)
{
QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString output =
QString("[%1] [%2:%3] %4\n").arg(date).arg(context.file).arg(context.line).arg(msg);
QTextStream stream(logFile);
stream << output;
}
}
LogRecord::LogRecord(QObject* parent) : QObject{ parent }
{
LogRecord::rebuildLogFile();
}
LogRecord::~LogRecord()
{
LogRecord::closeLogFile();
}
void LogRecord::installLogHandle()
{
qInstallMessageHandler(handle);
}
void LogRecord::rebuildLogFile()
{
QString date = QDateTime::currentDateTime().toString("yyyyMMdd");
#ifdef Q_OS_WIN
s_logFilePtr = new QFile(QString("log-%1.txt").arg(date));
#else
s_logFilePtr = new QFile(QString("/data/face/log/log-%1.txt").arg(date));
#endif
if (s_logFilePtr->open(QIODevice::Append | QIODevice::WriteOnly))
{
s_curDate = date;
}
else
{
qDebug() << "[op:LogRecord] Load log file fail ";
}
}
void LogRecord::closeLogFile()
{
s_logFilePtr->close();
delete s_logFilePtr;
}
QFile* LogRecord::getCurFilePtr()
{
return s_logFilePtr;
}
QString LogRecord::getCurDate()
{
return s_curDate;
}
调用在应用初始化位置增加代码
#ifndef Q_OS_WIN
m_logRecord = new LogRecord();
m_logRecord->installLogHandle();
#endif
即可