文章目录
- 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大小,就会自动滚动
总结
-
通过日志配置文件控制日志信息的输出,如通过调高输出的调试等级减少日志输出
-
将qDebug调试信息直接记录到日志文件
Log4Qt::LogManager::setHandleQtMessages(true);
- 测试例子见最后附件:
Log4Qt_test.rar
log4qt更多请参考:
-
http://log4qt.sourceforge.net/
-
https://logging.apache.org/log4j/2.x/
-
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 积分付费下载,免费拿取源码的请关注公众号后,找到同名文章拿取!或后台给我留言,看到会发送!