log4Qt史上最详细介绍、编译和使用

news2024/11/29 11:37:44

文章目录

    • Log4Qt介绍
    • 下载log4qt源码
    • 测试例子(源码使用)
      • 将log4qt源码添加到工程
        • 测试代码
        • 日志配置文件:
        • 测试结果
    • 总结
      • log4qt更多请参考:
    • 使用Log4Qt动态库
      • 一、创建Qt工程,命名为libLog4Qt
      • 二、在项目根目录下新建文件夹3rdparty,并把下载的源代码中的放置在里面。
      • 三、编辑libLog4Qt.pro内容如下:
      • 四、在以上创建的工程根目录下创建文档 **libLog4Qt.pri**
      • 五、编译项目,我们可以在lib目录下看到四个文件:
      • 六、我们在新项目中使用以上动态库需要做的事情:
    • Qt4版本日志移植到qt5编译过程出现错误
      • 错误一:识别QtMsgHandler类
      • 错误二:QObject类未声明
      • 错误三:QTextCodec编码错误
      • 错误四:操作符“<<”歧义
      • 错误五:qInstallMsgHandle未声明
    • 附件:可以运行的Qt5版本 Log4Qt 测试例子,源码免费拿取

Log4Qt介绍

  Log4Qt是使用Trolltech Qt Framework的Apache Software Foundation Log4j包的C ++端口。它旨在供开源和商业Qt项目使用。所以 Log4Qt 是Apache Log4J 的Qt移植版,所以看Log4J的资料应该是最直接有效的(因为 Log4Qt的直接资料太少了)。

  Log4Qt主要是用来记录日志(有助于程序调试)。有3个主要的组件:

1、Logger

  提供日志记录服务,可以有多个Logger存在,每个有它们自己的名字。Logger间存在隶属关系,有一个Logger称为根Logger。

2、Appender

  用来指明将日志记录到什么地方:比如,控制台、文件、数据库,等等

3、Layout

  控制日志的输出格式,可以类比一下C中的printf哈。

下载log4qt源码

源码下载

当前最新版本为log4qt-0.3.zip,这源码包最后修改日期为2009年3月1日。
Sourceforge 下载地址:

https://sourceforge.net/projects/log4qt/
或者

https://github.com/devbean/log4qt

或者

https://gitee.com/mirrors/log4qt

上面源码版本都是基于Qt4版本的,所以在Qt5上编译运行需要更改一些源码的报错, 最后会有相关的报错解决方案

测试例子(源码使用)

将log4qt源码添加到工程

在这里插入图片描述

测试代码

保存到指定日志文件,滚动式存储,限制日志文件个数,限制日志文件大小。

#include <QCoreApplication>
 
/* log4qt头文件引用 */
#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/propertyconfigurator.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    /* 根据指定的日志配置文件初始化日志 */
    Log4Qt::PropertyConfigurator::configure(a.applicationDirPath() + "/log.conf");
    Log4Qt::Logger *mylog1 = Log4Qt::Logger::logger("Mylog1");
 
    /* 日志输出 */
    mylog1->debug("log debug");
    mylog1->info("log info");
    mylog1->warn("log warn");
    mylog1->error("log error");
    mylog1->fatal("log fatal");
 
//     //测试日志滚动
//    for (unsigned int i = 0; i < 30000; i++) {
//        mylog1->debug(QString::asprintf("log for qt test i=%u.", i));
//    }
 
    /* 处理qt调试输出信息,将qDebug之类的信息重定向到日志文件 */
    Log4Qt::LogManager::setHandleQtMessages(true);
    qDebug("qDebug");
    qInfo("qInfo");
    qWarning("qWarning");
    qCritical("qCritical");
    qFatal("qCritical");
 
    return a.exec();
}

日志配置文件:

log4j.rootLogger=WARN,Mylog1   这里的WARN表示日志仅记录WARN及以上等级的输出,DEBUG,INFO不做记录
log4j.appender.Mylog1=org.apache.log4j.FileAppender 将日志记录到文件
log4j.appender.Mylog1=org.apache.log4j.RollingFileAppender 滚动时存储
log4j.appender.Mylog1.layout=org.apache.log4j.PatternLayout
log4j.appender.Mylog1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] :%m%n日志输出格式,%m表示日志信息字符串,%n表示换行
log4j.appender.Mylog1.File=mytest.log 日志文件名称
log4j.appender.Mylog1.MaxFileSize=50KB 每个日志文件最大大小,其它单位MB,GB
log4j.appender.Mylog1.MaxBackupIndex=2 日志滚动个数,这里2就是只生成mytest.log.1 mytest.log.2
log4j.appender.Mylog1.AppendFile=true 追加模式
log4j.appender.Mylog1.ImmediateFlush=true 立即输出

测试结果

日志文件输出

在这里插入图片描述

日志滚动:
在这里插入图片描述

为了测试滚动,所以将log4j.appender.Mylog1.MaxFileSize=1KB, 改成了1KB大小,就会自动滚动

总结

  1. 通过日志配置文件控制日志信息的输出,如通过调高输出的调试等级减少日志输出

  2. 将qDebug调试信息直接记录到日志文件

Log4Qt::LogManager::setHandleQtMessages(true);
  1. 测试例子见最后附件:Log4Qt_test.rar

log4qt更多请参考:

  1. http://log4qt.sourceforge.net/

  2. https://logging.apache.org/log4j/2.x/

  3. https://github.com/devbean/log4qt

附:

自己封装一层,进行格式化,以添加输出当前文件名,函数名,代码行(%M%L貌似无效)

见最后附件:Log4Qt_test02.rar

使用Log4Qt动态库

由于程序中包含很多动态库,而几乎每个动态库都需要使用log功能,此时直接包含Log4Qt的源码或者使用静态库都不是太好的注意。所以:使用动态库

其实只要写好工程文件,使用动态库也很简单:

一、创建Qt工程,命名为libLog4Qt

二、在项目根目录下新建文件夹3rdparty,并把下载的源代码中的放置在里面。

三、编辑libLog4Qt.pro内容如下:

目的:构建一个动态库

TEMPLATE = lib
CONFIG += log4qt-buildlib
QT += core xml network

include(liblog4qt.pri)
TARGET = $$LIBLOG4QT_NAME
DESTDIR = $$PROJECT_LIBDIR
win32{
    DLLDESTDIR = $$PROJECT_BINDIR
    QMAKE_DISTCLEAN += $$PROJECT_BINDIR/$${LIBLOG4QT_NAME}.dll
}
CONFIG += debug_and_release build_all

LOG4QT_VERSION_MAJOR = 1
LOG4QT_VERSION_MINOR = 0
LOG4QT_VERSION_RELEASE = 0

LOG4QT_VERSION = '\\"$${LOG4QT_VERSION_MAJOR}.$${LOG4QT_VERSION_MINOR}.$${LOG4QT_VERSION_RELEASE}\\"'
DEFINES += LOG4QT_VERSION_STR=\"$${LOG4QT_VERSION}\"
DEFINES += LOG4QT_VERSION=$${LOG4QT_VERSION}

VERSION = 1.0.0

DEPENDPATH += src src/helpers src/spisrc/ varia
INCLUDEPATH += src src/helpers src/spi src/varia

四、在以上创建的工程根目录下创建文档 libLog4Qt.pri

编辑 libLog4Qt.pri 如下:

一开始定义几个变量:

  • 我们下载的 log4qt 所放置的目录
  • 我们的库文件准备放置到的路径(所有的动态库都需要这个,放置到单独一个common.pri中更好)
  • 库文件的名字(使用了qtLibraryTarget,这样在windows下debug和release自动拥有不同的名字,而且对我们是透明的,因为我们只在这一个文件内指定库文件的名字。)
LOG4QTSRCPATH = $$PWD/3rdparty/log4qt/src/log4qt
PROJECT_LIBDIR = $$PWD/lib
PROJECT_BINDIR = $$PWD/bin

TEMPLATE += fakelib
LIBLOG4QT_NAME = $$qtLibraryTarget(hlog4qt)
TEMPLATE -= fakelib

INCLUDEPATH += $$LOG4QTSRCPATH
DEPENDPATH += $$LOG4QTSRCPATH

!log4qt-buildlib{
    DEFINES += LOG4QT_IMPORTS
    LIBS +=  -L$$PROJECT_LIBDIR  -l$$LIBLOG4QT_NAME
}else{
    DEFINES += LOG4QT_EXPORTS
    INCLUDEPATH += -L$$PROJECT_LIBDIR $$LOG4QTSRCPATH/helpers \
                   $$LOG4QTSRCPATH/spi \
                   $$LOG4QTSRCPATH/varia
    DEPENDPATH += $$LOG4QTSRCPATH/helpers \
                   $$LOG4QTSRCPATH/spi \
                   $$LOG4QTSRCPATH/varia
    include($$LOG4QTSRCPATH/Log4Qt.pri)
}
文件名目的描述
创建libLog4Qt.pro用来构建动态库可以单独存在,也可以被上级的pro文件所包含(通过subdir)
创建libLog4Qt.pri用来构建和使用动态库任何需要使用log工程的pro文件,只需要include该文件即可

五、编译项目,我们可以在lib目录下看到四个文件:

 libhlog4qt.so libhlog4qt.so.1 libhlog4qt.so.1.0 libhlog4qt.so.1.0.0

这表明我们已经成功构建来关于 Log4Qt 的动态库了。

下面,我们就可以使用上面生成的动态库。

六、我们在新项目中使用以上动态库需要做的事情:

在.pro中加入:

LIBS += -L$$PWD/3rdParty/lib/ -lhlog4qt

INCLUDEPATH += $$PWD/3rdParty
DEPENDPATH += $$PWD/3rdParty

并在使用前包含头文件和使用log:

#include "logger.h"
#include "basicconfigurator.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Log4Qt::BasicConfigurator::configure();
    Log4Qt::Logger * log = Log4Qt::Logger::rootLogger();
    log->debug("Hello DbZhang800!");
    log->info("Hello Qt!");
    log->warn("Hello 1+1=2");
    return 0;
}

至此,我们已可以成功使用Log4Qt了。

Qt4版本日志移植到qt5编译过程出现错误

错误一:识别QtMsgHandler类

“error: 'QtMsgHandler' does not name a type”
在这里插入图片描述

解决方法:

QtMsgHandler替换为QtMessageHandler
Qt5做了一些更改:
在这里插入图片描述

更改如下图:
在这里插入图片描述

错误二:QObject类未声明

点击跳转到错误文件,添加QObject

错误三:QTextCodec编码错误

在这里插入图片描述

点击跳转到错误文件,修改 log4qt 源码:
在这里插入图片描述

错误四:操作符“<<”歧义

在这里插入图片描述

点击跳转到错误文件,修改 log4qt 源码:
在这里插入图片描述

错误五:qInstallMsgHandle未声明

在这里插入图片描述

宏修改如下:
在这里插入图片描述

附件:可以运行的Qt5版本 Log4Qt 测试例子,源码免费拿取

csdn 积分下载

不想 CSDN 积分付费下载,免费拿取源码的请关注公众号后,找到同名文章拿取!或后台给我留言,看到会发送!

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

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

相关文章

Simulink使能(Enable)、触发(Triggered)模块及其子系统的应用

Simulink中的使能&#xff08;Enable&#xff09;和触发&#xff08;Triggered&#xff09;模块及其子系统可以用于控制模型中的仿真运行时间和采样周期&#xff0c;从而提高模型的仿真效率和精度。 使用使能子系统 创建一个在控制信号为正值时执行的子系统。使用触发子系统 创…

如何系列 如何在Windows和Linux安装Nginx

文章目录 Windows一 下载Nginx二 启动Nginx三 验证 Linux一 安装依赖项二 下载Nginx源码包三 安装四 验证五 常用命令附录 Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;被广泛用于构建现代化的Web应用和提供静态内容。本篇博文将教你如何在Windows和Linux操作…

Vue 前端代码多地部署(打包后配置动态IP)

Vue 前端代码多地部署&#xff08;打包后配置动态IP&#xff09; 需求一、使用 config.json二、使用 config.js 需求 vue 代码打包之后&#xff0c;需要在多个地方部署。正常操作是&#xff1a;先改 ip 地址&#xff0c;再打包。这样每换一个地方部署&#xff0c;就需要重新打…

将自己写的nginx.conf运行到阿里云linux服务器上

首先 你要保证自己的nginx.conf没有问题 可以先在本地运行一下 然后来到nginx.conf文件的所在目录 利用 scp -r ./nginx.conf 用户名(如果之前没设置过就是 root)服务器公网地址:/etc/nginx/将文件传到服务器上去 这里需要注意 如果你的服务器之前没有装过nginx 是没有这个目…

C语言实现随机点名器

目录 1、程序描述 2、程序功能 3、功能详细实现过程 学生结构体声明和定义 菜单&#xff08;menu&#xff09;函数 文件读取和保存函数 查询函数 点名函数 rand函数 点名函数实现 点名次数归零函数 字体颜色变化函数 4、运行效果 5、源码分享 1、程序描述 只使用…

ANR实战案例 2 - 不同线程状态ANR示例

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Blocked状态示例1.启动初始化阻塞案例trace1.tx 2.ConcurrentHashMap分段锁优…

互联网营销之何谓真需求-想知道如何挖掘真需求看这篇就对了

互联网营销思维是以爆品为核心的迭代思维&#xff0c;本文结合“生日蛋糕”、“方便面”、“蜜雪冰城”几个小例子&#xff0c;以及我们具体的工作&#xff0c;展开聊聊什么是“真需求”。 1. 互联网营销和传统营销的区别 1.1 传统的营销思维&#xff1a; “定位4P&#xff0…

亚马逊云科技:使用Inf2实例运行大语言模型GPT-J-6B基础设施

在2019年的亚马逊云科技re:Invent上&#xff0c;亚马逊云科技发布了Inferentia芯片和Inf1实例这两个基础设施。Inferentia是一种高性能机器学习推理芯片&#xff0c;由亚马逊云科技定制设计&#xff0c;其目的是提供具有成本效益的大规模低延迟预测。时隔四年&#xff0c;2023年…

金融行业软件测试面试必备:答案详解与干货技巧

大家好&#xff0c;今天我要和大家分享的是我多年从事金融行业软件测试的心得体会。由于金融行业涉及到的数据量非常大&#xff0c;系统功能也十分复杂&#xff0c;因此在招聘软件测试人员时&#xff0c;往往会提出一些具有挑战性的问题。 作为一个资深面试官&#xff0c;我也…

Android aidl及binder基础知识巩固

作者&#xff1a;义华 1、什么是binder binder是android framework提供的&#xff0c;用于跨进程方法调用的机制&#xff0c;具有安全高效等特点。 我们知道&#xff0c;在 Android 系统中&#xff0c;每个应用程序都运行在一个独立的进程中&#xff0c;各个进程之间需要进行…

Logstash-grok表达式常用模式与正则使用与测试

Logstash 常用字符解释常用模式使用方式 使用正则表达式使用方式 测试用例 常用字符解释 \ 表示匹配 \s* 匹配空格&#xff08;可多个&#xff09; \w 匹配字符&#xff08;可多个&#xff09;常用模式 %{HOSTNAME}&#xff0c;匹配请求的主机名 %{TIMESTAMP_ISO8601:time…

探索智能化:TOOM解析未来稿件校验系统的技术进展与应用展望

在信息时代&#xff0c;随着大数据、人工智能和自然语言处理等技术的快速发展&#xff0c;稿件校验系统正朝着智能化的方向迈进。智能化的稿件校验系统能够更准确、高效地检测虚假信息、抄袭行为以及提升文章质量。本文将探讨智能化稿件校验系统的技术进展与应用展望&#xff0…

NC与单一窗口数据对接丨外贸软件

在国际贸易通关过程中&#xff0c;所涉及相关部门的信息管理&#xff0c;主要是以数字化流程系统为主&#xff0c;让每个部门业务的申请、办理、回复采用电子化和互联网化。由于每个环节部分的数据壁垒未打通&#xff0c;数据无法协同共享&#xff0c;导致在口岸通关的过程中&a…

Swoole定时器实现毫秒级任务调度

简介 Timer 毫秒精度的定时器&#xff0c;底层基于 epoll_wait 和 setitimer 实现&#xff0c;数据结构使用最小堆&#xff0c;可支持添加大量定时器&#xff0c;使用最小堆数据结构实现的定时器&#xff0c;类似 JavaScript 的 setInterval&#xff0c;Swoole 定时器的添加和…

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信&#xff0c;则每个设备得需要两组窗口&#xff0c;为3组相互独立的窗口通讯 为解决这个问题&#xff1a;设计了总线通讯&#xff0c;有多种&#xff0c;I2C为其中一种 二、I2C通信 &#xff08;1&#…

(java)异常 (详解)

目录 1. 异常的概念 1. 算术异常 2.空指针异常 3.数组越界异常 4.在编译时就发现了异常 2.异常的体系结构 总结&#xff1a; 3.异常的分类 4.异常的处理 1 .防御式编程 2.异常的抛出 3 .异常的捕获 3.1 .异常声明throws throw和throws的区别&#xff1f; …

【笔试强训选择题】Day13.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

昨天的测试岗面试,仅仅4个问题,轻松让面试者破防了

目录 引言 你看&#xff0c;一不小心&#xff0c;就要被虐&#xff01;&#xff01; 自动化测试到底该如何学&#xff1f; 一、Python编程学习内容 二、WEB自动化测试学习内容 三、APP自动化测试学习内容 四、Postman接口测试工具学习内容 五、接口自动化测试学习内容 …

微服务框架【Nacos配置管理-Feign远程调用-Gateway服务网关】

一、Nacos配置管理 1.统一配置管理 在Nacos中添加配置信息 填写配置信息 点击发布 完成配置的统一管理 配置获取的步骤&#xff1a; 项目启动->读取本地配置文件application.yml->创建spring容器->加载bean 但是现在多了一个nacos中的配置文件&#xff0c;我们…

IntelliJ IDEA 统一设置编码为utf-8编码 及 SpringBoot 打 jar 包运行 在windows 平台控制台和日志 乱码解决

文章目录 一、背景二、知识准备三、程序运行源代码历经处理阶段四、问题描述五、解决方法1.修改项目编码格式统一为UTF-82.将项目中的.idea文件夹中的encodings.xml文件中的编码格式改为uft-83.File->Settings->Build,Execution,Deployment -> Compiler -> Java Co…