简述

Log4Qt 支持自定义输出,格式化由 Layout 完成,输出地则由 Appender 控制。

Appender 表示将日志输出到什么地方,常见的 Appender 有 Console(控制台)、File(文件)等等。

继承关系图

Log4Qt::Appender 继承关系图:

在该层次结构中,顶级类是 Appender,它是 Log4Qt API 中所有其他输出地的基类。

AppenderSkeleton:实现一般 Appender 的功能

通常来讲,自定义输出需要继承 AppenderSkeleton,并实现其中的几个方法。

DebugAppender:将日志事件附加到特定于平台的调试输出(在 Windows 上附加到 Debugger,其它系统上附加到 stderr)

ListAppender:将日志记录事件追加到列表中,供后续处理。

NullAppender:忽略所有要附加的请求

当然,最常用的是以下几个:

WriterAppender:将日志事件附加到 QTextStream

ConsoleAppender:附加到 stdout 或 stderr

FileAppender:将日志事件附加到文件

DailyRollingFileAppender:以指定的频率滚动日志文件

RollingFileAppender:在达到特定大小时滚动日志文件

输出到控制台

在项目开发阶段,往往需要在控制台中输出日志的内容,这对于调试代码来说非常方便。

这时,ConsoleAppender 会十分有用:

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)

Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();

Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();

layout->setName("My Layout");

layout->activateOptions();

// 创建一个 ConsoleAppender(将日志内容输出到控制台上)

Log4Qt::ConsoleAppender *appender = new Log4Qt::ConsoleAppender(layout, Log4Qt::ConsoleAppender::STDOUT_TARGET);

appender->setName("My Appender");

appender->activateOptions();

// 在 logger 上添加 appender

logger->addAppender(appender);

// 设置级别为 DEBUG

logger->setLevel(Log4Qt::Level::DEBUG_INT);

// 输出信息

logger->debug("Hello, Log4Qt!");

// 关闭 logger

logger->removeAllAppenders();

logger->loggerRepository()->shutdown();

return a.exec();

}

其中,Logger 用于提供日志记录服务,Layout 用于控制消息的输出格式。

在程序的最后,记得关闭 Logger - 删除之前添加的所有 Appender,并关闭 LoggerRepository(以释放 Appender 持有的资源)。

输出到文件

但在实际的产品阶段,我们更希望将日志输出到指定的文件中,以便后续跟踪程序的行为、定位问题。

这时,就需要用到 FileAppender:

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)

Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();

Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();

layout->setName("My Layout");

layout->activateOptions();

// 创建一个 FileAppender(将日志内容输出到文件中)

QString file = QCoreApplication::applicationDirPath() + "/debug.log";

Log4Qt::FileAppender *appender = new Log4Qt::FileAppender(layout, file, true);

appender->setName("My Appender");

appender->activateOptions();

// 在 logger 上添加 appender

logger->addAppender(appender);

// 设置级别为 DEBUG

logger->setLevel(Log4Qt::Level::DEBUG_INT);

// 输出信息

logger->debug("Hello, Log4Qt!");

// 关闭 logger

logger->removeAllAppenders();

logger->loggerRepository()->shutdown();

return a.exec();

}

在构造 FileAppender 时,可以用第三个参数指定文件的打开方式,true 表示以 Append(追加)方式打开,false 表示以 Truncate(截断) 方式打开。除此之外,也可以使用 setAppendFile(bool append)。

虽然 FileAppender 提供了对日志文件的支持,但都是一些最基本的操作。倘若要实现周期性生成日志文件、限制文件大小和个数等一些更高级的控制,则需要用到其派生类 - DailyRollingFileAppender 和 RollingFileAppender。

以指定的频率滚动日志文件

为了根据日期时间来定位日志,使其更加清晰易查,可以周期性生成日志文件(例如:DAILY_ROLLOVER 指定每天生成一个新文件),这由 DailyRollingFileAppender 来完成。

DatePattern 用于指定日期模式(频率),其有效值包括:

枚举

模式字符串

描述

MINUTELY_ROLLOVER

"'.'yyyy-MM-dd-hh-mm"

每分钟

HOURLY_ROLLOVER

"'.'yyyy-MM-dd-hh"

每小时

HALFDAILY_ROLLOVER

"'.'yyyy-MM-dd-a"

每半天

DAILY_ROLLOVER(默认值)

"'.'yyyy-MM-dd"

每天

WEEKLY_ROLLOVER

"'.'yyyy-ww"

每周

MONTHLY_ROLLOVER

"'.'yyyy-MM"

每月

注意: DatePattern 中不用处理的文字要放到单引号('')中,如上面的 '.'。

为了方便测试,以最短的间隔(每分钟)生成日志文件:

可以看到,文件名后自动加上了日期时间,很容易区分。

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)

Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();

Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();

layout->setName("My Layout");

layout->activateOptions();

// 创建一个 DailyRollingFileAppender(每分钟生成一个新文件)

QString file = QCoreApplication::applicationDirPath() + "/debug.log";

Log4Qt::DailyRollingFileAppender *appender = new Log4Qt::DailyRollingFileAppender(layout, file, "'.'yyyy-MM-dd-hh-mm");

appender->setName("My Appender");

appender->activateOptions();

// 在 logger 上添加 appender

logger->addAppender(appender);

// 设置级别为 DEBUG

logger->setLevel(Log4Qt::Level::DEBUG_INT);

int count = 0;

while (count < 10) {

// 输出信息

logger->debug("Hello, Log4Qt!");

Sleep(30 *1000);

++count;

}

// 关闭 logger

logger->removeAllAppenders();

logger->loggerRepository()->shutdown();

return a.exec();

}

要设置频率,除了可以在 DailyRollingFileAppender 的构造函数中指定一个模式字符串之外,还可以使用 setDatePattern(DatePattern datePattern) 指定一个枚举值进行设置。

在达到特定大小时滚动日志文件

随着时间的推移,日志文件会越来越多、越来越大,倘若不进行数量和大小上的限制,最后日志将会占满整个硬盘。

RollingFileAppender 使用 MaxFileSize 和 MaxBackupIndex 来限制日志文件的大小和数量。当产生多个日志文件时,会在日志名称后面加上“.1”、“.2”、… 这样的后缀。

下面,来读取一个文件,并将其内容写入到我们的日志文件中:

在此过程中,限制每个日志文件的最大大小为 10 KB,最大文件数为 5 个:

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)

Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();

Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();

layout->setName("My Layout");

layout->activateOptions();

// 创建一个 RollingFileAppender

QString file = QCoreApplication::applicationDirPath() + "/debug.log";

Log4Qt::RollingFileAppender *appender = new Log4Qt::RollingFileAppender(layout, file, true);

appender->setName("My Appender");

appender->setMaximumFileSize(10 * 1024); // 文件的最大大小为 10 KB

appender->setMaxBackupIndex(5); // 最大文件数为 5 个

appender->activateOptions();

// 在 logger 上添加 appender

logger->addAppender(appender);

// 设置级别为 DEBUG

logger->setLevel(Log4Qt::Level::DEBUG_INT);

// 读取文件,并写入日志

QFile f("E:/Backup.log");

if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {

QTextStream in(&f);

QString line;

while (!in.atEnd()) {

line = in.readLine();

logger->debug(line);

}

f.close();

}

// 关闭 logger

logger->removeAllAppenders();

logger->loggerRepository()->shutdown();

return a.exec();

}

qt log4qt 输出到oracle,Log4Qt 输出地相关推荐

  1. 12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了

    文章目录 一.为啥要使用第三方Log库,而不用平台自带的Log库 二.Log4j系列库的功能介绍与基本概念 三.Log4Qt库的基本介绍 四.将Log4qt组装成为一个单独模块 五.使用配置文件的方式 ...

  2. qt的输出中文,数字到表格

    最近在做项目的时候,被乱码问题弄得贼烦.于是总结了一下不同类型的字符间的转换问题,供参阅. 首先对于一个qt项目,比较常用的是结构体,结构体定义变量的时候,无非就是int,char,和float,再就 ...

  3. qt怎么输出一个map里的所有键值_《长安十二时辰》里的MapReduce原理

    一 什么是MapReduce MapReduce是一种编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.最早是由谷歌2004年公布的 MapReduce论文,论文描述了大数据的分布式计算方式 ...

  4. oracle 控制html输出样式,Oracle之sqlplus输出到html

    最近由于工作原因,需要把sqlplus里面SQL结果输出到html里面去,本来想用PLSQL Developer这个工具的,但是想到不是每个环境都是可以安装的,所以就研究了一下. 通过研究发现原来or ...

  5. oracle输出数据,Oracle数据库输出输入

    输出输入输出语法dbms_output.put_line(输出内容) begin //输出并换行 dbms_output.put_line('你好'||"张三"); //不换行 d ...

  6. Oracle - 输出Hello,Oracle!

    PL/SQL块 变量的赋值 Oracle输出语句 单引号的使用(字符串不可以使用双引号标明) --环境:Oracle 11g XEset serveroutput on; declarea varch ...

  7. oracle存储过程输出调试,Oracle存储过程的调试方法

    Oracle存储过程可以根据我们的需求进行调试修改,下面就为您介绍如何修改一个Oracle存储过程的实际操作步骤,供您参考学习. 如果你要执行Oracle存储过程,首先你需要写出一个关于输出的字符串& ...

  8. oracle输出查看,ORACLE关于如何是exp导出还是expdp并查看信息

    今天无意同事告诉我这样可以查看是EXPDP还是EXP文件同时可以查看字符集版本等,是一个不错的办法,但是我想说的不是这个方法向后看 这个例子来自网络 DECLARE t1 ku$_dumpfile_i ...

  9. Qt控制台输出QString

    有时候想在控制台输出我们想要的QString变量. 1.qDebug可以实现在控制台终端打印,但我们还是想使用C++中的std::cout<<variable This function ...

最新文章

  1. 基于PyQt的扫雷游戏实现_下篇
  2. LeetCode-25:K 个一组翻转链表
  3. HCIE-Security Day3:防火墙特征和组网方式
  4. 实现列表CListCtrl可点击编辑
  5. java语言程序设计 第八版 基础篇_Java语言程序设计基础篇(第八版)编程8.7答案
  6. 原理图端口符号_什么是电气原理图和电气接线图,二者区别及绘制要求是什么?...
  7. Linux终端欢迎界面
  8. Python如何换pip的源(阿里云或清华云等源)
  9. 华为鸿蒙开发者大赛,超25000位开发者,华为举办首届鸿蒙开发者创新大赛颁奖典礼...
  10. 服务器装机选哪个系统好,服务器该装08系统好还是03系统好?
  11. tekton入门 - tasks
  12. C语言 指针 规范,C语言学习知识指针习题集附规范标准答案.doc
  13. 最大流/最小割算法总结
  14. Linux设定密码策略
  15. 会oracle能找什么岗位的工作,oracle岗位职责
  16. (附源码)SSM校园一卡通管理系统JAVA计算机毕业设计项目
  17. 理解深度学习.PDF、国外AIGC各模态产品梳理.pdf、构建企业级的私有大模型.pdf
  18. 手机纳米镀膜技术教程_纳米技术将在医疗保健的未来中发挥巨大作用
  19. 2021数据分析赛事来了!
  20. 大脚插件技能栏美化_血条也性感:TidyPlates姓名板美化增强插件

热门文章

  1. (译)如何使用cocos2d制作一个塔防游戏:引子
  2. Java中的锁原理、锁优化、CAS、AQS详解!
  3. 操作系统(十一)处理机调度概述
  4. spring计算方圆300km内其它城市(附完整代码)
  5. SGU 269. Rooks(DP)
  6. Linux CentOS下配置SVN+SVN勾子
  7. modelsim-altera
  8. 虚拟社会建设需要“网络社工”助力
  9. 改进同步等待的网络服务端应用 (转)
  10. linux下软件的安装[转]