目录
功能
- 程序在debug模式下, 正常输出
- 程序在release模式下,输出信息到日志文件上面
每天会生成一个日志文件,日志文件只会保留七天,
日志文件统一存放在exe所在目录的上一级目录logDir下,以当天的日期时间命名
使用方法
IDE:Qt Creator
1、将 log_out.h 和 log_out.cpp添加进项目。
2、添加预处理,防止在release模式下,输出的日志信息不显示文件名,行号等信息
//Qt Creator下,在pro文件中添加下面这一行
DEFINES += QT_MESSAGELOGCONTEXT
//Visual Studio中,在项目解决方案属性-》 C/C++ -》 预处理器 -》 预处理器定义。
//添加下列信息
QT_MESSAGELOGCONTEXT
3、初始化日志使用
#include "widget.h"
#include <QApplication>
#include "log_out.h"
#include <qdebug.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef QT_NO_DEBUG //release模式下启动日志文件输出
InitializeLog(); //初始化
qInstallMessageHandler(MyMessageOutput);//自定义日志输出
#endif
qDebug()<<"widget begin ";
Widget w;
w.show();
qDebug()<<"widget end ";
return a.exec();
}
程序日志输出图效果
log_out.h和log_out.cpp文件
log_out.h
//日志输出,重定向debug
#ifndef LOG_OUT_H
#define LOG_OUT_H
#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>
#include <qdatetime.h>
//初始化日志(日志目录和文件处理)
void InitializeLog();
//自定义消息处理程序
void MyMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
#endif //LOG_OUT_H
log_out.cpp
#include "log_out.h"
#include "qapplication.h"
#include <qdir.h>
#include <qdatetime.h>
#include <QFileInfoList>
#include <qfileinfo.h>
void InitializeLog()
{
QString str = qApp->applicationDirPath();
str = str.left(str.lastIndexOf("/"));//获取上一级目录路径
str += "/logDir";
str = QDir::toNativeSeparators(str);//将“/”转换为“\\”
//检查目录,如果不存在则创建
QDir dir(str);
if (!dir.exists())
{
dir.mkdir(str);
}
//删除超过7天的文件
QDateTime deleteDateTime = QDateTime::currentDateTime().addDays(-7);//获取七天前的日期时间
QFileInfoList fileList = dir.entryInfoList();
for (QFileInfo info : fileList)
{
if (info.fileName() == "." || info.fileName() == "..") continue;
int seconds = deleteDateTime.secsTo(info.created());//前7天的时间到文件的创建时间
if (seconds < 0)
{
info.dir().remove(info.fileName());
}
}
}
void MyMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// 加锁
static QMutex mutex;
mutex.lock();
QByteArray localMsg = msg.toLocal8Bit();
QString msgType("");
switch (type)
{
case QtDebugMsg:
msgType = QString("Debug");
break;
case QtWarningMsg:
msgType = QString("Warning");
break;
case QtCriticalMsg:
msgType = QString("Critical");
break;
case QtFatalMsg:
msgType = QString("Fatal");
break;
}
// 设置输出信息格式
QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString strMessage = QString("[%1]-[flie:%2 line:%3 datetime:%4]--------------------- %5")
.arg(msgType) //消息类型
.arg(context.file) //消息所在文件
.arg(context.line) //消息所在行
.arg(strDateTime) //日期时间
.arg(localMsg.constData()); //消息
//获取文件路径
QString str = qApp->applicationDirPath();
str = str.left(str.lastIndexOf("/"));//获取上一级目录路径
str += "/logDir";
QString filePath = QDate::currentDate().toString("yyyy-MM-dd");
filePath += ".txt";
filePath = str + "/" + filePath;
filePath = QDir::toNativeSeparators(filePath);//将“/”转换为“\\”
// 输出信息至文件中(读写、追加形式)
QFile file(filePath);
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
file.close();
// 解锁
mutex.unlock();
}