QT:简单日志文件处理

目录

功能

使用方法

程序日志输出图效果

log_out.h和log_out.cpp文件


功能

  • 程序在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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值