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 = QtDebugMsg;
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.toUtf8() << endl;
outFile.close();
s_logMutex.unlock();
}
main.cpp
#include "Log.h"
int main()
{
//日志路径自定义
setLogPath(BaseUtil::modulePath() + LOG_FILE_NAME);
qInstallMessageHandler(customLogMessageHandler);
qDebug() << "hello world";
return 0;
}