Log4Qt日志框架(2)-深入分析和使用
- 0 源码
- 1 核心类及其关系
- 2 深入分析
0 源码
- 支持自动创建默认properties文件
- 如果默认不满足需求,也支持自定义配置文件
- 在原有的log4qt基础单独封装类,在程序开始出初始化后,可以在任何地方使用
- 支持输出应用名称、类、函数、行
- 支持输出到控制台
- 支持输出到日志文件:可以设置保留日期自动覆盖
- 支持输出到telent
- 支持输出到自定义控件
- 支持输出到数据库(个人感觉比较鸡肋,如果需要可以自己设置)
- 支持中英文、数字等混合日志
- 支持QT4、QT5、QT6
- 支持跨平台
体验: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 是两个主要的配置器类。
关系概述:
- 一个 Logger 可以有一个或多个 Appender。
- 每个 Appender 有一个 Layout 来决定如何格式化日志消息。
- Filter 可以被附加到 Appender,以决定哪些日志消息应该被处理。
- LoggerRepository 和 LogManager 用于管理和配置整个系统。
所以说,使用这日志系统要至少有一个日志器,这个日志器要至少有一个追加器,追加器要有一个输出样式。
2 深入分析
先看一个简单的例子:
- FileAppender:将日志输出到指定的文件中,不会新建或者重命名,也不会自动清理
Log4Qt::FileAppender *fileAppender= new Log4Qt::FileAppender;
fileAppender->setFile("file.log");
fileAppender->setLayout(patter);
fileAppender->setAppendFile(true);
fileAppender->activateOptions();
- 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();
- TelnetAppender:telnet发送
Log4Qt::TelnetAppender *telnetAppender = new Log4Qt::TelnetAppender();
telnetAppender->setLayout(patter);
telnetAppender->setPort(2323);
telnetAppender->setAddress(QHostAddress::Any);
telnetAppender->setImmediateFlush(true);
telnetAppender->activateOptions();
- 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);
- 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
}