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.hqwc.cn/news/223072.html

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

相关文章

概率论与数理统计-第4章 随机变量的数字特征

第4章 随机变量的数字特征 4.1数学期望 一、离散型随机变量的数学期望 定义1设离散型随机变量X的概率分布为 P{Xxi}pi,i1,2,…,如果级数绝对收敛&#xff0c;则定义X的数学期望&#xff08;又称均值&#xff09;为 二、连续型随机变量的数学期望 定义2设X是连续型随机变量…

【新手解答2】深入探索 C 语言:一些常见概念的解析

C语言的相关问题解答 写在最前面问题1变量名是否有可能与变量重名&#xff1f;变量名和变量的关系变量名与变量是否会"重名"举例说明结论 变量则是一个地址不变&#xff0c;值时刻在变的“具体数字”变量的地址和值变量名与数据类型具体化示例结论 问题2关于你给我的…

第二十五章 解析cfg文件及读取获得网络结构

网络结构 以YOLOv3_SPP为例 cfg文件 部分&#xff0c;只是用来展示&#xff0c;全部的代码在文章最后 [net] # Testing # batch1 # subdivisions1 # Training batch64 subdivisions16 width608 height608 channels3 momentum0.9 de…

【Spring Boot】Swagger的常用注解

在Swagger的开发过程中&#xff0c;我们需要在Controller代码等处添加相应的注解&#xff0c;以便可以提高生成的接口文档的可读性为了解决这些问题&#xff0c;Swagger提供了很多的注解&#xff0c;通过这些注解&#xff0c;我们可以更好更清晰的描述我们的接口&#xff0c;包…

Kotlin学习之集合

原文链接 Kotlin Collections 现代的软件一般比较复杂&#xff0c;程序语言中的基本数据类型往往不能满足需要&#xff0c;除了基本的数据类型以外&#xff0c;还有对象的容器也非常的重要&#xff0c;比如线性容器&#xff08;数组&#xff0c;列表和Set&#xff09;和二维容…

线性分类器--图像表示

整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量&#xff01; rbg的图像矩阵转列向量 大小为 32X32 的话&#xff0c;图像矩阵转列向量是多少维&#xff1f; 32x32x3 3072 维列向量

Failed to load resource: the server responded with a status of 404 ()

路径问题&#xff1a; 路径省略前面的http://localhost:8080/ 就行了。

[Spring ~必知必会] Bean 基础常识汇总

文章目录 Bean 相关到底什么是beanFactorybeanFactory能干啥ApplicationContext是什么ApplicationContext的功能比 BeanFactory多了什么 容器的实现BeanFactory的实现ApplicationContext的实现xml 配置配置类配置 Bean 的生命周期3.1 Bean 的常见的后处理器测试代码总结 3.2 工…

vue day2

1、指令修饰符&#xff1a;.指明一些指令后缀&#xff0c;不同后缀封装不同处理操作 按键修饰符&#xff1a;keyup.enter v-model修饰符&#xff1a; v-model.trim&#xff1a;去首位空格 v-model.number&#xff1a;转数字 事件修饰符&#xff1a; 阻止事件冒泡&#xff1…

【vue2】axios请求与axios拦截器的使用详解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;当我们在路由跳转前与后我们可实现触发的操作 【前言】ajax是一种在javaScript代码中发请…

Dockerfile讲解

Dockerfile 1. 构建过程解析2. Dockerfile常用保留字指令3. 案例3.1. 自定义镜像mycentosjava83.2. 虚悬镜像 4. Docker微服务实战 dockerfile是用来构建docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 dockerfile定义了进程需要的一切东西&…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…