说明

对于一般的log,使用 qInstallMessageHandler 重定向到文件即可,甚至可以根据日志等级,分类存储。但是并不是适用所有情况,比如,程序运行时动态创建模块,而每个模块需要创建不用的日志记录。参考Qt的 QDebug 代码,重新编写日志模块。

代码

/********************************************************************************
*
* Description log模块,根据传入参数,创建log文件
* Author sherlock
* Creation Time 2019/8/28
* Modify
*
*******************************************************************************/ #ifndef LOGGER_H
#define LOGGER_H #include <stdio.h>
#include <stdlib.h>
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <QDateTime>
#include <QMutex> class Logger
{
public:
Logger(){}
static void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString log_message;
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
log_message = QString("Debug\t:");
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtInfoMsg:
log_message = QString("Info\t:");
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtWarningMsg:
log_message = QString("Warning\t:");
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtCriticalMsg:
log_message = QString("Critical\t:");
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
abort();
}
fflush(stderr);//立即输出,msvc没有这句也会立即输出,但是mingw不会 #ifndef QT_DEBUG
// if(QtDebugMsg == type)
// {
// mutex.unlock();
// return;
// }
log_message = QString("%1 %2").arg(log_message).arg(msg);
#else //release下不会有文件以及函数信息
log_message = QString("%1 %2\t(%3:%4, %5)").arg(log_message).arg(msg).arg(context.file).arg(context.line).arg(context.function);
#endif // else QDir dir;
if(!dir.exists(logPath))
{
dir.mkpath(logPath);
} QDateTime current_time = QDateTime::currentDateTime();
QString log_file_name = QString("%1/%2_%3.log").arg(logPath)
.arg(context.category)
.arg(QDate::currentDate().toString("yyyyMMdd")); QFile outFile(log_file_name);
if (outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
QTextStream write_log(&outFile);
write_log << current_time.toString("yyyy-MM-dd hh:mm:ss") << "-";
write_log << log_message << endl;
outFile.close();
} mutex.unlock();
} private:
static QString logPath;
}; //默认当前路径下的log文件夹下
QString Logger::logPath = QString("%1/104_file_log").arg(QDir::currentPath()); #endif

为了保证旧代码不受影响,可以在项目根目录下新增QDebug文件,填入以下内容

QDebug

#include "qdebug.h"

#define qModuleDebug(module) QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, module.toStdString().c_str()).debug()
#define qModuleInfo(module) QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, module.toStdString().c_str()).info()
#define qModuleWarning(module) QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, module.toStdString().c_str()).warning()
#define qModuleCritical(module) QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, module.toStdString().c_str()).critical()

使用时,只需要使用 qModuleDebug 宏替代原先的 qDebug宏即可,且原来的 qDebug 仍然可以使用

QString moduleName = "test";
qModuleDebug(moduleName)<<"This is test log";

Qt之分模块log的更多相关文章

  1. 分模块创建maven项目(一)

    maven是一个项目构建和管理的工具. 我们可以通过maven仓库可以实现管理构建(主要是JAR还包括:WAR,ZIP,POM等等). 我们可以通过maven插件可以实现编译源代.产生Javadoc文 ...

  2. Qt框架及模块认识

    小白自工作就接触Qt,一直都在使用Qt5.3.1版本,所以没有经历过大牛们把项目从Qt4程序到Qt5的烦恼,没准以后会碰到.对Qt所有的丰富的API表示惊叹,对于Qt的框架及模块认识也是极为模糊的,文 ...

  3. SpringBoot23 分模块开发

    1 开发环境说明 JDK:1.8 MAVEN:3.5 IDEA:2017.2.5 SpringBoot:2.0.3.RELEASE 2 创建SpringBoot项目 2.1 项目信息 2.2 添加项目 ...

  4. Python+request 分模块存放接口,多接口共用参数URL、headers的抽离,添加日志打印等《三》

    主要介绍内容如下: 1.分模块存放接口 2.多接口共用参数URL.headers的抽离为配置文件 3.添加日志打印 4.一个py文件运行所有所测的接口 如上介绍内容的作用: 1.分模块存放接口:方便多 ...

  5. Maven02——回顾、整合ssh框架、分模块开发、私服

    1 回顾 1.1 Maven的好处 节省空间 对jar包做了统一管理 依赖管理 一键构建 可跨平台 应用在大型项目可提高开发效率 1.2 Maven安装部署配置 1.3 Maven的仓库 本地仓库 远 ...

  6. 若依项目分模块集成uflo2

    关于若依分模块创建项目可参考:https://www.cnblogs.com/conswin/p/9766186.html 了解uflo2,uflo2是一套由BSTEK自主研发的基于Java的工作流引 ...

  7. java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)

    一.分模块项目打包失败 情况:项目是分模块创建的,一些公共的方法是单独的一个模块common,其他模块依赖于此模块,poom依赖已经添加了,项目可以正常运行,但使用maven打包时出现了问题:找不到依 ...

  8. 配置动态加载模块和js分模块打包,生产环境和开发环境公共常量配置

    1. 话不多少 先上代码:  route.js  // 引用模板 分模块编译 const main = r => require.ensure([], () => r(require('. ...

  9. SSH框架分模块开发

    ------------------siwuxie095 SSH 框架分模块开发 1.在 Spring 核心配置文件中配置多个内容,容易造成 配置混乱,不利于维护 「分模块开发主要针对 Spring ...

随机推荐

  1. Python——详解__slots__,property和私有方法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第11篇文章,我们来聊聊面向对象的一些进阶使用. __slots__ 如果你看过github当中一些大牛的代码,你会 ...

  2. 基于canvas的画板

    最近重新在看Html5&CSS3的知识,看到canvas的时候,想到了以前在学校学计算机图形学时做过的画图实验,于是想,可以基于html5和css3来做一款画板,经过1天的努力,完成了画板的一 ...

  3. C#获取文件夹内文件包括子文件(递归)实例

    这个在我工作上,写了一次工具项目,用上的. static ArrayList FileList = new ArrayList();//这个必须写在方法外, static ArrayList GetA ...

  4. Spring Cloud Gateway+Nacos,yml+properties两种配置文件方式搭建网关服务

    写在前面 网关的作用不在此赘述,举个最常用的例子,我们搭建了微服务,前端调用各服务接口时,由于各服务接口不一样,如果让前端同事分别调用,前端同事会疯的.而网关就可以解决这个问题,网关屏蔽了各业务服务的 ...

  5. CTO的窘境

    做CTO太难了,常年的coding思维让你早已与世隔绝,CTO有很好的技术方案,但CEO.CFO等O听不懂是很麻烦的事.总得来说,做CTO一定要技术背景出身,有很强的沟通能力和情商,敏锐的洞察力和决断 ...

  6. Java IO 流-- 文件拷贝

    IO流操作套路: 1.创建源: 2.选择流: 3.操作: 4.释放资源 上代码: package com.xzlf.io; import java.io.File; import java.io.Fi ...

  7. JasperReports入门教程(二):中文打印

    JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...

  8. xhprof windows下安装和使用(转载)

    1.使用5.3.3以上的php版本,或者直接下载wamp2.1集成环境. 2.下载xhprof for windows版本,地址:http://www.benjamin-carl.de/?downlo ...

  9. QtConcurrent::run 运行类的成员函数

    https://stackoverflow.com/questions/2152355/is-it-possible-to-use-qtconcurrentrun-with-a-function-me ...

  10. 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST

    简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...