6、Qt使用Log4Qt日志

一、知识点

1、Log4Qt有三部分
  • logger:负责捕获日志信息
  • layout:负责使用不同的样式输出日志
  • appender:负责输出信息到不同的目的地,比如数据库、文件、控制台等等
2、 日志级别如下,从上往下依次递增
  • ALL:所有日志的级别都包括
  • TRACE:指定比DEBUG更粗粒度的调试日志
  • DEBUG:指定的信息事件的粒度是DEBUG,在调试应用的时候会有帮助
  • INFO::指定信息消息,强调应用粗粒度的运行情况
  • WARN:输出具有潜在风险的
  • ERROR:指定错误事件,并且这些事件还会保证应用继续运行
  • FATAL:指定严重的错误事件,该事件导致应用暂停
  • OFF:最高级别,相当于关闭日志
3、 日志消息格式
通过转换说明符来表示,以百分号(%)开始,后跟转换字符。
如下实例:
layout->setConversionPattern("%d{yyyy-MM-dd hh:mm:ss} %p %c %m %r %t %F %M %L %l %n");
  • %d: 输出日志时间点的日期或时间,比如:%d{yyyy-MM-dd hh:mm:ss},输出:2023-10-26 13:37:29
  • %p: 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL,
  • %c:输出Logger 名称
  • %m: 输出代码中指定的消息
  • %r: 输出自应用启动到输出该日志信息耗费的毫秒数
  • %t: 输出线程信息,当用QThread::currentThread()->setObjectName("XXX");设置线程名之后,输出的时线程名:“XXX”(QThread::currentThread()->objectName());没设置线程名,输出的是线程地址:0x000000000xxxxxxxxxx(QThread::currentThread())
  • %F: 输出日志消息产生时所在的文件名称
  • %M:输出日志消息产生时所在的函数名称
  • %L: 输出日志消息产生时所在代码中的行号
  • %l: 输出日志消息产生时所在位置,相当于%F:%L-%M的组合
  • %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"

二、下载

访问下面的网址,下载Log4Qt源码压缩包
https://github.com/MEONMedical/Log4Qt

三、链接库方式使用

下载的压缩包,解压之后,如下图所示,用Qt打开log4qt.pro

选择编译器

右击项目名,进行重新构建

在构建目录中生成log4qt.dll

新建一个Qt项目

在新建的项目中新建一个“bin”文件夹,把刚才生成的log4qt.dll拷贝进去

在新建的项目中新建一个“include/log4qt”文件夹,把下载文件夹中的Log4Qt-master\src\log4qt中的三个文件夹和.h文件拷贝过去

在Log4QtDll.pro文件中增加如下代码:
DESTDIR = $$PWD/bin
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/bin -llog4qt

更改main.cpp中的代码
#include "mainwindow.h"
#include <QApplication>
#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/patternlayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/dailyfileappender.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);//Logger:记录器,有一个根Logger,可以有多个其他LoggerLog4Qt::Logger *logger = Log4Qt::Logger::rootLogger(); //根Logger,name为root//Log4Qt::Logger *mylog1 = Log4Qt::Logger::logger("Mylog1");  //其他Logger,name为Mylog1的logger->setLevel(Log4Qt::Level::DEBUG_INT); //设置日志输出级别Log4Qt::LogManager::setHandleQtMessages(true); //处理qt调试输出信息,将qDebug之类的信息重定向,不开启这个qDebug()、qWri/****************PatternLayout配置日志的输出格式****************************/Log4Qt::PatternLayout *layout = new Log4Qt::PatternLayout();layout->setConversionPattern("%d{yyyy-MM-dd hh:mm:ss} %p %c %m %r %t %F %M %L %l %n");layout->activateOptions(); // 激活Layout/***************************配置日志的输出位置***********///ConsoleAppender:输出到控制台Log4Qt::ConsoleAppender *appender = new Log4Qt::ConsoleAppender(layout, Log4Qt::ConsoleAppender::STDOUT_TARGET);appender->activateOptions();logger->addAppender(appender);//DailyFileAppender:每天新建一个文件,保存当天的日志,超过指定的天数,删除最开始的日志Log4Qt::DailyFileAppender *dailiAppender = new Log4Qt::DailyFileAppender;dailiAppender->setLayout(layout); //设置输出格式dailiAppender->setFile("logFile.log"); //日志文件名:固定前缀dailiAppender->setDatePattern("_yyyy_MM_dd"); //日志文件名:根据每天日志变化的后缀dailiAppender->setAppendFile(true); //true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是falsedailiAppender->setKeepDays(30); //设置保留天数dailiAppender->activateOptions();logger->addAppender(dailiAppender);// 关闭 logger
//    logger->removeAllAppenders();
//    logger->loggerRepository()->shutdown();MainWindow w;w.show();return a.exec();
}

更mainwindow.cpp中的代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << "mainwindow debug";qCritical() << "mainwindow critical";
}MainWindow::~MainWindow()
{delete ui;
}

重新构建,并运行,输出如下:

在项目目录的bin文件夹下生成日志文件

mian.cpp中的代码是设置日志输出格式:
layout->setConversionPattern("%d{yyyy-MM-dd hh:mm:ss} %p %c %m %r %t %F %M %L %l %n");
输出的对应内容如下:
  • %d{yyyy-MM-dd hh:mm:ss}:2023-10-27 10:31:19 
  • %p:DEBUG 
  • %c:Qt default 
  • %m:mainwindow debug 
  • %r:1454 
  • %t:0x000000000d816d00 
  • %F:..\Log4QtDll\mainwindow.cpp 
  • %M:MainWindow::MainWindow(QWidget*) 
  • %L:11 
  • %l:..\Log4QtDll\mainwindow.cpp:11 - MainWindow::MainWindow(QWidget*)
  • %n:换行

四、源码方式使用

新建一个Qt项目

把下载解压的文件夹中的如下文件夹拷贝到新建项目中

再把如下两个文件拷贝到新建项目的log4qt文件夹中

在Log4QtSrc.pro文件中添加如下代码
INCLUDEPATH += $$PWD/log4qt
include($$PWD/log4qt/log4qt.pri)

重新构建

项目结构中出现如下内容,报错先不用管

在log4qt.pri文件中添加如下代码
QT += xml network concurrent sqlDEFINES +=LOG4QT_STATIC
include($$PWD/build.pri)
include($$PWD/g++.pri)

再重新构建

更改main.cpp代码
#include "mainwindow.h"
#include <QApplication>
#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/patternlayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/dailyfileappender.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);//Logger:记录器,有一个根Logger,可以有多个其他LoggerLog4Qt::Logger *logger = Log4Qt::Logger::rootLogger(); //根Logger,name为root//Log4Qt::Logger *mylog1 = Log4Qt::Logger::logger("Mylog1");  //其他Logger,name为Mylog1的logger->setLevel(Log4Qt::Level::DEBUG_INT); //设置日志输出级别Log4Qt::LogManager::setHandleQtMessages(true); //处理qt调试输出信息,将qDebug之类的信息重定向,不开启这个qDebug()、qWri/****************PatternLayout配置日志的输出格式****************************/Log4Qt::PatternLayout *layout = new Log4Qt::PatternLayout();layout->setConversionPattern("%d{yyyy-MM-dd hh:mm:ss} %p %c %m %r %t %F %M %L %l %n");layout->activateOptions(); // 激活Layout/***************************配置日志的输出位置***********///ConsoleAppender:输出到控制台Log4Qt::ConsoleAppender *appender = new Log4Qt::ConsoleAppender(layout, Log4Qt::ConsoleAppender::STDOUT_TARGET);appender->activateOptions();logger->addAppender(appender);//DailyFileAppender:每天新建一个文件,保存当天的日志,超过指定的天数,删除最开始的日志Log4Qt::DailyFileAppender *dailiAppender = new Log4Qt::DailyFileAppender;dailiAppender->setLayout(layout); //设置输出格式dailiAppender->setFile("logFile.log"); //日志文件名:固定前缀dailiAppender->setDatePattern("_yyyy_MM_dd"); //日志文件名:根据每天日志变化的后缀dailiAppender->setAppendFile(true); //true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是falsedailiAppender->setKeepDays(30); //设置保留天数dailiAppender->activateOptions();logger->addAppender(dailiAppender);// 关闭 logger
//    logger->removeAllAppenders();
//    logger->loggerRepository()->shutdown();MainWindow w;w.show();return a.exec();
}

更改mainwindow.cpp的代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << "mainwindow debug";qCritical() << "mainwindow critical";
}MainWindow::~MainWindow()
{delete ui;
}
重新构建,并运行,输出如下:
同时在项目构建目录下生成日志文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css之svg 制作圆及旋转

1.代码 <template><div class"loading-box"><div class"circle-container"><svg width"75" height"75" class"move-left-to-right"><circle cx"37.5" cy"37.5" r"26&…

高端影像仪:打破微小产品测量局限

在现代工业生产中&#xff0c;影像仪以CCD数位影像为基石&#xff0c;将计算机屏幕测量技术与空间几何运算的能力融为一体&#xff0c;可以用于测量微小产品的各种尺寸和形状&#xff0c;为生产过程中的质量控制提供重要的参考依据。 影像仪产品内置高精度光学电动双倍镜头&am…

什么是动态住宅IP?它有什么用途?

随着网络的迅速发展&#xff0c;许多人对代理IP已经有了比较深刻的认识&#xff0c;并且广泛地运用到了各自的业务中&#xff0c;尤其在跨境的相关业务中表现尤其卓越。对于代理IP的类别&#xff0c;也需要根据自己的业务类型具体选择最合适的&#xff0c;那么今天IPFoxy就给大…

网页设计--第5次课后作业

1、快速学习JavaScript的基本知识第1-10章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。需求如下3个&#xff1a; 1&#xff09;点亮灯泡 2&#xff09;将所有的div标签的标签体内容后面加上&#xff1a; very good 3&#xff09;使所有的复选框呈现被选…

【javaWeb】HTTP协议

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. 上图是通过Fiddler对访问百度搜索页时抓取的一个http协议的包。 观察抓包结果,可以看到,当前 http…

myAGV 2023 Pi 全新升级!

Introduction 在高速发展的自动化和机器人技术领域&#xff0c;我们的公司一直致力于提供高效、灵活且可靠的轻量级机械臂解决方案。然而&#xff0c;我们也深知&#xff0c;传统的机械臂需要固定在一个地方&#xff0c;这在一定程度上限制了其在空间上的应用范围。为了突破这一…

【论文阅读】ActiveNeRF:通过不确定性估计候选新视图

【论文阅读】ActiveNeRF: Learning where to See with Uncertainty Estimation Abstract1 Introduction3 Background4 NeRF with Uncertainty Estimation5 ActiveNeRF5.1 Prior and Posterior Distribution5.2 Acquisition Function5.3 Optimization and Inference 6 Experimen…

ECharts配置项手册了解及使用

1&#xff1a;点击文档然后选择配置项手册或者&#xff1a;Documentation - Apache ECharts 2&#xff1a;

中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞)

中间件安全&#xff1a;Weblogic 漏洞.&#xff08;使用工具可以利用多种类型漏洞&#xff09; WebLogic 是美国 Oracle 公司出品的一个 application server&#xff0c;确切的说是一个基于 JAVA EE 架构的中间件&#xff0c;WebLogic 是用于开发、集成、部署和管理大型分布式…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

基于springboot-“有光”摄影分享网站系统(2023年☆全网唯一)【附源码|数据库|表结构|万字文档(LW)|技术文档|说明文档】

主要功能 前台登录&#xff1a; 注册用户&#xff1a;用户账号、密码、姓名、手机号、身份证号、性别、邮箱 用户&#xff1a; ①首页、公告资讯展示、图片素材展示、活动展示、视频素材展示、查看更多 ②论坛、发布帖子、活动、活动标题、活动类型、公告资讯、公告标题、公告…

C#,数值计算——插值和外推,径向基函数插值(RBF_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 径向基函数插值 /// Object for radial basis function interpolation using n points in dim /// dimensions.Call constructor once, then interp as many times as desir…

2023年亚太杯APMCM数学建模大赛B题玻璃温室小气候调控

2023年亚太杯APMCM数学建模大赛 B题 玻璃温室小气候调控 原题再现 温室作物的产量受各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适宜的温度和风速对植物生长至关重要[2]。为了调节玻璃温室内的温度、风速等气候因素&#xff0c;在温室设计中常…

vue3+ts 指令简写

<template><div class"btns"><button v-has-show"shop:create">创建</button><button v-has-show"shop:edit">编辑</button><button v-has-show"shop:delete">删除</button></div…

集软件库、论坛、社区、工具箱、积分商城、会员体系、在线商城一体的后台系统+HBuilderX 前端软件社区

HBuilderX前端软件社区thinkphp后端源码 搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名 电脑需要下载&#xff1a;HBuilderX 下载后 登录账号 没有账号就注册账号 然后上传文件 在选择你上传的文件 即可 打包选择 “发行” 可以打包app h5等等 …

开源语音大语言模型——Qwen-Audio

论文链接&#xff1a;https://arxiv.org/pdf/2311.07919.pdf 开源代码&#xff1a;https://github.com/QwenLM/Qwen-Audio 一、背景 大型语言模型&#xff08;LLMs&#xff09;由于其良好的知识保留能力、复杂的推理和解决问题能力&#xff0c;在通用人工智能&#xff08;AGI…

Matplotlib线形图的创建_Python数据分析与可视化

线形图的创建 绘制线形图设置颜色和风格设置坐标轴上下限设置图形标签 绘制线形图 在所有图形中&#xff0c;最简单的应该就是线性方程y f (x) 的可视化了。来看看如何创建这个简单的线形图。要画Matplotlib图形时&#xff0c;都需要先创建一个图形fig 和一个坐标轴ax。创建图…

Elasticsearch(ES)概述

文章目录 一.什么是Elasticsearch?1.正向索引和倒排索引2.Mysql和ES的概念对比3.安装elasticsearch、kibana 二.IK分词器三.索引库操作四.文档操作五.RestClient操作索引库1.初始化RestClient2.创建索引库3.删除索引库4.判断索引库是否存在 六.RestClient操作文档1.新增文档2.…

Python 新版来袭!3.12.0 安装教程!!

Python是一门面向对象的计算机程序设计语言&#xff0c;以简洁和优雅著称&#xff0c;可以用于网络爬虫、web开发、人工智能、机器学习、数据挖掘及分析等工作&#xff0c;是目前最受欢迎的编程语言之一。 目前常见的Python版本有Python2和Python3&#xff0c;Python3不向下&a…

测试用例设计方法-场景法详解

01 定义 场景法是通过运用场景来对系统的功能点或业务流程的描述&#xff0c;从而提高测试效果的一种方法。 场景法一般包含基本流和备用流&#xff0c;从一个流程开始&#xff0c;通过描述经过的路径来确定的过程&#xff0c;经过遍历所有的基本流和备用流来完成整个场景。 …