• log4qt库的使用


    log4qt库的使用

    一,什么是log4qt?

    Log4Qt是一个用于Qt应用程序的开源日志记录库。它是基于Apache Log4j的C++实现,并提供了一种灵活和可配置的方式来记录应用程序的日志信息。

    Log4Qt允许你在应用程序中定义日志记录器、日志级别和日志输出目标,并根据需要进行动态配置。它支持多个日志记录器以及不同的日志级别,使你能够根据应用程序的需要进行细粒度的日志控制。

    使用Log4Qt,你可以将日志信息输出到不同的目标,例如控制台、文件、网络套接字等。它还支持日志消息的格式化,包括日期、时间、日志级别、线程信息等。

    Log4Qt 是Log4cpp 的Qt移植版,所以看Log4cpp的资料应该是最直接有效的(因为 Log4Qt的直接资料太少了)。

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

    1. Logger
    提供日志记录服务,可以有多个Logger存在,每个有它们自己的名字。Logger间存在隶属关系,有一个Logger称为根Logger。
      2. Appender
    用来指明将日志记录到什么地方:比如,控制台、文件、数据库,等等
      3. Layout
    控制日志的输出格式,可以类比一下C中的printf。

    二,log4qt的下载

    log4qt下载地址:

    https://github.com/MEONMedical/Log4Qt

    三,如何集成log4qt?

    1.在vs2022中集成log4qt的方法:

    模块一:配置log4qt的步骤

    步骤一,将下好的log4qt库进行解压,然后再库文件中,新建build和Log4Qt文件夹

    在这里插入图片描述

    步骤二,打开cmake,有两个填写路径的位置.

    一个填log4qt库所在的路径,另一个填build的绝对路径,如下图:

    在这里插入图片描述

    步骤三,点击cmake的configure按钮,按照下图进行选择,然后点击finish

    在这里插入图片描述

    步骤四,Configuring done之后,点击Generate

    在这里插入图片描述

    步骤五,修改cmake的CMAKE_INSTALL_PREFIX路径为步骤一中,我们创建好的Log4Qt文件夹的绝对路径(剧透一下,这个目录,将产生log4qt的动态库,静态库以及库的头文件)

    在这里插入图片描述

    然后再次点击Configuring done,然后点击Generate

    步骤六,点击cmake的Open Project

    在这里插入图片描述

    然后,系统将自动打开vs2022,如下图:

    在这里插入图片描述

    步骤七,将编译模式改为Release,然后右击生成ALL_BUILD和INSTALL

    在这里插入图片描述

    当生成完成之后,打开Log4Qt(就是步骤一创建的那个文件夹),就会有如下效果:

    在这里插入图片描述

    步骤八,打开集成在vs2022的任意一个qt项目

    1)打开项目属性页

    在这里插入图片描述

    2)在c/c++常规中,在附加包含目录下添加生成库的头文件的路径,也就是步骤七生成的include文件夹的绝对路径
    D:\vs2022\Log4Qt-master\Log4Qt-master\Log4Qt\include
    在这里插入图片描述

    然后确定->应用->确定

    3)链接器->常规->附加库目录->添加步骤七生成的lib文件夹的绝对路径
    D:\vs2022\Log4Qt-master\Log4Qt-master\Log4Qt\lib
    在这里插入图片描述

    4)链接器->输入->附加依赖项->添加log4qt.lib
    log4qt.lib
    在这里插入图片描述

    5)将log4qt.dll放在项目的可执行目录(即存放exe文件的地方)
    D:\vs2022\Log4Qt-master\Log4Qt-master\Log4Qt\bin
    在这里插入图片描述

    6)验证一下:

    在任意一个cpp文件中添加如下头文件:
    #include
    #include
    #include
    #include
    #include 
    #include
    #include
    
    
    
    然后再cpp文件中加入如下代码进行验证:
    Log4Qt::Logger* logger = Log4Qt::Logger::logger("MyLogger");
    logger->setLevel(Log4Qt::Level::DEBUG_INT); // 设置日志级别为DEBUG
    
    
    // 配置ConsoleAppender 日志输出到控制台
    Log4Qt::ConsoleAppender* consoleAppender = new Log4Qt::ConsoleAppender();
    
    
    Log4Qt::PatternLayout* layout = new Log4Qt::PatternLayout();
    layout->setConversionPattern("%d [%t] %-5p %c - %m%n"); // 设置日志消息的格式
    consoleAppender->setLayout(layout); // 设置布局
    consoleAppender->activateOptions(); // 激活Appender配置选项
    
    consoleAppender->setThreshold(Log4Qt::Level::DEBUG_INT); // 设置Appender的阈值级别
    consoleAppender->activateOptions(); // 激活Appender配置选项
    
    // 添加Appender到Logger
    logger->addAppender(consoleAppender);
    
    // 使用Logger对象记录日志消息
    logger->debug("This is a debug message");
    logger->info("This is an info message");
    logger->warn("This is a warning message");
    logger->error("This is an error message");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述


    模块二:当我们集成好log4qt之后,有两种可以使用日志的方式:

    方式一,直接使用conf文件,在项目中进行加载conf文件,加载好之后,所有的qDebug,qInfo(),qWaring()代码,都会以日志的形式在控制台打印出来,并保存到文本文档中(当然,conf里面的配置文件可以随便改)

    目前我改好的conf文件有如下效果:

    -将qDebug,qInfo(),qWaring()替换为%d{yyyy,MM,dd HH:mm:ss} [%t] {%l} %-5p %c - %m%n的格式(具体想要以什么格式将信息打印出来,还可以在conf文件中自定义修改)

    -在控制台打印信息的同时,还可以将日志信息保存在本地(目前我编辑的这个log4qt.conf文件的效果是:在同级目录下,自动创建一个logs的文件夹,日志文件都会保存在这里面)

    -日志文件的名字为当前年月日.log为名字,每天的日志文件都会保存在当天的这个log文件中

    在这里插入图片描述


    方式一的具体操作方法如下:

    1)将log4qt.conf放在可执行目录下

    如果你是在Release模式下运行,就把log4qt.conf放在Release目录下;
    如果你是在Debug模式下运行,就把log4qt.conf放在Debug目录下;
    
    我是在Release模式下运行,所以我放在Release目录下,如下图:
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2)在项目中加载log4qt.conf.

    先说一下我的项目结构:

    目前我的源文件及头文件只有MainWindow.h,MainWindow.cpp,main.cpp三个文件(当然,qt的ui文件就不说了),我在MainWindow的构造函数中加载(或者说初始化)log4qt.conf之后, 当在mian.cpp中创建完MainWindow 对象之后,项目的其他所有地方的日志系统都会生效.

    在这里插入图片描述

    1)在MainWindow.cpp中加上如下头文件:

    #include
    #include
    #include
    #include
    #include 
    #include
    #include
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2)在MainWindow的构造函数中加入下面两行代码:

    Log4Qt::PropertyConfigurator::configure("D:/vs2022/code/QtVTKProject2/build/Release/log4qt.conf");//从log4qt.conf的绝对路径中去加载这个项目(或者改成相对路径也可)
    Log4Qt::LogManager::setHandleQtMessages(true);//启用 Log4Qt 库处理 Qt 框架的消息。(即使你已经加载了log4qt.conf文件,但是默认情况下它不会处理 Qt 框架生成的日志消息,所以我们需要进行启动。)
    
    • 1
    • 2

    在这里插入图片描述

    3)测试

    qDebug() << "Log4Qt test begin";
    qDebug() << QString::fromLocal8Bit("我是启用log4qt后的qDebug");
    qInfo() << QString::fromLocal8Bit("我是启用log4qt后的qInfo");
    qWarning() << QString::fromLocal8Bit("我是启用log4qt后的qWarning");
    //qFatal注释掉了,是因为qFatal一旦调用,系统就会短暂停留两秒,然后立刻终止程序!!!
    //qFatal()<< QString::fromLocal8Bit("我是启用log4qt后的qFatal");
    qDebug() << "Log4Qt test end";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    运行效果:

    在这里插入图片描述

    方式二,不使用conf文件,直接在项目中调用log4qt库中的代码

    方式二的具体操作方法如下:

    在项目中,添加如下两个文件:Logger.h与Logger.cpp,然后以在MainWindow.cpp演示为例:

    //Logger.h
    #pragma once
    
    #include 
    #include 
    #include 
    #include 
    #include //输出到控制台
    #include //重定向到文本文件中
    #include 
    #include 
    
    #include //获取时间
    //#include //设置文本编码,但是不能用,因为已经被Qt5.15.2弃用了
    
    namespace wxn {
    	class Logger
    	{
    	private:
    		Log4Qt::Logger* logger_;//日志记录器类
    		Log4Qt::ConsoleAppender* consoleAppender_;
    		QDate currentData_;
    
    
    		Log4Qt::FileAppender* fileAppender_;
    		QString filename_;
    		Log4Qt::PatternLayout* layout_;
    	public:
    
    		Logger(QString LogName);
    		~Logger();
    		QString getTime();
    		void init();
    
    		void Debug(const char* message);
    		void Info(const char* message);
    		void Warn(const char* message);
    		void Error(const char* message);
    	};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    //Logger.cpp
    #include "Logger.h"
    
    
    wxn::Logger::Logger(QString LogName) {
    	logger_ = Log4Qt::Logger::logger(LogName);//传入的是日志记录器类的名字
    	consoleAppender_ = new Log4Qt::ConsoleAppender();// 配置ConsoleAppender 日志输出到控制台
    	currentData_ = QDate::currentDate();
    	fileAppender_ = new Log4Qt::FileAppender();
    
    	layout_ = new Log4Qt::PatternLayout();//设置日志格式,布局//
    
    }
    wxn::Logger::~Logger()
    {
    	//if(logger_) delete logger_;//Log4Qt::Logger这个类的析构函数时私有的,不可访问
    	if (consoleAppender_)delete consoleAppender_;
    	//if (currentData_)delete currentData_; //QDate对象会在其作用域结束时自动销毁,不需要手动释放。
    	if (fileAppender_)delete fileAppender_;
    
    	if (layout_)delete layout_;
    }
    
    
    QString wxn::Logger::getTime() {
    	int year = currentData_.year();
    	int month = currentData_.month();
    	int day = currentData_.day();
    	return QString::number(year) + "_"
    		+ QString::number(month).rightJustified(2, '0')
    		+ "_" + QString::number(day).rightJustified(2, '0');//将月份和日期转换为2位数的字符串
    }
    void wxn::Logger::init()
    {
    	logger_->setLevel(Log4Qt::Level::DEBUG_INT); // 设置日志级别为DEBUG
    	logger_->addAppender(consoleAppender_);// 添加Appender到Logger
    
    	QString filename;
    	filename += "./logs/";
    	filename += getTime();
    	filename += ".log";
    	fileAppender_->setFile(filename);//设置log文本的位置
    	fileAppender_->setAppendFile(true);//让log内容在文本中追加,而不是每次都重新写入
    
    	logger_->addAppender(fileAppender_);// 添加Appender到Logger
    
    	layout_->setConversionPattern("%d{yyyy-MM-dd hh:mm::ss} [%t] [%L] %-5p %c - %m%n"); // 设置日志消息的格式
    	consoleAppender_->setLayout(layout_);//给控制台设置布局
    	fileAppender_->setLayout(layout_); // 给文本设置布局
    
    
    	//对于控制台:
    	consoleAppender_->activateOptions(); // 激活Appender配置选项
    	consoleAppender_->setThreshold(Log4Qt::Level::DEBUG_INT); // 设置Appender的阈值级别
    
    
    	//对于输出到文本中:
    	fileAppender_->activateOptions(); // 激活Appender配置选项
    	fileAppender_->setThreshold(Log4Qt::Level::DEBUG_INT); // 设置Appender的阈值级别
    
    }
    
    void wxn::Logger::Debug(const char* message)
    {
    	QString qstr = QString::fromUtf8(message); // 将const char*转换为QString
    
    	// 将消息转换为指定编码
    	QByteArray asciiData = qstr.toLatin1(); // 将QString转换为ASCII编码的QByteArray
    
    	logger_->debug(asciiData.constData());// asciiData.constData():获取ASCII编码的C风格字符串
    }
    
    void wxn::Logger::Info(const char* message)
    {
    	QString qstr = QString::fromUtf8(message); // 将const char*转换为QString
    
    	// 将消息转换为指定编码
    	QByteArray asciiData = qstr.toLatin1(); // 将QString转换为ASCII编码的QByteArray
    
    	logger_->info(asciiData.constData());// asciiData.constData():获取ASCII编码的C风格字符串
    }
    void wxn::Logger::Warn(const char* message)
    {
    	QString qstr = QString::fromUtf8(message); // 将const char*转换为QString
    
    	// 将消息转换为指定编码
    	QByteArray asciiData = qstr.toLatin1(); // 将QString转换为ASCII编码的QByteArray
    
    	logger_->warn(asciiData.constData());// asciiData.constData():获取ASCII编码的C风格字符串
    }
    void wxn::Logger::Error(const char* message)
    {
    	QString qstr = QString::fromUtf8(message); // 将const char*转换为QString
    
    	// 将消息转换为指定编码
    	QByteArray asciiData = qstr.toLatin1(); // 将QString转换为ASCII编码的QByteArray
    
    	logger_->error(asciiData.constData());// asciiData.constData():获取ASCII编码的C风格字符串
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    //MainWindow.cpp
    #include 
    #include "ui_MainWindow.h"
    
    #include 
    #include 
    #include 
    #include 
    
    #include "Logger.h"
    
    #include 
    
    class CVector3d {
    public:
        float x;
        float y;
        float z;
    
        const char* getInfo()
        {
            QString information;
            information = "x:" + QString::number(x)+",y:"+QString::number(y)+",z:"+QString::number(z);
    
            QByteArray byteArray = information.toUtf8(); // 将 QString 转换为 UTF-8 编码的 QByteArray
    
            return byteArray.constData();
        }
        
    };
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow),
        mRenderWindow(vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New()),
        mRenderer(vtkSmartPointer<vtkRenderer> ::New()),
        mInteractor(vtkSmartPointer<QVTKInteractor> ::New()),
        mInteractorStyle(vtkSmartPointer<vtkInteractorStyle> ::New())
    {
        ui->setupUi(this);
    
        /*****log4qt使用示例-begin******/
        wxn::Logger *logger = new  wxn::Logger("MyLogger");
        logger->init();
        // 使用Logger对象记录日志消息
        logger->Debug("==================================");
        logger->Debug("This is a debug message");
        logger->Info("This is an info message");
        logger->Warn("This is a warning message");
        logger->Error("This is an error message");
    
        CVector3d cv3d({1.236,2.347,4.156});
        logger->Debug(cv3d.getInfo());
    	/*****log4qt使用示例-end******/
        
    
        // Set up the rendering
        mRenderWindow->AddRenderer(mRenderer);
        mRenderWindow->SetInteractor(mInteractor);
        /*
        * 在文件 QVTKOpenGLStereoWidget.cxx 的第 137 行中,
        * 函数 SetRenderWindow 在 VTK 9.0 中已被弃用,并将在将来的版本中被移除。
        * 相反,你应该使用 QVTKOpenGLStereoWidget 类提供的 setRenderWindow 函数。
        */
        ui->openGLWidget->setRenderWindow(mRenderWindow);
        mInteractor->SetInteractorStyle(mInteractorStyle);
        mInteractor->Initialize();
    
        // Set the background color
        mRenderer->SetBackground(1, 0, 0);
    
        //Set the UI connections
        QObject::connect(ui->drawSphere_button, &QPushButton::clicked,
            this, &MainWindow::onDrawSphereClick);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::onDrawSphereClick()
    {
        // Create sphere
        vtkSmartPointer<vtkSphereSource> sphereSource =
            vtkSmartPointer<vtkSphereSource>::New();
        sphereSource->SetRadius(5);
        sphereSource->Update();
    
        //Create the actor where the sphere is rendered
        vtkSmartPointer<vtkPolyDataMapper> sphereMapper =
            vtkSmartPointer<vtkPolyDataMapper>::New();
        sphereMapper->SetInputData(sphereSource->GetOutput());
    
        vtkSmartPointer<vtkActor> sphere = vtkSmartPointer<vtkActor>::New();
        sphere->SetMapper(sphereMapper);
    
        //Add the sphere actor to the OpenGL
        mRenderer->AddViewProp(sphere);
        mRenderer->ResetCamera();
        mRenderWindow->Render();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103

    2.在QtCreator中集成log4qt的方法:

    步骤一,新建一个qt项目,比如:MyLog4qtProject

    如图一所示:

    在这里插入图片描述

    步骤二,将log4qt库的源码复制,放在MyLog4qtProject\目录下

    1)log4qt库源码的位置

    (在你从github上下载的log4qt库的src目录下,有个log4qt文件夹,就是源码)

    如图二所示:

    在这里插入图片描述

    2)将log4qt源码放在MyLog4qtProject\目录下

    如图三所示:

    在这里插入图片描述

    步骤三,配置MyLog4qtProject.pro文件

    1)如果你的项目结构和图三一样,那么你可以直接复制下面的已经配置内容:

    QT       += core gui network concurrent
    
    
    DEFINES +=LOG4QT_STATIC
    
    LOG4QTSRCPATH = $$PWD/log4qt
    
    INCLUDEPATH += -L $$LOG4QTSRCPATH \
                    $$LOG4QTSRCPATH/helpers \
                     $$LOG4QTSRCPATH/spi \
                     $$LOG4QTSRCPATH/varia
    
    DEPENDPATH  +=  $$LOG4QTSRCPATH \
                $$LOG4QTSRCPATH/helpers \
                $$LOG4QTSRCPATH/spi \
                $$LOG4QTSRCPATH/varia
    
    include($$PWD/log4qt/log4qt.pri)
    
    
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++17
    
    # You can make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        main.cpp \
        MainWindow.cpp
    
    HEADERS += \
        MainWindow.h
    
    FORMS += \
        MainWindow.ui
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    与原来的MyLog4qtProject.pro文件相比,新MyLog4qtProject.pro文件有以下变化,

    如图四所示:

    在这里插入图片描述

    以下是对新添加的代码的解释:
    1.QT       += core gui network concurrent
    我们新引入了network和concurrent模块,
    network :提供网络功能(因为日志肯定是要获取当前的时间的)
    concurrent :提供多线程和并发编程的支持(日志写入文本,肯定就会用到读写锁,来保证日志的线程安全)
    
    2.DEFINES +=LOG4QT_STATIC 
    告诉编译器,我们是用静态链接的方法,将Log4Qt 库的代码编译并链接到最终的可执行文件中,而不是作为动态库加载运行.
    
    3.LOG4QTSRCPATH = $$PWD/log4qt
    $$PWD 是一个预定义变量,表示当前工程文件的所在路径。
    这里将 LOG4QTSRCPATH 设置为当前工程文件所在路径下的 log4qt 目录。
    
    4.INCLUDEPATH += -L $$LOG4QTSRCPATH \
                    $$LOG4QTSRCPATH/helpers \
                     $$LOG4QTSRCPATH/spi \
                     $$LOG4QTSRCPATH/varia
    
    5.DEPENDPATH  +=  $$LOG4QTSRCPATH \
                $$LOG4QTSRCPATH/helpers \
                $$LOG4QTSRCPATH/spi \
                $$LOG4QTSRCPATH/varia
    INCLUDEPATH 和 DEPENDPATH: 这两个变量用于指定包含和依赖搜索路径。通过将 Log4Qt 的不同子目录添加到这些变量中,确保编译器和构建系统能够找到 Log4Qt 源代码所在的位置。
    6.include($$PWD/log4qt/log4qt.pri)
    用于引入 log4qt.pri 文件。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    步骤四,配置log4qt.pri

    如图五所示:

    在这里插入图片描述

    (注:当我们按照步骤三配置好MyLog4qtProject.pro文件后,进行ctrl+c保存,编译器会自动加载图五中的log4qt模块)

    在log4qt.pri文件的末尾添加如下内容:

    INCLUDEPATH += -L $$PWD \
                    $$PWD/helpers \
                     $$PWD/spi \
                     $$PWD/varia
    
    DEPENDPATH  += $$PWD \
                $$PWD/helpers \
                $$PWD/spi \
                $$PWD/varia
    
    DEFINES +=LOG4QT_STATIC
    LOG4QT_VERSION_MAJOR = 1
    LOG4QT_VERSION_MINOR = 6
    LOG4QT_VERSION_PATCH = 0
    
    DEFINES += LOG4QT_VERSION_MAJOR=$${LOG4QT_VERSION_MAJOR}
    DEFINES += LOG4QT_VERSION_MINOR=$${LOG4QT_VERSION_MINOR}
    DEFINES += LOG4QT_VERSION_PATCH=$${LOG4QT_VERSION_PATCH}
    DEFINES += LOG4QT_VERSION_STR='\\"$${LOG4QT_VERSION_MAJOR}.$${LOG4QT_VERSION_MINOR}.$${LOG4QT_VERSION_PATCH}\\"'
    
    DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00
    DEFINES += QT_DEPRECATED_WARNINGS
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    效果如图六所示:

    在这里插入图片描述

    1.INCLUDEPATH += -L $$PWD
    $$PWD/helpers
    $$PWD/spi
    $$PWD/varia
    
    2.DEPENDPATH += $$PWD
    $$PWD/helpers
    $$PWD/spi
    $$PWD/varia
    
    INCLUDEPATH 和 DEPENDPATH: 这两个变量用于指定包含和依赖搜索路径。
    $$PWD 表示当前工程文件的所在路径。
    
    3.DEFINES +=LOG4QT_STATIC
    LOG4QT_VERSION_MAJOR = 1
    LOG4QT_VERSION_MINOR = 6
    LOG4QT_VERSION_PATCH = 0
    
    用于告诉编译器在静态链接方式下使用 Log4Qt 库。
    
    4.DEFINES += LOG4QT_VERSION_MAJOR=$${LOG4QT_VERSION_MAJOR}
    DEFINES += LOG4QT_VERSION_MINOR=$${LOG4QT_VERSION_MINOR}
    DEFINES += LOG4QT_VERSION_PATCH=$${LOG4QT_VERSION_PATCH}
    
    LOG4QT_VERSION_MAJOR, LOG4QT_VERSION_MINOR, LOG4QT_VERSION_PATCH: 这些变量用于定义 Log4Qt 版本号的主、次、修订版本号。
    
    DEFINES += LOG4QT_VERSION_STR='\"$${LOG4QT_VERSION_MAJOR}.$${LOG4QT_VERSION_MINOR}.$${LOG4QT_VERSION_PATCH}\"'
    
    这个宏定义用于将 Log4Qt 的完整版本号作为预处理器定义,并将其包装在双引号内。
    
    
    5.DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00
    (QT_DISABLE_DEPRECATED_BEFORE=0x050F00)意味着在 Qt 版本 5.15.0 之前被弃用的功能的警告将被禁用。
    
    6.DEFINES += QT_DEPRECATED_WARNINGS
    QT_DEPRECATED_WARNINGS: 这个宏定义用于启用 Qt 框架中关于已弃用功能的警告信息。(5和6是有语义上是有冲突的,但是一些源代码也是这么写的,实际使用中可任选5或6之一[5和6都写的话,代码也不会中断])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    步骤五,编辑main.cpp

    增加以下内容:
    //main.cpp
    #include 
    #include "logmanager.h"
    #include "propertyconfigurator.h"
    
    
        Log4Qt::PropertyConfigurator::configure(a.applicationDirPath() + "/log4qt.conf");
        Log4Qt::LogManager::setHandleQtMessages(true);
        qDebug("start working...");
    
    
    //main.cpp的完整内容:
    #include "MainWindow.h"
    
    #include 
    
    #include 
    #include "logmanager.h"
    #include "propertyconfigurator.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
    
        Log4Qt::PropertyConfigurator::configure(a.applicationDirPath() + "/log4qt.conf");
        Log4Qt::LogManager::setHandleQtMessages(true);
        qDebug("start working...");
    
        w.show();
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    最后一个步骤,编辑log4qt.conf(名字只要以.conf结尾,与main.cpp中初始化的conf文件名一致即可)

    1. log4qt.conf的内容如下:
    # 设置储存log文件的根目录
    logpath=.
    
    log4j.reset=true
    log4j.Debug=WARN
    log4j.threshold=NULL
    # 设置是否监听QDebug输出的字符串
    log4j.handleQtMessages=true
    # 在运行中,是否监视此文件配置的变化
    log4j.watchThisFile=false
    
    # 设置根Logger的输出log等级为All
    # 设置Log输出的几种输出源(appender):console, daily, rolling
    log4j.rootLogger=ALL, console, daily
    
    # 设置终端打印记录器
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=STDOUT_TARGET
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yyyy,MM,dd HH:mm:ss} [%t] {%l} %-5p %c - %m%n
    log4j.appender.console.threshold=ALL
    
    # 设置一个每日储存一个log文件的记录器
    log4j.appender.daily=org.apache.log4j.DailyFileAppender
    log4j.appender.daily.file=${logpath}/logs/.log
    log4j.appender.daily.appendFile=true
    log4j.appender.daily.datePattern=yyyy_MM_dd
    log4j.appender.daily.keepDays=90
    log4j.appender.daily.layout=${log4j.appender.console.layout}
    
    log4j.appender.daily.layout.ConversionPattern=${log4j.appender.console.layout.ConversionPattern}
    
    
    
    
    
    # 给“LoggerObjectPrio”这个类的Logger定义log输出等级为Error,
    # 给“LoggerObjectPrio”这个类的Logger定义log输出源:daily, console
    log4j.logger.LoggerObjectPrio=ERROR
    #, rolling
    
    # 设置为false,表示“LoggerObjectPrio”这个类的logger不继承的rootLogger输出源(appender)
    log4j.additivity.LoggerObjectPrio=false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    2)将log4qt.conf放在你项目的build目录下

    (如果你是以Debug模式下编译的话,就将log4qt.conf放在"项目/Debug/debug"文件夹下)

    效果如图七所示:

    在这里插入图片描述

    (如果你是以Release模式下编译的话,就将log4qt.conf放在"项目/Release/release"文件夹下)

    实现效果

    在这里插入图片描述

    四,关于log4qt.conf理解

    logpath=.:设置存储日志文件的根目录为当前目录。
    log4j.reset=true:重置 Log4j 配置。
    log4j.Debug=WARN:设置 Log4j 调试级别为 WARN。
    log4j.threshold=NULL:设置 Log4j 阈值级别为 NULL,即不限制任何级别的日志输出。
    log4j.handleQtMessages=true:设置是否监听 QtDebug 输出的字符串。
    log4j.watchThisFile=false:设置在运行时是否监视此文件配置的变化。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    log4j.rootLogger=ALL, console, daily:设置根 Logger 的输出级别为 ALL,并指定了两个输出源:console(终端打印)和 daily(每日文件)。
    
    • 1
    针对 console 输出源的配置:
    
    log4j.appender.console=org.apache.log4j.ConsoleAppender:指定使用 ConsoleAppender 输出到控制台。
    log4j.appender.console.target=STDOUT_TARGET:设置输出目标为标准输出。
    
    #TTCCLayout 布局是 Log4Qt 的默认布局
    #log4j.appender.console.layout=org.apache.log4j.TTCCLayout:指定使用 TTCCLayout 布局。
    #log4j.appender.console.layout.dateFormat=yyyy.dd.MM hh:mm:ss   :设置日期格式。
    #log4j.appender.console.layout.contextPrinting=true:设置是否打印上下文信息。
    
    #PatternLayout` 布局允许您自定义日志输出的格式
    log4j.appender.console.layout=org.apache.log4j.PatternLayout:指定使用 PatternLayout 布局。
    log4j.appender.console.layout.ConversionPattern=%d{yyyy,MM,dd HH:mm:ss} [%t] {%l} %-5p %c - %m%n
    #%d:时间戳。
    #%t:线程号。
    #%l: 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
    #%p:日志级别。
    #%c:类别。
    #%m:日志消息。
    #%n:换行符。
    
    log4j.appender.console.threshold=ALL:设置输出级别为 ALL。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    针对 daily 输出源的配置:
    
    log4j.appender.daily=org.apache.log4j.DailyFileAppender:指定使用 DailyFileAppender 每日文件记录器。
    log4j.appender.daily.file=${logpath}/logs/.log:设置日志文件的路径和名称。
    log4j.appender.daily.appendFile=true:设置是否在日志文件末尾追加内容。
    log4j.appender.daily.datePattern=yyyy_MM_dd:设置日期格式模式。
    #所以最终log文件的名字是yyyy_MM_dd.log
    
    log4j.appender.daily.keepDays=90:设置保留日志文件的天数。
    log4j.appender.daily.layout=${log4j.appender.console.layout}:设置布局与 console 输出源相同。
    
    log4j.appender.daily.layout.dateFormat=${log4j.appender.console.layout.dateFormat}:设置日期格式与 console 输出源相同。
    log4j.appender.daily.layout.contextPrinting=${log4j.appender.console.layout.contextPrinting}:设置是否打印上下文信息与 console 输出源相同。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    对上面daily 输出源的配置的补充:
    #设置日志文件的文件名:
    ①将日志文件的文件名设置为"年月日.log"
    log4j.appender.daily.file=${logpath}/logs/.log
    log4j.appender.daily.datePattern=yyyy_MM_dd
    ②将日志文件的文件名设置为"年月日时分秒.log"(经过测试,不支持这样的写法)
    log4j.appender.daily.file=${logpath}/.log
    log4j.appender.daily.datePattern=yyyy_MM_dd_hh_mm_ss(error!)
    log4j.appender.daily.datePattern=yyyy_MM_dd_HH_mm_ss(error!)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    针对 LoggerObjectPrio 类的 Logger 的配置:
    
    log4j.logger.LoggerObjectPrio=ERROR, rolling:设置 LoggerObjectPrio 类的日志输出级别为 ERROR,并指定输出源为 rolling。
    log4j.additivity.LoggerObjectPrio=false:设置不继承 rootLogger 的输出源。
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    C语言指针的详细概念
    【Vue实战】基于Vue的九宫格在线抽奖附源代码
    Java实现图片转文字!(OCR实现)
    Sentinel-限流降级
    Java.lang.Class asSubclass()方法有什么功能呢?
    大模型简介
    2023百度之星 题目详解 公园+糖果促销
    程序员注意!35岁前,别靠死工资过日子
    防抖及其优化
    金九银十又到了分享面试经验的时候了
  • 原文地址:https://blog.csdn.net/weixin_52668597/article/details/132745010