Qt教程(1) : 用Log4Qt自定义日志系统

本文介绍了C++中常见的日志框架,如log4cxx、log4cplus、Log4cpp等,并重点讲解了Log4Qt的架构、规则和使用方法。Log4Qt提供日志级别的设定、布局格式化和过滤器功能,允许开发者灵活管理日志输出。文章还展示了如何配置Log4Qt以输出不同格式的日志,并提供了将日志重定向到窗口的实现方法。
摘要由CSDN通过智能技术生成

​    日志系统可以记录软件系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件和异常。在程序调试过程中,需要通过日志来找出问题所在。

    使用一个好的日志框架可以事半功倍,C++的日志框架有很多,常用的框架如下:

  • log4cxx:Java 社区著名的 Log4j 的 C++ 移植版,用于为 C++ 程序提供日志功能,以便开发者对目标程序进行调试和审计。

  • log4cplus:一个简单易用的 C++ 日志记录 API,它提供了对日志管理和配置的线程安全、灵活和任意粒度控制(也基于 Log4j)。

  • Log4cpp:一个 C++ 类库,可以灵活地记录到文件、syslog、IDSA 和其他目的地(也基于 Log4j)。

  • google-glog:一个 C++ 语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种辅助宏。

  • Pantheios:一个类型安全、高效、泛型和可扩展性的 C++ 日志 API 库(号称 C++ 领域速度最快的日志库)。

  • POCO:还提供了一个 好的日志支持文档。

  • ACE:ACE 也有日志支持。

  • Boost.Log:设计的非常模块化,并且可扩展。

  • Easylogging++:轻量级高性能 C++ 日志库(只有一个头文件)。

  • G3log:一个开源、支持跨平台的异步 C++ 日志框架,支持自定义日志格式。基于 g2log 构建,提升了性能,支持自定义格式。

  • Plog:可移植、简单和可扩展的 C++ 日志库。

  • spdlog:一个快速的 C++ 日志库,只包含头文件,兼容 C++11。

    本文使用Log4Qt,而Log4Qt来自于Log4j,下载网址如下:

    https://github.com/MEONMedical/Log4Qt

    图像的特征描述了图像的某种属性,当通过分割、形态学处理得到一些区域后,这些区域就构成了一个集合。 常用的特征类型有边缘、角、区域和脊背。

一、Log4Qt架构

Log4Qt有三个部分:

  • loggers:负责捕获日志信息。

  • appenders:负责输出信息到不同的目的地,比如数据库,文件,控制台等等。

  • layouts:负责使用不同的样式输出日志

Log4Qt框架中有两种对象:

  • 核心对象:框架的支撑对象,是框架必不可少的组成部分。

  • 支撑对象:这些都是框架可选的对象,用于提供额外重要的工作。

Log4Qt的架构图如下所示:

  • Level对象:级别对象定义日志的粒度和优先级。

  • 过滤器对象:用于分析日志信息并决定日志信息是否输出。每个appender对象可以有几个过滤器对象协同工作,当日志信息到达特定的appender时,所有的过滤器会帮助appender在其发布到目的地之前进行过滤操作。

  • 对象渲染器:提供一段字符用于识别发送日志的不同对象,这个对象也用于layout对象准备常量信息。

  • 日志管理器:用于管理日志框架,它负责从初始化配置中读取信息,这个配置可能是文件配置,也可能是类的配置。

二、Log4Qt规则

    2.1 日志的级别

    日志级别如下:

  • ALL:所有日志的级别都包括。

  • DEBUG:指定的信息事件的粒度是DEBUG,在调试应用的时候会有帮助。

  • ERROR:指定错误事件,并且这些事件还会保证应用继续运行。

  • FATAL:指定严重的错误事件,该事件会导致应用暂停。

  • INFO:指定信息消息,强调应用粗粒度的运行情况。

  • OFF:最高等级,相当于关闭了日志。

  • TRACE:指定比DEBUG更粗粒度的调试日志。

  • WARN:输出具有潜在风险的信息。

    日志标准的排序是:

    ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF

 

    2.2 日志字符格式化

    日志消息的格式,通过转换说明符来表示,以百分号(%)开始,后跟转换字符。如下实例:

log4j.appender.daily.layout.ConversionPattern=%d{yyyy-MM-dd(HH:mm:ss)} %p:%m%n
  • -X号: X信息输出时左对齐;

  • %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,

  • %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

  • %r: 输出自应用启动到输出该log信息耗费的毫秒数

  • %c: 输出日志信息所属的类目,通常就是所在类的全名

  • %t: 输出产生该日志事件的线程名

  • %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)

  • %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。

  • %%: 输出一个"%"字符

  • %F: 输出日志消息产生时所在的文件名称

  • %L: 输出代码中的行号

  • %m: 输出代码中指定的消息,产生的日志具体信息

  • %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行

    如果想生成基于模式的特定格式的日志信息,那么可以使用 PatternLayout 来进行格式化。

    2.3 Layout

    Log4Qt提供了多种Layout对象,用于格式化日志输出,指定日志级别、线程名称、Logger名称、日期时间等信息。Log4Qt::Layout 继承关系图:

 

  • Layout类是Log4Qt API中的抽象类。

  • PatternLayout:根据一个模式字符串输出日志事件;

  • SimpleLayout:输出日志事件的级别和消息;

  • TTCCLayout:输出日志事件的时间、线程名称、Logger名称和嵌套的诊断上下文信息。

  • PatternLayout和TTCCLayout:通过PatternFormatter来实现格式化。当PatternFormatter解析模式字符串时,会根据发现的信息创建一个PatternConverter链,每个PatternConverter会处理LoggingEvent的某个成员。

    2.4 配置文件

    Log4qt可以通过配置文件来设置相应的参数,常用的基本配置如下:

#设置储存log文件的根目录
logpath=./log
​
log4j.reset=true
log4j.Debug=WARN
log4j.threshold=NULL
#设置是否监听QDebug输出的字符串
log4j.handleQtMessages=true
#在运行中,是否监视此文件配置的变化
log4j.watchThisFile=false
​
#设置根Logger的输出log等级为All
#设置Log输出的几种输出源(appender):console, daily
#log4j.rootLogger=ALL, console, daily
log4j.rootLogger=ALL, 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)} %p:%m%n
​
#设置一个每日储存一个log文件的记录器
log4j.appender.daily=org.apache.log4j.DailyFileAppender
log4j.appender.daily.file=${logpath}/.log
log4j.appender.daily.appendFile=true
log4j.appender.daily.datePattern=yyyy-MM-dd
log4j.appender.daily.keepDays=30
log4j.appender.daily.layout=org.apache.log4j.PatternLayout
log4j.appender.daily.layout.ConversionPattern=%d{yyyy-MM-dd(HH:mm:ss)} %p:%m%n
​
# 给“LoggerObjectPrio”这个类的Logger定义log输出等级为Error,
# 给“LoggerObjectPrio”这个类的Logger定义log输出源:daily, console
log4j.logger.LoggerObjectPrio=ERROR, daily, console
#设置为false,表示“LoggerObjectPrio”这个类的logger不继承的rootLogger输出源(appender)
log4j.additivity.LoggerObjectPrio=false

    配置文件调用方式:

//配置文件路径
    Log4Qt::PropertyConfigurator::configure(a.applicationDirPath()  
    + "/log4qt.conf");

三、使用Log4Qt

    3.1 生成log4qt库

    源码下载后,直接打开工程文件编译即可,

 

    3.2 将log4qt源码融入自己的项目中

    在工程文件中添加以下配置:

# 定义 Log4Qt 源码根目录
LOG4QT_PATH = C:/Log4Qt-master
# 定义所需的宏
DEFINES += LOG4QT_LIBRARY
# 指定编译项目时应该被搜索的 #include 目录
INCLUDEPATH += $$LOG4QT_PATH/src \
               $$LOG4QT_PATH/src/log4qt \
               $$LOG4QT_PATH/include \
               $$LOG4QT_PATH/include/log4qt
# 将 Log4Qt 源代码添加至项目中
include($$LOG4QT_PATH/src/log4qt/log4qt.pri)
include($$LOG4QT_PATH/build.pri)
include($$LOG4QT_PATH/g++.pri)

    3.3 简单使用实例

#include "logger.h"
#include "basicconfigurator.h" 
Log4Qt::BasicConfigurator::configure();
Log4Qt::Logger * log = Log4Qt::Logger::rootLogger();
log->debug("debug!");
log->info("information!");
log->warn("warn");

四、重定向到窗口

    4.1 继承QTextEdit

class JLogWin : public QTextEdit
{
    Q_OBJECT
​
public:
    explicit JLogWin(QWidget *parent = nullptr);
    ~JLogWin();
​
private slots:
    void AppendLog_Slot(int level, const QString& log);
​
private:
    QMutex Log_Mutex;
};
​
JLogWin::JLogWin(QWidget *parent)
    : QTextEdit(parent)
{
    moveCursor(QTextCursor::End);
    document()->setMaximumBlockCount(100);
}
​
JLogWin::~JLogWin()
{
​
}
​
void JLogWin::AppendLog_Slot(int level, const QString &log)
{
    QMutexLocker lock(&Log_Mutex);
    if (level == 96) {
        setTextColor(QColor(0x0000ff));
    }else if (level == 128) {
        setTextColor(QColor(0x00aa00));
    }else{
        setTextColor(QColor(0xff0000));
    }
    this->append(log);
}

    4.2 继承Log4Qt::AppenderSkeleton

class JLogWinAppender : public Log4Qt::AppenderSkeleton
{
    Q_OBJECT
​
public:
    JLogWinAppender(QObject *parent = NULL);
    ~JLogWinAppender();
​
    //设置日志信息输出的QWidget组件
    void Set_LogWidget(QWidget *P_Widget);
​
protected:
    virtual bool requiresLayout() const;
    virtual void append(const Log4Qt::LoggingEvent &rEvent);
​
signals:
    //新增加一条日志信息的信号
    void AppendLog_Signal(int level, const QString& msg);
​
private:
    QWidget *P_LogWidget;
};
JLogWinAppender::JLogWinAppender(QObject *parent): AppenderSkeleton(parent)
{
    P_LogWidget = nullptr;
}
​
JLogWinAppender::~JLogWinAppender()
{
}
​
void JLogWinAppender::Set_LogWidget(QWidget *P_Widget)
{
    P_LogWidget = const_cast<QWidget*>(P_Widget);
    connect(this,        SIGNAL(AppendLog_Signal(int, const QString&)),
            P_LogWidget, SLOT(AppendLog_Slot(int, const QString&)));
}
​
bool JLogWinAppender::requiresLayout() const
{
    return true;
}

    4.3 实现效果

    窗口效果如下:

    日志文件效果如下:

        测试全部源码放到了CSDN上面,有需要可以下载:

https://download.csdn.net/download/qq_40732350/19000039

 

### 回答1: log4cplus_qt5是一个针对Qt5框架集成的log4cplus日志库。 log4cplus是一个C++编写的开源日志库,用于提供灵活和高效的日志记录功能。它可以将日志输出到控制台、文件、远程服务器等多个目标,并且支持多级日志输出、日志滚动管理、格式化输出等功能。 在Qt5框架下使用log4cplus_qt5可以方便地与Qt的信号槽机制进行集成。它提供了一个自定义Qt信号槽接口,使开发者可以在代码中使用简单的语法来记录和处理日志信息。通过这种方式,可以提高代码的可读性和可维护性,同时也能够更加灵活地控制日志记录的行为。 使用log4cplus_qt5的基本步骤如下: 1. 在Qt项目中添加log4cplus_qt5的头文件和库文件,可以通过命令行或者图形界面进行设置。 2. 在代码中创建log4cplus_qt5的日志对象,通过配置文件或者代码设置日志的输出格式、日志级别等参数。 3. 在需要记录日志的地方,使用log4cplus_qt5提供的接口来输出日志信息。可以根据需求设置不同的日志级别,以及自定义日志格式。 4. 可以根据需要将日志信息输出到控制台、文件、远程服务器等不同的目标。 5. 可以通过信号槽机制实现在特定条件下触发日志记录或者日志处理的逻辑。 总之,log4cplus_qt5是一个方便、灵活且高效的日志库,可以帮助Qt开发者进行日志记录和处理的工作。无论是在开发过程中进行调试,还是在发布后进行错误分析和性能优化,log4cplus_qt5都将是一个不可或缺的工具。 ### 回答2: log4cplus_qt5,是一个集成了log4cplus和Qt5框架的日志记录工具。log4cplus是一个功能强大的C++日志记录库,可以用于在应用程序中记录各种信息,如调试信息、错误信息等。而Qt5是一个跨平台的应用程序开发框架,提供了丰富的功能和工具,使开发者能够轻松创建高质量的界面和应用程序。 log4cplus_qt5的目的是为了方便开发者在使用Qt5框架开发应用程序时,集成log4cplus进行日志记录。通过log4cplus_qt5,开发者可以轻松地在Qt5应用程序中使用log4cplus的功能,进行日志的记录和管理。 使用log4cplus_qt5,开发者只需要在Qt5应用程序中引用log4cplus_qt5的相关库,并进行简单的配置即可开始使用。开发者可以根据自己的需求,选择合适的日志级别,定义日志输出格式,将日志记录到文件或者其他的目标。 log4cplus_qt5支持多线程环境下的并发访问,可以确保在多线程应用程序中,对日志的记录和输出不会产生竞争条件。同时,开发者也可以利用log4cplus_qt5的功能,对日志进行过滤、分类和分级管理,更加方便地进行日志的查看和分析。 总之,log4cplus_qt5是一个方便易用的日志记录工具,可以帮助开发者在Qt5应用程序中轻松集成log4cplus库,并进行日志的记录和管理。它的强大功能和稳定性,为开发者提供了一个可靠的日志解决方案,使得开发者能够更加高效地进行应用程序的开发和维护。 ### 回答3: log4cplus_qt5是一个用于在Qt5应用程序中进行日志记录的开源库。它结合了log4cplus和Qt5的功能,提供了一个强大而灵活的日志记录解决方案。 log4cplus是一个功能强大的C++日志记录库,可以用于跟踪应用程序的运行状态。它支持多种日志级别,如调试、信息、警告和错误,可以根据需要动态设置日志级别。log4cplus还支持将日志保存到不同的目标,比如文件、控制台和网络等,方便进行日志的收集和分析。此外,log4cplus还支持日志滚动,可以自动切换日志文件,避免日志文件过大造成的问题。 而Qt5是一套跨平台的C++开发框架,可以用于开发图形化界面应用程序。它提供了丰富的GUI组件和工具,方便开发者构建功能强大的应用程序。在Qt5中,开发者可以使用信号和槽机制来进行对象间的通信,同时还可以使用Qt的多线程支持来进行并发编程。 log4cplus_qt5将log4cplus与Qt5结合起来,使得在Qt5应用程序中进行日志记录变得更加方便。开发者可以使用log4cplus_qt5提供的接口来初始化日志记录器,并设置日志级别和输出目标。一旦设置好了日志记录器,开发者可以在应用程序中通过调用log4cplus_qt5提供的函数来记录日志。记录的日志信息将根据配置保存到指定的目标中。 总之,log4cplus_qt5是一个方便易用的日志记录库,可以帮助开发者在Qt5应用程序中进行日志记录。通过使用log4cplus和Qt5的功能,开发者可以更好地跟踪应用程序的运行状态,并进行相应的调试和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值