一、知识点
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,可以有多个其他Logger
Log4Qt::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则将消息覆盖指定的文件内容,默认值是false
dailiAppender->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 sql
DEFINES +=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,可以有多个其他Logger
Log4Qt::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则将消息覆盖指定的文件内容,默认值是false
dailiAppender->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;
}
重新构建,并运行,输出如下:
同时在项目构建目录下生成日志文件