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 积分下载

不想 优快云 积分付费下载,免费拿取源码的请关注公众号后,找到同名文章拿取!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fu_Lin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值