04-Qt软件加入Log文件输出与终端彩色打印(包含行号)

2023-11-17

一、目的与需求

在开发qt应用程序中,经常使用打印调试软件。qt自己的qDebug()就满足了需求。但是当需要把一部分log记录到文件的时候qt就没有提供了。这个时候可以使用qDebug()的qInstallMsgHandler来指定打印回掉函数了。在回掉打开文件进行写文件操作。这样简单实现,简单用。但是对于对log写文件要求比较高的比较成熟的log系统。还是自己专门实现一个或者用现成优秀的log库。

推荐的有Log4Qt。但是这里为了打印的高度定制化,还是得自己开发的一个qt的log打印库。实现代码比较简约稳定。实现主要参考了qDebug的实现架构。核心字符串与各种输入对象的合并为一个字符串使用了qt的类“QDebug”。名字叫做“MyLog” ^_^。

用MyLog可以在终端打印出对应log的代码文件名称和行号(qDebug()没有这个功能)。行号可以方便快速定位调试位置。MyLog把info,debug,error在终端以不同的颜色显示。很直观的看到各个级别的log信息。MyLog还可以把平时写的调试打印打印到log文件中。如果对log文件的细节不满意,还可以根据接口实现自己的类。然后使用installer_logger安装你实现的记录器即可用你定义的方式输出log文件了。

MyLog项目在github上,欢迎使用并一起改进。地址如下:

https://github.com/robert1207/MyLog

二、MyLog使用方法

  1. 下载MyLog
    MyLog是在LGPL协议下发布的库,因此可以把此库用于你的商业软件(动态库链接方式使用)。但是在这个库的源码基础上做修改并再次发布,需要同样遵循LGPL开源协议。MyLog的项目地址如下:
git clone https://github.com/robert1207/MyLog
  1. 在你的Qt工程文件xxx.pro中使用lib方式或src方式添加引用
#using MyLog as the src (使用你自己的目录)
#include($$PWD/my_lib/MyLog/MyLogSrc.pri)

#using MyLog as a lib (使用你自己的目录)
include($$PWD/my_lib/MyLog/MyLogLib.pri)
  1. 包括头文件
#include "my_log_export.h"
  1. 安装文件打印记录器
QCoreApplication::setApplicationName("myappname");
QCoreApplication::setApplicationVersion("0.0.1");
QCoreApplication::setOrganizationName("com.company.myappname"); //设置程序名称,保存文件时候用到
QCoreApplication::setOrganizationDomain("com.company.myappname");

MyLogNS::FileLogger *fileLog = new MyLogNS::FileLogger();
int result = fileLog->open_log_file_at_dir("log");
if(result != 0) {
    qDebug("error: %s", fileLog->get_error_str(result));
}
qDebug("log file path=%s", fileLog->get_log_file_abs_path());
MyLogIns.installer_logger(fileLog);
  1. 安装终端打印记录器
MyLogIns.installer_logger(new MyLogNS::ConsoleLogger());
  1. 配置功能控制变量
    这些配置默认都是开启的不需要配置。当你需要关闭其中的属性时,配置为false即可。
MyLogIns.is_enable_auto_new_line= true;     //default is true
MyLogIns.is_show_level_str= true;           //default is true
MyLogIns.is_show_timestamp= true;           //default is true
MyLogIns.is_show_file_name= true;           //default is false
MyLogIns.is_show_function_name= true;       //default is true
MyLogIns.is_show_line_number= true;         //default is true
  1. 打印记录 (和使用”qDebug()”的方法一样)
I << "str value=" << 1;     //log info
D << "str value=" << 2;     //log debug
E << "str value=" << 3;     //log error
D << "Date:" << QDate::currentDate();
D << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40);
  1. 控制记录总开关
    在“MyLogSrc.pri”或“MyLogLib.pri”文件中有各个等级的log控制开关:
#DEFINES += MYLOG_NO_I_OUTPUT
#DEFINES += MYLOG_NO_D_OUTPUT
#DEFINES += MYLOG_NO_E_OUTPUT
  1. 打印效果如下:
    out-put-example

三、MyLog实现自己的输出器

当你需要把记录的log以自己的储存方式储存的时候,就可以通过接口重新实现一个输出器。比如你想要通过网络打印。即把打印的log 通过网络请求输出。就可以按照如下步骤操作:

  1. 继承接口实现自己的打印记录器
    接口类在文件”logger_interface.h”中。
class LoggerInterface
{
public:
    LoggerInterface();
    virtual ~LoggerInterface();
public:
    virtual void open() = 0;
    virtual void close() = 0;
    virtual void write(LogLevel level, const QString &msg, bool is_shift_to_next_line) = 0;
};
  1. 制作你自己的记录器
#include "logger_interface.h"
class NetLogger : public MyLogNS::LoggerInterface
{
public:
    NetLogger();
    virtual void open();//安装记录器的时候被调用,用于初始化
    virtual void close();//在程序关闭的时候被调用,用于关闭文件
    virtual void write(MyLogNS::LogLevel level, const QString &msg, bool is_shift_to_next_line);//参数分别是:打印等级,打印字符串,是否自动换行
};
  1. 使用你自己制作的记录器
MyLogIns.installer_logger(new  NetLogger());

四、完整使用例子的主函数

#include <QApplication>
#include <QFile>
#include <QtDebug>
#include <QDate>

#include "my_log_export.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QCoreApplication::setApplicationName("appname");
    QCoreApplication::setApplicationVersion("0.0.1");
    QCoreApplication::setOrganizationName("com.company.appname");
    QCoreApplication::setOrganizationDomain("com.company.appname");

    MyLogNS::FileLogger *fileLog = new MyLogNS::FileLogger();
    int result = fileLog->open_log_file_at_dir("log");
    if(result != 0) {
        qDebug("error: %s", fileLog->get_error_str(result));
    }
    qDebug("log file path=%s", fileLog->get_log_file_abs_path());
    MyLogIns.installer_logger(fileLog);

    MyLogIns.installer_logger(new MyLogNS::ConsoleLogger());

    /*
    MyLogIns.is_enable_auto_new_line= false;     //default is true
    MyLogIns.is_show_level_str= false; 			//default is true
    MyLogIns.is_show_timestamp= false;           //default is true
    MyLogIns.is_show_file_name= false;
    MyLogIns.is_show_function_name= false;
    MyLogIns.is_show_line_number= false;*/

    I << "value1 =" << 1;
    D << "value2 =" << 2;
    E << "value3 =" << 3;

    D << "Date:" << QDate::currentDate();
    D << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40);

    MainWindow w;
    w.show();
    return a.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

04-Qt软件加入Log文件输出与终端彩色打印(包含行号) 的相关文章

  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr

随机推荐

  • 2022年前端面试题加答案

    1 javascript基本数据类型 string number null underfined boolean object是所有对象的父对象 2 浅谈javascript中变量和函数声明的提升 变量和函数声明的提升会被提升到最顶部去执行
  • C++中的并行与并发

    1 1 并行基础 std thread 用于创建一个执行的线程实例 所以它是一切并发编程的基础 使用时需要包含
  • 夜夜肝到秃顶,2022年Java面试题目收集整理归纳

    开始的碎碎念 本文大多是各大企业的topN题目 针对java中高级开发 本文会持续收集更新内容 如果大家有优质的Java面试题 也欢迎大家来投稿 特意整理出这个分类的目录 方便大家平时复习和收藏哈 希望正在准备面试的朋友们能顺顺利利找到自己
  • 用python进行图片处理和特征提取

    原文来自 http www analyticsvidhya com blog 2015 01 basics image processing feature extraction python 毫无疑问 上面的那副图画看起来像一幅电脑背景图
  • 区块链 2.0笔记

    区块链 2 0 以太坊概述 相对于比特币的几点改进 缩短出块时间至10多秒 ghost共识机制 mining puzzle BTC 计算密集型 ETH memory hard 限制ASIC proof of work gt proof of
  • 【每日一题】1572. 矩阵对角线元素的和

    每日一题 1572 矩阵对角线元素的和 1572 矩阵对角线元素的和 题目描述 解题思路 1572 矩阵对角线元素的和 题目描述 给你一个正方形矩阵 mat 请你返回矩阵对角线元素的和 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角
  • 解决Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.

    一 Android Studio 引用多个jar aar或者工程时出现 com Android build api transform TransformException Java util zip ZipException duplic
  • C# language Study - 1

    本节讲叙了一些基本的C 语法上的知识 这些知识一般都是在C语言中接触不到的 最基础的 C语言中也存在的知识点 就略过不提了 1 C 中预定义的值类型 a 整型 sbyte System SByte 8位有符号整数 short System
  • 华为OD机试 - 快速开租建站(Java)

    题目描述 当前IT部门支撑了子公司颗粒化业务 该部门需要实现为子公司快速开租建站的能力 建站是指在一个全新的环境部署一套IT服务 每个站点开站会由一系列部署任务项构成 每个任务项部署完成时间都是固定和相等的 设为1 部署任务项之间可能存在依
  • 华为od机试题2 真题

    华为od机试题 真题 77 满足最大消费额度 76 小朋友身高位置 75 字符连续出现最大次数 74 最少停车数 73 字母多条件排序 71 交叉排序 70 水仙花数 69 消除相邻且相同字母 以下题目附带Java解法 是我个人写的 不一定
  • RobotFramework入门(二)appUI自动化之app启动

    前言 本章主要讲述appUI自动化的一个小示例 ps 这里虽然是一个小示例 但如果你要通过robot去做appUI自动化 思路都是一样的 可以自行搜索关键字组合去使用 其实正常情况下 我们会直接使用代码去实现自动化 而不是在ride上实行哈
  • discuz主题列表页伪静态化设置方法(lnmp+wamp+lamp通用)

    大家都知道在discuz程序中 伪静态化后 门户文章跟帖子内容都可以设置成功并能正常的访问 但是在论坛帖子的列表页却还是动态的地址 http www 52hgn com forum php gid 40 比如这种 我们想把他变成这种静态地址
  • Java从入门到实战总结-4.4、JDBC

    Java从入门到实战总结 4 4 JDBC 文章目录 Java从入门到实战总结 4 4 JDBC 1 简介 2 JDBC体系结构 3 JDBC核心组件 4 CRUD语法介绍 回顾 5 使用步骤 6 JDBC连接步骤 6 1 JDBC执行SQ
  • ES6非空判断

    es6 Null传导运算符 const firstName message body user firstName default 运算符相当于一种短路机制 只要不满足条件 就不再往下执行 Null 判断运算符 属性的值为null unde
  • gitLens插件简单使用(默认上传github)

    1 安装 在vscode中的插件管理输入如下后下载 GitLens Git supercharged 2 配置 点击文件 首选项 设置 点击右上角设置小图标 3 github使用 首先仓库文件一定是要git init是git所管理的 1 在
  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器

    最近在项目上遇到 用485协议命令控制灯光继电器的开关需要计算16进制 CRC16 MODBUS RTU通讯 校验码来写控制命令 这种在网上有现成的计算器 我们直接使用即可 以下为我用的一个计算器的链接 个人感觉还是蛮好用的 同时他还涵盖了
  • react Native java JDK与Gradle版本不兼容 构建失败

    react Native 版本介绍 本篇适用react Native已经搭建了java jdk 1 8的版本开发环境 如果需要写0 67版本及以上的项目 现在的gradle版本比较高 比如gradle6 0 构建版本和打包的时候会出现不兼容
  • ThinkPhp5使用bootstrap样式分页

    1 查看分页的配置 在application config php文件中最后 分页配置 paginate gt type gt bootstrap var page gt page list rows gt 15 2 下载 https v3
  • 04-Qt软件加入Log文件输出与终端彩色打印(包含行号)

    一 目的与需求 在开发qt应用程序中 经常使用打印调试软件 qt自己的qDebug 就满足了需求 但是当需要把一部分log记录到文件的时候qt就没有提供了 这个时候可以使用qDebug 的qInstallMsgHandler来指定打印回掉函