Log4Qt日志框架(2)-深入分析和使用

news2024/12/24 3:03:26

Log4Qt日志框架(2)-深入分析和使用

  • 0 源码
  • 1 核心类及其关系
  • 2 深入分析

0 源码

在这里插入图片描述
在这里插入图片描述

  1. 支持自动创建默认properties文件
  2. 如果默认不满足需求,也支持自定义配置文件
  3. 在原有的log4qt基础单独封装类,在程序开始出初始化后,可以在任何地方使用
  4. 支持输出应用名称、类、函数、行
  5. 支持输出到控制台
  6. 支持输出到日志文件:可以设置保留日期自动覆盖
  7. 支持输出到telent
  8. 支持输出到自定义控件
  9. 支持输出到数据库(个人感觉比较鸡肋,如果需要可以自己设置)
  10. 支持中英文、数字等混合日志
  11. 支持QT4、QT5、QT6
  12. 支持跨平台

体验:https://pan.baidu.com/s/1oo0xmVbb_z3hVdPZs57Tyw?pwd=mqlc
提取码:mqlc

源码:源码链接

1 核心类及其关系

  • Logger:
    这是 Log4Qt 的核心,用于记录日志消息。
    日志器具有一个日志级别,用于决定哪些日志消息应该被记录。
    日志器可以有一个或多个 Appender 关联。

  • Level:
    代表日志级别(如 TRACE< DEBUG< INFO< WARN< ERROR< FATAL)。
    决定哪些日志消息应该被记录。
    所以,如果你设置了 INFO 级别,那么 TRACE 和 DEBUG 消息将被忽略,而 INFO, WARN, ERROR, 和 FATAL 消息会被处理。同样地,如果设置为 ERROR 级别,那么只有 ERROR 和 FATAL 消息会被处理。

  • Appender:
    定义日志消息的输出目标。一个日志器可以有多个追加器。
    ConsoleAppender:输出日志消息到控制台。
    FileAppender:输出日志消息到文件。
    …(其他追加器)

  • Layout:
    决定日志消息的格式。
    PatternLayout:根据一个模式字符串来格式化日志消息。
    SimpleLayout:简单格式。
    …(其他布局)

  • Filter:
    在日志消息被追加器处理之前进行筛选。
    可以有多个筛选条件。

  • LoggingEvent:
    代表一个日志事件,包含日志消息、时间戳、日志级别等信息。

  • LoggerRepository:
    用于管理和检索日志器的容器。
    默认实现是 LoggerRepository,但可以有其他实现。

  • LogManager:
    提供静态方法管理日志器和配置。

  • Configuration 类:
    这些类和方法允许从外部配置文件(如 XML 或 properties 文件)配置 Log4Qt。这样,开发者可以不修改代码即可更改日志配置。
    PropertyConfigurator 和 XmlConfigurator 是两个主要的配置器类。

关系概述:

  1. 一个 Logger 可以有一个或多个 Appender。
  2. 每个 Appender 有一个 Layout 来决定如何格式化日志消息。
  3. Filter 可以被附加到 Appender,以决定哪些日志消息应该被处理。
  4. LoggerRepository 和 LogManager 用于管理和配置整个系统。

所以说,使用这日志系统要至少有一个日志器,这个日志器要至少有一个追加器,追加器要有一个输出样式。

2 深入分析

先看一个简单的例子:

  1. FileAppender:将日志输出到指定的文件中,不会新建或者重命名,也不会自动清理
Log4Qt::FileAppender *fileAppender= new Log4Qt::FileAppender;
fileAppender->setFile("file.log");
fileAppender->setLayout(patter);
fileAppender->setAppendFile(true);
fileAppender->activateOptions();
  1. RollingFileAppender:输出到指定文件中,超过指定文件大小,文件会以*.1命名,超过指定保存个数,会删掉之前的日志
Log4Qt::RollingFileAppender *rollingAppender = new Log4Qt::RollingFileAppender;
rollingAppender->setLayout(patter);
rollingAppender->setFile("rolling.log");
rollingAppender->setAppendFile(true);
rollingAppender->setMaxBackupIndex(3);
rollingAppender->setMaximumFileSize(2*1024);
rollingAppender->activateOptions();

在这里插入图片描述
3. DailyFileAppender :每天新建一个文件,保存当天的日志,超过指定的天数,删除最开始的日志

Log4Qt::DailyFileAppender *dailiAppender = new Log4Qt::DailyFileAppender;
dailiAppender->setLayout(patter);
dailiAppender->setFile("Daili.log");
dailiAppender->setAppendFile(true);
dailiAppender->setDatePattern("_yyyy_MM_dd");
dailiAppender->setKeepDays(30);
dailiAppender->activateOptions();

在这里插入图片描述
4. DailyRollingFileAppender :以指定的滚动频率重名命名文件,例如,如果您的基本文件名是 application.log 并且您正在使用每天滚动,那么在 2023-08-18 的日志将被保存为 application.log.2023-08-18。不会自动删除日志文件。

 Log4Qt::DailyRollingFileAppender *daliRollingAppender = new Log4Qt::DailyRollingFileAppender;
 daliRollingAppender->setLayout(patter);
 daliRollingAppender->setFile("DailiRolling.log");
 daliRollingAppender->setAppendFile(true);
 daliRollingAppender->setDatePattern("_yyyy_MM_dd");
 daliRollingAppender->activateOptions();
  1. TelnetAppender:telnet发送
Log4Qt::TelnetAppender *telnetAppender = new Log4Qt::TelnetAppender();
telnetAppender->setLayout(patter);
telnetAppender->setPort(2323);
telnetAppender->setAddress(QHostAddress::Any);
telnetAppender->setImmediateFlush(true);
telnetAppender->activateOptions();
  1. DatabaseAppender:写入到数据库
Log4Qt::DatabaseLayout *dbLayout = new Log4Qt::DatabaseLayout();
dbLayout->setTimeStampColumn("timestamp");
dbLayout->setLoggenameColumn("logger_name");
dbLayout->setThreadNameColumn("thread_name");
dbLayout->setLevelColumn("log_level");
dbLayout->setMessageColumn("message");

Log4Qt::DatabaseAppender *dbAppender = new Log4Qt::DatabaseAppender();
dbAppender->setLayout(dbLayout);
dbAppender->setConnection(db.connectionName());
dbAppender->setTable("logRecord");
dbAppender->activateOptions();
rootLogger->addAppender(dbAppender);
  1. SignalAppender:有日志会发送的信号
Log4Qt::SignalAppender *signalAppender = new Log4Qt::SignalAppender;
signalAppender->setLayout(patter);
signalAppender->activateOptions();

connect(signalAppender,SIGNAL(appended(QString)),ui->textEdit,SLOT(append(QString)));

properties默认支持的日志:

void Factory::registerDefaultAppenders()
{
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.ConsoleAppender"), console_file_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::ConsoleAppender"), console_file_appender);
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.DailyRollingFileAppender"), create_daily_rolling_file_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::DailyRollingFileAppender"), create_daily_rolling_file_appender);
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.varia.DebugAppender"), create_debug_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::DebugAppender"), create_debug_appender);
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.FileAppender"), create_file_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::FileAppender"), create_file_appender);
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.varia.ListAppender"), create_list_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::ListAppender"), create_list_appender);
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.varia.NullAppender"), create_null_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::NullAppender"), create_null_appender);
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.RollingFileAppender"), create_rolling_file_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::RollingFileAppender"), create_rolling_file_appender);

    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.SignalAppender"), create_signal_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::SignalAppender"), create_signal_appender);
#ifdef Q_OS_WIN
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.ColorConsoleAppender"), create_color_console_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::ColorConsoleAppender"), create_color_console_appender);
#endif

#if defined(QT_SQL_LIB)
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.DatabaseAppender"), create_database_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::DatabaseAppender"), create_database_appender);
#endif //#ifdef QT_SQL_LIB

#if defined(QT_NETWORK_LIB)
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.TelnetAppender"), create_telnet_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::TelnetAppender"), create_telnet_appender);
#endif
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.AsyncAppender"), create_async_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::AsyncAppender"), create_async_appender);

    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.MainThreadAppender"), create_mainthread_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::MainThreadAppender"), create_mainthread_appender);

    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.SystemLogAppender"), create_systemlog_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::SystemLogAppender"), create_systemlog_appender);

    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.BinaryFileAppender"), create_binaryfile_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::BinaryFileAppender"), create_binaryfile_appender);

    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.RollingBinaryFileAppender"), create_rollingbinaryfile_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::RollingBinaryFileAppender"), create_rollingbinaryfile_appender);

    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.DailyFileAppender"), create_dailyrollingfile_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::DailyFileAppender"), create_dailyrollingfile_appender);
#ifdef Q_OS_WIN
    mAppenderRegistry.insert(QStringLiteral("org.apache.log4j.WDCAppender"), create_wdc_appender);
    mAppenderRegistry.insert(QStringLiteral("Log4Qt::WDCAppender"), create_wdc_appender);
#endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AP9196 DC-DC升降 升降压 6A 恒流DEMO原理图

应用范围 户外照明 智能照明 带锂电应用方案 太阳能路灯 补光灯

解密01背包问题:如何在有限空间中实现最大价值?

文章目录 01背包 - 问题分析01背包题目第一问1. 状态表示2. 分析状态转移方程3. 初始化4. 填表顺序5. 返回值 第二问1. 状态表示2. 状态转移⽅程3. 初始化4. 填表顺序5. 返回值 C运行代码 01背包 - 问题分析 01背包是指在一个有容积限制&#xff08;或者重量限制&#xff09;的…

了解消息中间件的基础知识

为什么要使用消息中间件&#xff1f; 解耦&#xff1a;消息中间件可以使不同的应用程序通过解耦的方式进行通信&#xff0c;减少系统间的依赖关系提供异步通信&#xff1a;消息中间件可以实现异步消息传递&#xff0c;提高系统的响应性能。流量削峰&#xff1a;消息中间件可以…

vue项目实现table表格竖向

先上图 思路&#xff1a;使用element ui 自带的栅格&#xff0c;通过控制el-col 的span 属性来设置每行展示多少行&#xff08;竖着的字段&#xff09;&#xff0c;超过就自动换行&#xff1b; content1 是表头 content2是返回的数据 getTable()函数是将返回的正常数据进行处理…

SQL12 高级操作符练习(2)

描述 题目&#xff1a;现在运营想要找到学校为北大或GPA在3.7以上(不包括3.7)的用户进行调研&#xff0c;请你取出相关数据&#xff08;使用OR实现&#xff09; 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.03…

【SpringMVC】工作流程入门案例的使用

目录 一、什么是SpringMVC 二、SpringMVC的请求流程 三、SpringMVC的优点 四、Spring MVC的主要组件 五、SpringMVC常用注解 六、入门案例演示 6.1.添加pom.xml 6.2.创建spring-mvc.xml 6.3.配置web.xml 6.4.SpringMVC配置Web 6.5.JSP页面编写 七、扩展 7.1.Spring…

全科医学科常用评估量表汇总,建议收藏!

根据全科医学科医生的量表使用情况&#xff0c;笔者整理了10个常用的全科医学科量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 日常生活能力量表…

HarmonyOS Codelab 优秀样例——溪村小镇(ArkTS)

一、介绍 溪村小镇是一款展示溪流背坡村园区风貌的应用&#xff0c;包括园区内的导航功能&#xff0c;小火车行车状态查看&#xff0c;以及各区域的风景展览介绍&#xff0c;主要用于展示HarmonyOS的ArkUI能力和动画效果。具体包括如下功能&#xff1a; 打开应用时进入启动页&a…

白灯和黄灯哪个对眼睛好?那些专家推荐的护眼灯

随着电子产品普及&#xff0c;虽然给我们生活带来了很多便利&#xff0c;不过也因此有不少人用眼过度导致近视。尤其是孩子&#xff0c;如今不少小孩小小年纪就戴上了眼镜&#xff0c;究其原因&#xff0c;除了繁重的课业还有户外运动的缺失、环境光照的不足、用眼卫生和习惯的…

SpringMVC系列(一)之SpringMVC入门详细介绍

一. SpringMVC简介 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分&#xff0c;简化开发&a…

Android Studio的笔记--aidl实现和调用

android AIDL接口使用 aidl实现新建aidl实现工程build.gradleproguard-rules.pro增加aidl文件 增加aidl实现aidl实现服务打开aidl服务 aidl使用新建aidl使用工程增加aidl文件使用aidl方法 相关回显 aidl实现 新建aidl实现工程 新建一个工程。工程名testaidl。包名com.lxh.tes…

第 3 章 栈和队列 (使用线性链表和队列实现银行业务模拟)

1. 背景说明 该模拟业务基于时间线来确定&#xff0c;当事件发生时&#xff0c;通过插入升序链表来模拟时间线记录事件发生时间、类型&#xff0c;类似于记事本&#xff0c;由于 时间是单向的&#xff0c;正好符合队列的先进先出特性&#xff0c;类似于我们生活中的排队行为。…

小程序类找茬游戏开发:创造富有挑战性和娱乐性的游戏体验

小程序找茬游戏是一种受欢迎的益智娱乐游戏&#xff0c;玩家需要在两幅几乎相同的图片中找出差异。这种类型的游戏结合了观察力和注意力&#xff0c;提供了有趣的挑战。在本文中&#xff0c;我们将讨论如何开发小程序找茬游戏&#xff0c;以及关键特点和开发流程。 小程序找茬…

初露头角!Walrus入选服贸会“数智影响力”数字化转型创新案例

9月5日&#xff0c;由北京市通信管理局、工业和信息化部新闻宣传中心联合主办的“企业数字化转型论坛”在2023中国国际服务贸易交易会期间召开&#xff0c;论坛以“数字化引领 高质量发展”主题&#xff0c;旨在探讨信息技术如何与各行业深度融合&#xff0c;构建数字化转型新格…

C++vector模拟实现

vector模拟实现 1.构造函数2.拷贝构造3.析构赋值运算符重载4.iterator5.modifiers5.1push_back5.2pop_back5.3empty5.4insert5.5erase5.6swap 6.Capacity6.1size6.2capacity6.3reserve6.4resize6.5empty 7.Element access7.1operator[]7.2at 8.在谈reserve vector官方库实现的是…

SpringBoot整合Redis,基于Jedis实现redis各种操作

前言&#xff08;三步教你学会redis&#xff0c;主打一个实用&#xff09; springboot整合redis步骤&#xff0c;并基于jedis对redis数据库进行相关操作&#xff0c;最后分享非常好用、功能非常全的redis工具类。 第一步&#xff1a;导入maven依赖 <!-- springboot整合re…

C++之智能指针shared_ptr死锁问题(二百)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Hadoop生态圈中的Flume数据日志采集工具

Hadoop生态圈中的Flume数据日志采集工具 一、数据采集的问题二、数据采集一般使用的技术三、扩展&#xff1a;通过爬虫技术采集第三方网站数据四、Flume日志采集工具概述五、Flume采集数据的时候&#xff0c;核心是编写Flume的采集脚本xxx.conf六、Flume案例实操1、采集一个网络…

卫星地图-航拍影像-叠加配准套合(ArcGIS版)

卫星地图-航拍影像-叠加配准套合(ArcGIS版) 发布时间&#xff1a;2018-01-17 版权&#xff1a;BIGEMAP 第一步 工具准备 BIGEMAP地图下载器&#xff1a;Bigemap系列产品-GIS行业基础软件kml\shp 相关教程&#xff1a;CAD文件直接导入BIGEMAP进行套合配准&#xff08;推荐&am…

苹果笔不用原装可以吗?苹果ipad触控笔推荐

很多小伙伴在纠结&#xff0c;是否要购买apple pencil呢&#xff1f;但它的价格太过昂贵&#xff0c;很多学生党都消费不起。答案是不一定的要入手apple pencil的。市面上也是有做得相当不错的平替电容笔。现在无纸化已经快成为我们生活中的一部分&#xff0c;它不仅是可以书写…