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

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

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

0 源码

Log4Qt日志框架(2)-深入分析和使用_第1张图片
Log4Qt日志框架(2)-深入分析和使用_第2张图片

  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
}

你可能感兴趣的:(QT中级,qt,log4qt,日志)