先看一下最终效果:在一个叫做“Log”的目录下会生成以当前时间命名的日志文件。
下面来看一下实现方法:
先创建一个最简单的qt工程,如下图所示,想必大家都非常熟悉
将下面两个文件加入工程中:
log.h:
#pragma once
#include <QMutex>
#include <QString>
#define LOG_FILE_NAME QString(".\\Log\\") + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss") + QString(".log")
static int s_logLevel = 0;
static QMutex s_logMutex;
static QString s_logPath;
void setLogPath(const QString &path);
void setLogLevel(int level);
void customLogMessageHandler(QtMsgType type, const QMessageLogContext& ctx, const QString& msg);
log.cpp:
#include "Log.h"
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QTextStream>
#include <QDateTime>
void setLogPath(const QString & path)
{
s_logPath = path;
}
void setLogLevel(int level)
{
s_logLevel = level;
}
bool static ensureDirExist(const QString &dirPath)
{
QDir dir(dirPath);
if (dir.exists())
{
return true;
}
return dir.mkpath(dirPath);
}
void customLogMessageHandler(QtMsgType type, const QMessageLogContext& ctx, const QString& msg)
{
if (type < s_logLevel)
{
return;
}
QString logInfo;
QString logTime = QDateTime::currentDateTime().toString("hh-mm-ss-MM-dd-yyyy");
switch (type)
{
case QtDebugMsg:
logInfo = QString("%1 [Debug] %2").arg(logTime, msg);
break;
case QtWarningMsg:
logInfo = QString("%1 [Warning] %2").arg(logTime, msg);
break;
case QtCriticalMsg:
logInfo = QString("%1 [Critical] %2").arg(logTime, msg);
break;
case QtFatalMsg:
logInfo = QString("%1 [Fatal] %2").arg(logTime, msg);
abort();
// case QtInfoMsg:
// logInfo = QString("%1 [Info] %2").arg(logTime, msg);
// break;
}
s_logMutex.lock();
QFile outFile(s_logPath);
QFileInfo fileInfo(outFile);
if (!ensureDirExist(fileInfo.absoluteDir().absolutePath()))
return;
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
return;
QTextStream ts(&outFile);
ts << logInfo << endl;
outFile.close();
s_logMutex.unlock();
}
加完之后目录结构如下图所示:
让我们来试一试吧,
在main.cpp中加入如下代码:
运行一下,可以看到Log文件夹下生成了日志,结束。
目前只是知道可以这样子做,后面有空再仔细学习一下代码。