Log4Qt日志框架 - 日志输出重定向(03)

news2024/10/6 1:37:36

Log4Qt日志框架 - 日志格式化(02)icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/138417616?spm=1011.2266.3001.6217

一、Log4Qt输出重定向

Log4Qt继承关系图

  1. AppenderSkeleton:实现一般的功能
  2. DebugAppender:将日志附加到平台调试(Window-stdout或Linux-stdrr)
  3. ListAppender:将日志追加到列表
  4. NullAppender:忽略所有附加请求
  5. WriteAppender:将日志附加到QTextStream
    1. ConsoleAppender:附加到stdout或stdrr
    2. FileAppender:将日志信息附加到文件
    3. DailRollingFileAppender:以指定频率滚动日志文件
    4. RollingFileAppender:以达到指定大小时滚动日志文件

1、输出到控制台

#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/fileappender.h"
#include "log4qt/loggerrepository.h"
#include "log4qt/patternlayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/simplelayout.h"
#include "log4qt/ttcclayout.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 1
	// 创建一个 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();
#endif

    return a.exec();
}

2、输出到文件

#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/fileappender.h"
#include "log4qt/loggerrepository.h"
#include "log4qt/patternlayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/simplelayout.h"
#include "log4qt/ttcclayout.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 1
	// 创建一个 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() + "/Logs/out.log";
	Log4Qt::FileAppender *appender = new Log4Qt::FileAppender(layout, file, true);//true:append,false:truncate
	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();
#endif

    return a.exec();
}

3、以指定频率滚动日志文件

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"每月

 注:单引号内的内容不会被处理,如:'.'

#include <qdir.h>
#include <qdebug.h>
#include <qthread.h>

#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/fileappender.h"
#include "log4qt/loggerrepository.h"
#include "log4qt/patternlayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/simplelayout.h"
#include "log4qt/ttcclayout.h"
#include "log4qt/dailyrollingfileappender.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 1
	qDebug() << "********** Begin **********";

	// 使用 rootLogger 打印日志
	Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();

	// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)
	Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();
	layout->setName("My Layout");
	layout->activateOptions();

	// 创建一个 DailyRollingFileAppender(以指定的频率滚动)
	Log4Qt::DailyRollingFileAppender *appender = new Log4Qt::DailyRollingFileAppender();
	appender->setName("My Appender");
	appender->setLayout(layout);
	appender->setFile(QCoreApplication::applicationDirPath() + "Logs/log.out");
	appender->setImmediateFlush(true);  // 立即刷新
	appender->setThreshold(Log4Qt::Level::INFO_INT);  // 设置阈值级别为 INFO
	appender->setAppendFile(true);  // 追加的方式
	appender->setDatePattern(Log4Qt::DailyRollingFileAppender::MINUTELY_ROLLOVER); // 日期模式
	appender->activateOptions();

	// 在 logger 上添加 appender
	logger->addAppender(appender);

	// 设置级别为 DEBUG
	logger->setLevel(Log4Qt::Level::DEBUG_INT);

	int count = 0;
	while (count < 10) {
		// 输出信息
		logger->info("Hello, Log4Qt!");
		QThread::sleep(30);
		++count;
	}

	// 关闭 logger
	logger->removeAllAppenders();
	logger->loggerRepository()->shutdown();

	qDebug() << "********** End **********";
#endif

    return a.exec();
}

4、以达到指定大小时滚动文件

#include <qdir.h>
#include <qdebug.h>
#include <qthread.h>

#include "log4qt/logger.h"
#include "log4qt/logmanager.h"
#include "log4qt/fileappender.h"
#include "log4qt/loggerrepository.h"
#include "log4qt/patternlayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/simplelayout.h"
#include "log4qt/ttcclayout.h"
#include "log4qt/dailyrollingfileappender.h"
#include "log4qt/rollingfileappender.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 1
	qDebug() << "********** Begin **********";

	// 使用 rootLogger 打印日志
	Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();

	// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)
	Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();
	layout->setName("My Layout");
	layout->activateOptions();

	// 创建一个 RollingFileAppender(滚动多个文件)
	Log4Qt::RollingFileAppender *appender = new Log4Qt::RollingFileAppender();
	appender->setName("My Appender");
	appender->setLayout(layout);
	appender->setFile(QCoreApplication::applicationDirPath() + "/Logs/log.out");
	appender->setImmediateFlush(true);  // 立即刷新
	appender->setThreshold(Log4Qt::Level::INFO_INT);  // 设置阈值级别为 INFO
	appender->setAppendFile(true);  // 追加的方式
	// 等价于 appender->setMaximumFileSize(10 * 1024);
	appender->setMaxFileSize("10KB"); // 在滚动之前设置文件的最大大小
	appender->setMaxBackupIndex(5);  // 设置备份索引
	appender->activateOptions();

	// 在 logger 上添加 appender
	logger->addAppender(appender);

	// 设置级别为 DEBUG
	logger->setLevel(Log4Qt::Level::DEBUG_INT);

	for (int i = 0; i < 1000; i++)
	{
		logger->info("write RollingFileAppender info to file");
	}
	
	// 关闭 logger
	logger->removeAllAppenders();
	logger->loggerRepository()->shutdown();

	qDebug() << "********** End **********";
#endif

    return a.exec();
}

5、输出到数据库

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

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

相关文章

第Y9周:重要模块解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 以con.py为例&#xff1a; 一、autopad 二、Conv 三、Focus 四、C2f 文件…

C++入门系列-基于范围的for循环(C++11)和指针空值nullptr(C++11)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 基于范围的for循环 范围for的语法 在C98中如果要遍历一个数组&#xff0c;可以按照以下方式进行&#xff1a; void TestFor() {int array[] { 1,2,3,4,5 };for (int i 1; i …

nuxt3使用记录六:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为&#xff0c;今天我突然很好奇&#xff0c;我发现之前构建的自动产生的200.html和404.html足足290k&#xff0c;怎么这么大呢&#xff1f;不是很占用我带宽&#xff1f; 一个啥东西都没有的静态页面&#xff0c;凭啥这么大&#xff01;所以我就想着手动把他…

JavaEE 初阶篇-深入了解 Junit 单元测试框架和 Java 中的反射机制(使用反射做一个简易版框架)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Junit 单元测试框架概述 1.1 使用 Junit 框架进行测试业务代码 1.2 Junit 单元测试框架的常用注解&#xff08;Junit 4.xxx 版本&#xff09; 2.0 反射概述 2.1 获…

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决 2024/5/2 17:17 缘起&#xff1a;QMIThread.c:2100:9: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode 1、修改Makefile为ARM32架构&#xff1a; Z:\quectel-CM\Makefile ifneq ($…

VFS 虚拟文件系统(上)

目录 概念 通用文件模型 VFS所处理的系统调用 VFS的数据结构 超级块对象 索引节点对象&#xff08;inode&#xff09; 文件对象 目录项对象 目录项高速缓存 与进程相关的文件 文件系统类型 特殊文件系统 文件系统类型注册 文件系统处理 命名空间 概念 虚拟文件系…

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下&#xff0c;确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术&#xff0c;具有灵活状态切换功能的智能仿真三相电能表&#xff0c;旨在通过技术创新提高电能计量人员的培训…

微信服装分销配送商城小程序的效果是什么

无论服装经销商还是厂家主要思考的就是怎样获客转化销售&#xff0c;衣服款式多样化、线下门店和线上电商平台各品牌竞争愈加激烈&#xff0c;客户消费渠道广&#xff0c;促进着商家需要寻找更多机会以及怎样服务好流量。 私域运营模式中小程序是重要的工具之一&#xff0c;服…

excel办公系列-图表元素及其作用

Excel图表元素及其作用 Excel图表由各种元素组成&#xff0c;每个元素都有其特定的作用&#xff0c;可以帮助我们更清晰地传达数据信息。下面将介绍Excel图表中常见的一些元素及其作用&#xff0c;并附上相关截图。 原始数据 月份 网站访问量 (万次&#xff09; 销售额 (万…

机器学习:深入解析SVM的核心概念【二、对偶问题】

对偶问题 **问题一&#xff1a;什么叫做凸二次优化问题&#xff1f;而且为什么符合凸二次优化问题&#xff1f;**为什么约束条件也是凸的半空间&#xff08;Half-Space&#xff09;凸集&#xff08;Convex Set&#xff09;半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

PDF中伪代码、原理示意图等导出为矢量图

需求&#xff1a;将 LaTeX 中生成的伪代码 PDF 转换成 svg 或 emf 格式的矢量图&#xff0c;然后插入 word 或 ppt 中。 1 伪代码PDF导出为矢量图 1.1 通过 Adobe Illustrator 处理将 先新建一个空白的PDF&#xff0c;然后文件-->置入导入PDF&#xff1b; 2.选中这个图片…

基于Springboot的交流互动系统

基于SpringbootVue的交流互动系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…

C语言例题29:在屏幕上显示一个等腰三角形

#include <stdio.h>void main() {int i, j;int x;printf("输入等腰三角形行数&#xff1a;");scanf("%d", &x);for (i 1; i < x; i) {for (j i; j < x; j) {printf(" "); //输出空格占位}for (j 1; j < 2 * i; j) {printf…

HTTP协议Request

文章目录 HTTP协议介绍概念版本分类特点 浏览器抓包观察请求报文协议步骤实现 Request和Response概述Request对象Request继承体系Request获取请求数据获取请求行数据获取请求头数据获取请求体数据获取请求参数(通用方式) 解决post请求乱码问题解决思路解决方案 Request请求转发…

【20-时间序列预测:使用Scikit-learn处理时间数据】

文章目录 前言理解时间序列数据处理时间数据数据格式与解析时间组件提取时间序列可视化构建时间序列预测模型数据集分割特征工程选择模型验证与评估评价指标选择结论前言 时间序列预测在金融、天气预报和销售分析等领域中扮演着重要角色。在本文中,我们将探讨如何使用Scikit-l…

Linux快速安装Nginx和重新添加模块

目录 一、Nginx快速安装1、下载Nginx2、配置Nginx模块 二、Ngnix重新编译和安装模块 一、Nginx快速安装 1、下载Nginx 直接进入Nginx官网下载Linux最新稳定版本&#xff0c;我之前下载的版本是1.23.0。 2、配置Nginx模块 下载完后我把源码压缩文件解压放在/opt/appl/nginx…

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门 1、 for i in range(4):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(6)Dev.turnRight()3、 for i in range(3):Dev.turnRight()Dev.step(2)Dev.turnLeft()Dev.step(-3)4、 for i in range(4):Dev…

DNS、ICMP、NAT以及代理服务器

目录 1. DNS 1.1. DNS 背景 1.2. 域名简介 1.3. 域名解析过程 2. ICMP 2.1. ICMP 的功能 2.2. ICMP 的报文格式 2.3. ping 命令 2.4. traceroute 命令 3. NAT和代理服务器 3.1. NAT 技术 3.2. NAT IP转换过程 3.3. NAT 技术的缺陷 3.4. 代理服务器 3.4.1. 正向…

【redis】Redis数据类型(四)Set类型

目录 Set类型介绍使用场景 Set类型数据结构set的单个元素的添加过程IntSet哈希表内存结构 常用命令SADD示例 SREM示例 SMEMBERS示例 SISMEMBER示例 SCARD示例 SMOVE示例 SPOP示例 SRANDMEMBER示例 SINTER示例 SINTERSTORE示例 SUNION示例 SUNIONSTORE示例 SDIFF示例 SDIFFSTORE…

【每日算法】理论:大模型相关 刷题:队列的应用

上期文章 【每日算法】理论&#xff1a;多模态系列 刷题&#xff1a;栈的应用 文章目录 上期文章一、上期问题二、本期理论问题1、GPT1&#xff0c;2&#xff0c;3的区别2、解决过拟合的方法3、LLM的生成原理4、对比LSTM,GRU,transformer5、zero-shot6、pre-norm和post-norm的…