项目日志——日志等级类和日志消息类的设计、实现、测试

devtools/2024/9/20 7:26:09/ 标签: c++, 日志系统, 同步, 异步, 项目, 开源

文章目录

    • 日志等级类
      • 设计
      • 实现
      • 测试
    • 日志消息类
      • 设计
      • 实现

日志等级类

设计

日志等级一共分7个等级

  • UNKNOW = 0
  • OFF 关闭所有日志输出
  • DEBUG 调试等级
  • INFO 提示等级
  • WARN 警告等级
  • ERROR 错误等级
  • FATAL 致命等级
  • OFF 关闭所有日志的输出

每一个项目都会设置一个默认输出等级,只有当输出的日志内容大于等于这个默认输出等级时,才会对这一条日志进行实质性的输出

提供一个接口,将对应的等级枚举转换为一个字符串

实现

/*日志等级类的实现1. 定义枚举类,枚举出日志的等级2. 提供转换接口,将枚举转换成对应的字符串
*/namespace Xulog
{class LogLevel{public:enum class value{UNKNOW = 0,DEBUG,INFO,WARN,ERROR,FATAL,OFF};static const char *toString(LogLevel::value level){switch (level){case LogLevel::value::DEBUG:return "DEBUG";break;case LogLevel::value::INFO:return "INFO";break;case LogLevel::value::WARN:return "WARN";break;case LogLevel::value::ERROR:return "ERROR";break;case LogLevel::value::FATAL:return "FATAL";break;case LogLevel::value::OFF:return "OFF";break;}return "UNKNOW";}};
}

测试

    std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::DEBUG) << std::endl;std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::INFO) << std::endl;std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::WARN) << std::endl;std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::ERROR) << std::endl;std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::FATAL) << std::endl;std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::OFF) << std::endl;std::cout << Xulog::LogLevel::toString(Xulog::LogLevel::value::UNKNOW) << std::endl;

日志消息类

设计

中间存储日志所需的各项要素

  1. 日志输出时间
  2. 日志等级
  3. 源文件名称
  4. 源代码行号
  5. 线程ID
  6. 实际的日志主体消息
  7. 日志器名称

可以分别进行过滤,定位代码错误的位置,具体的日志主题消息

实现

/*日志消息类的实现,存储中间日志信息1. 日志输出时间2. 日志等级3. 源文件名称4. 源代码行号5. 线程ID6. 实际的日志主体消息7. 日志器名称
*/
#pragma once#include <iostream>
#include <thread>
#include <string>
#include "level.hpp"
#include "util.hpp"namespace Xulog
{struct LogMsg{sizei_t _ctime;         // 日志产生的时间戳size_t _line;           // 行号std::thread::id _tid;   // 线程IDLogLevel::value _level; // 日志等级std::string _file;      // 源文件名称std::string _logger;    // 日志器std::string _payload;   // 有效载荷数据LogMsg(LogLevel::value level,size_t line,const std::string file,const std::string logger,const std::string msg) : _ctime(Util::Date::getTime()),_level(level),_line(line),_tid(std::this_thread::get_id()),_file(file),_logger(logger),_payload(msg){}};
}

http://www.ppmy.cn/devtools/109028.html

相关文章

前端项目开发之prettier安装和使用

前端项目开发之安装prettier和使用 Prettier 是一个流行的代码格式化工具&#xff0c;可以帮助你保持代码风格的一致性。以下是如何在 Visual Studio Code (VS Code) 中安装和使用 Prettier 的步骤&#xff1a; 安装 Prettier 通过 VS Code 扩展市场安装&#xff1a; 打开 V…

使用AI赋能进行软件测试-文心一言

1.AI赋能的作用 提高速度和效率缺陷预测与分析 2.AI互动指令格式--文心一言 角色、指示、上下文例子、输入、输出 a 直接问AI 针对以下需求&#xff0c;设计测试用例。 需求&#xff1a; 1、账号密码登录系统验证账号和密码的正确性。 验证通过,用户登录成功,进入个人中心;验…

pytorch tensor.expand函数介绍

在 PyTorch 中&#xff0c;tensor.expand()是一个用于扩展张量维度的函数。 一、函数作用 它允许你在不复制数据的情况下&#xff0c;将张量的形状扩展到指定的维度大小。这对于需要在特定维度上重复数据的操作非常有用&#xff0c;例如在进行广播操作时调整张量的形状。 二…

Web3社交新经济,与 SOEX 实现无缝交易的高级安全性

出于充分的理由&#xff0c;安全性是交易中至关重要的考虑因素。每个人都应该确保自己的资金在交易时是安全的。由于 &#xff33;&#xff2f;&#xff25;&#xff38; 充当您与交易所的最佳连接&#xff0c;因此必须强调的是&#xff0c;该系统不会引发任何安全问题。 &a…

com.baomidou.mybatisplus.annotation.DbType 无法引入

com.baomidou.mybatisplus.annotation.DbType 无法引入爆红 解决 解决 ❤️ 3.4.1 是mybatis-plus版本&#xff0c;根据实际的配置→版本一致 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId>&…

[动态规划] 删除并获得点数

给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] - 1 和 nums[i] 1 的元素。 开始你拥有 0 个点数。返回你能通过这些操…

国内短剧系统怎么搭建以及都需要那些资质?

聊到国内短剧&#xff0c;相信大家都不陌生&#xff0c;在各大短视频平台可谓是火的一批&#xff0c;您或许有想加入进来的想法&#xff0c;或是已经有规划还未实现的&#xff0c;请停下脚步&#xff0c;耐心看完该文章&#xff0c;相信一定会对你有所帮助的。本文介绍短剧平台…

做饭时用什么样的白酒能更好衬托食物的鲜味?

在做饭的时候&#xff0c;白酒扮演着举足轻重的角色&#xff0c;其核心功能在于祛除食材不良风味并显著提升菜肴的香醇层次。挑选适宜的白酒时&#xff0c;需细致考量其种类与酒精浓度&#xff0c;尽量与食材的风味和谐共生&#xff0c;而非相互抵触。以下是酱酒亮哥yutengtrad…

LeetCode HOT100系列题解之最大正方形(6/100)

题目&#xff1a;最大正方形. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 第一种方法&#xff1a;前缀和二分答案&#xff08;暴力优化&#xff09;我感觉比官方给的暴力好一点 时间复杂度&#xff1a; 暴力优化1&#xff1a;通过前缀和减少判断1出现得次数…

SpringBoot教程(十五) | SpringBoot集成RabbitMq(消息丢失、消息重复、消息顺序、消息顺序)

SpringBoot教程&#xff08;十五&#xff09; | SpringBoot集成RabbitMq&#xff08;消息丢失、消息重复、消息顺序、消息顺序&#xff09; RabbitMQ常见问题解决方案问题一&#xff1a;消息丢失的解决方案&#xff08;1&#xff09;生成者丢失消息丢失的情景解决方案1&#xf…

Elasticsearch之原理详解

简介 ES是使用 Java 编写的一种开源搜索引擎&#xff0c;它在内部使用 Lucene 做索引与搜索&#xff0c;通过对 Lucene 的封装&#xff0c;隐藏了 Lucene 的复杂性&#xff0c;取而代之的提供一套简单一致的 RESTful API 然而&#xff0c;Elasticsearch 不仅仅是 Lucene&#…

【ES备份和还原索引数据】

文章目录 备份&#xff08;Snapshot&#xff09;还原&#xff08;Restore&#xff09;注意事项示例 在 Elasticsearch 中&#xff0c;备份和还原索引数据通常通过快照&#xff08;Snapshot&#xff09;和恢复&#xff08;Restore&#xff09;机制来实现。以下是详细的操作步骤&…

【RabbitMQ】核心概念

界⾯上的导航栏共分6部分, 这6部分分别是什么意思呢, 我们先看看RabbitMQ的工作流程 1. Producer和Consumer Producer:生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息 Consumer: 消费者,也是RabbitMQ Server的客户端,从RabbitMQ接收消息 Broker:其实就是RabbitMQSer…

策略规划:在MySQL中实现数据恢复的全面指南

数据恢复是数据库管理中至关重要的一环&#xff0c;它确保在发生数据丢失或损坏的情况下&#xff0c;能够迅速且准确地恢复数据。在MySQL中&#xff0c;实现有效的数据恢复策略规划需要综合考虑备份策略、备份类型、存储管理、故障转移机制以及恢复流程。本文将深入探讨如何在M…

springcloud-GateWay

Spring Cloud Gateway 是 Spring Cloud 微服务架构中的一个重要组件&#xff0c;用于提供 API 网关功能。作为 API 网关&#xff0c;Spring Cloud Gateway 充当客户端和后端服务之间的代理&#xff0c;负责请求路由、过滤、安全认证、负载均衡等功能。在分布式系统中&#xff0…

2024数学建模国赛B题代码

B题已经完成模型代码&#xff01;详情查看文末名片 问题1&#xff1a;可以考虑使用统计学中的“样本量估算”方法&#xff0c;使用二项分布或正态近似来决定最少的样本量&#xff0c;并通过假设检验&#xff08;如单侧检验&#xff09;在95%和90%置信度下进行判断。 import n…

漫谈设计模式 [6]:适配器模式

引导性开场 菜鸟&#xff1a;老鸟&#xff0c;我最近在项目中遇到一个问题&#xff0c;我们的系统需要集成一个新的第三方库&#xff0c;但这个库的接口和我们现有的代码完全不兼容。我该怎么办&#xff1f; 老鸟&#xff1a;这是个常见的问题&#xff0c;很多开发者都会遇到…

浙大数据结构:03-树3 Tree Traversals Again

这道题也不算难&#xff0c;我依然采用map来进行处理 &#xff0c;代码依旧较短 机翻 1、条件准备 我这里采用数组模拟栈&#xff0c;tt指向栈顶&#xff1b; map的键存结点值&#xff0c;后面数对存左右子树的结点值 head存头节点的值 #include<iostream> #include…

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

go-gin响应被覆盖为400,即使正常返回

问题描述及排查过程 一个正常响应里&#xff0c;http状态码为400&#xff0c;但实际已经成功返回了数据&#xff0c;且无论是自己写的业务逻辑代码还是中间件都没有返回400&#xff08;bad request&#xff09;这个状态码。 而且gin debug日志中也提示说有操作试图将状态码40…