项目日志——框架模块设计实用工具类的设计、实现、测试

news2024/9/27 7:25:19

文章目录

    • 框架模块设计
      • 功能叙述
      • 模块划分
      • 模块关系图
    • 实用工具类
      • 设计
      • 实现
      • 测试

框架模块设计

功能叙述

日志系统的作用就是将一条消息格式化指定格式的字符串之后,写入到指定位置

这个指定位置就有说法了

  1. 标准输出
  2. 指定文件
  3. 滚动文件

我们可以写入到其中的一种,或者三种同时写入,也可以扩展到数据库、远程服务器

除此之外,写入的时候,也要支持同步和异步的写入方式

日志输出以日志器为单位,支持多日志器,因此就需要对日志器管理

模块划分

  • 日志等级模块:对不同日志进行等级划分、对日志的输出进行控制,提供按照等级枚举字符串的功能
    • OFF:关闭
    • DEBUG:调试,调试信息输出
    • INFO:提示,提示型日志信息
    • WARN:警告,不影响运行,但可能不安全
    • ERROR:错误,程序运行出错的日志
    • FATAL:致命,代码异常
  • 日志消息模块:日志中所含的各类信息
    • 时间
    • 线程ID
    • 日志等级
    • 日志数据
    • 日志文件名
    • 日志行号
  • 消息格式化模块:设置日志的输出格式,提供对消息格式化的功能
    • 格式化内容:[%d{%H:%M:%S}]%T[%t]%T[%p]%T[%c]%T%f:%l%T%m%n
    • [12:01:54] [(TID)] [FATAL] [root] main.cc:13 套接字创建失败\n
  • 日志落地模块:负责对日志指定方向的写入输出
  • 日志器模块:对上面模块的整合、日志输出等级、日志信息格式化、日志消息落地模块
    • 同步日志器模块
    • 异步日志器模块
  • 异步线程模块:负责异步日志落地
  • 单例日志器管理模块:对日志全局管理,在项目任何位置,获取日志器执行输出

模块关系图

在这里插入图片描述

实用工具类

设计

提前设计一些零碎的功能性接口,以便于后面项目的开发

  • 获取系统时间
  • 判断文件是否存在
  • 获取文件路径
  • 创建目录
namespace Xulog
{
    namespace Util
    {
        class Date
        {
        public:
            static size_t getTime()
            {
                return (size_t)time(nullptr);
            }
        };
        class File{
            public:
                static bool exists(const std::string& pathname);
                static std::string path(const std::string& pathname);
                static void createDirectory(const std::string& pathname);
        };
    }
}

实现

            static bool exists(const std::string &pathname)
            {
                struct stat st;
                if (stat(pathname.c_str(), &st) < 0) // 判断文件是否存在
                    return false;
                return true;
            }
            static std::string path(const std::string &pathname)
            {
                size_t pos = pathname.find_last_of("/\\"); // 查找最后一个'/'或者'\'
                if (pos == std::string::npos)
                    return ".";                     // 如果没有找到路径分隔符,返回当前目录
                return pathname.substr(0, pos + 1); // 获取文件路径的目录部分
            }
            static void createDirectory(const std::string &pathname)
            {
                size_t pos = 0, idx = 0; // pos表示'/'的位置,idx表示起始位置
                while (idx < pathname.size())
                {
                    pos = pathname.find_first_of("/\\", idx); // 找第一个'\'
                    if (pos == std::string::npos)             // 如果没有任何目录,直接创建
                    {
                        mkdir(pathname.c_str(), 0777);
                        return;
                    }
                    std::string parent_dir = pathname.substr(0, pos + 1); // 找到父级目录
                    if (exists(parent_dir) == true)                       // 如果存在则直接找下一个
                    {
                        idx = pos + 1;
                        continue;
                    }
                    mkdir(parent_dir.c_str(), 0777);
                    idx = pos + 1;
                }
            }

测试

#include "util.hpp"

int main()
{
    std::cout << Xulog::Util::Date::getTime() << std::endl;
    std::string pathname = "./dir1/dir2/";
    Xulog::Util::File::createDirectory(Xulog::Util::File::path(pathname));

    return 0;
}

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

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

相关文章

半天攻略:用ChatGPT快速搞定高质量论文,从选题到完稿一站式指南!

在学术论文的撰写过程中&#xff0c;ChatGPT可以作为一个强大的辅助工具&#xff0c;帮助完成从确定主题到整理参考文献的各个环节。接下来&#xff0c;我们将详细介绍如何利用ChatGPT提升论文写作的效率和质量。 确定论文主题 初步探索&#xff1a;通过ChatGPT探索主题&#…

UAEXpert连接kepserver的OPC服务时,出现BadCertificateHostNamelnvalid报错--解决办法

描述&#xff1a; 虚拟机win10安装kepserver&#xff0c;本机的uaexpert软件连接虚拟机上的OPC UA服务&#xff0c;遇到BadCertificateHostNamelnvalid报错问题 报错信息如下&#xff1a; Error BadCertificateHostNamelnvalidwas returned during CreateSession,press Ignor…

Spring事务和事务传播机制(下)

我们上一篇文章学习了 Transactional 的基本使用。接下来我们学习 Transactional 注解的使用细节。 Transactional 注解当中有下面三个常见属性&#xff1a; 1、rollbackFor&#xff1a;异常回滚属性。指定能够触发事务回滚的异常类型。可以指定多个异常类型 2、IsoIation&…

开学季好物狂欢,这些神仙好物让你开学季事半功倍!

随着秋风送爽&#xff0c;开学季再次悄然而至。对于即将迎接新学期的学生们来说&#xff0c;这不仅仅是一个新起点&#xff0c;也是准备全新装备、挑战更高学习效率的好时机。在这个特殊的时节&#xff0c;我们特别为大家策划了一场“开学季好物狂欢”&#xff0c;精选了一系列…

数字人直播防封技巧升级!头部源码厂商如何实现7*24小时无间断直播?

当前&#xff0c;许多用户在使用数字人直播的过程中都遇到了直播间违规和账号被封两大问题&#xff0c;并因此蒙受了一定的损失。在此背景下&#xff0c;不少有计划引入数字人直播的企业和搭建数字人直播系统的创业者也开始有了犹豫。为了让大家能够更放心地入局&#xff0c;本…

Linux之MySQL日志

前言 数据库就像一个庞大的图书馆&#xff0c;而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样&#xff0c;数据库日志帮助我们追溯数据的变更、定位问题和还原状态。 在MySQL中&#xff0c;日志是非常重要的一个组成部分&#xff0c;它记录了数据…

创客匠人对话:如何让客户主动为你付费?北大教授发售秘籍大公开

老蒋创客圈第65期对话标杆直播连麦&#xff0c;我们邀请到【YD世界人才创造社】平台创始人白钰玮老师。为我们分享“家庭教育赛道如何创新模式&#xff0c;单场发售实现高创收&#xff1f;”&#xff0c;深度剖析如何去提升自己的核心竞争力&#xff1f;如何提升个人影响力&…

引领AI PC浪潮,Arm人工智能创新应用大赛火热报名中

AI PC&#xff0c;即搭载人工智能技术的个人电脑&#xff0c;正成为个人电脑市场的新宠儿。而正在如火如荼进行中的 Arm人工智能创新应用大赛&#xff0c;则为敏锐的开发者探索 AI PC 应用开发掘金之路提供了平台。 点击报名 挑战10万奖金池 AI PC 增长强劲&#xff0c;年出货…

2024跨境旺季营销:多渠道广告覆盖中,哪些平台是首选?

跨境电商的旺季即将来临&#xff0c;对于卖家们来说&#xff0c;如何进行有效的营销推广至关重要。在多渠道广告覆盖的策略下&#xff0c;选择合适的平台成为关键。那么&#xff0c;哪些平台是跨境旺季营销的首选呢&#xff1f; 一、社交媒体平台 1、Instagram 以图片和短视频…

易保全出席人工智能应用场景高峰论坛,发布AI-数据资产管理平台2.0应用成果

2024年9月5日&#xff0c;由上海合作组织国家多功能经贸平台、重庆市科技发展基金会指导&#xff0c;重庆市渝中区商务委员会等相关部门主办、华智未来(重庆)科技有限公司承办&#xff0c;重庆民营经济国际合作商会协办的“智驭未来创想无界人工智能应用场景高峰论坛暨成果发布…

使用 nuxi init 创建全新 Nuxt 项目

title: 使用 nuxi init 创建全新 Nuxt 项目 date: 2024/9/6 updated: 2024/9/6 author: cmdragon excerpt: 摘要:本文介绍了如何使用nuxi init命令创建全新的Nuxt.js项目,包括安装所需环境、命令使用方法、指定模板、强制克隆、启动开发服务器等步骤,并提供了完整的项目初…

DAY87 APP 攻防-安卓逆向篇Smail 语法反编译签名重打包Activity 周期Hook 模块

1、APK 逆向-数据修改-结构&格式 2、APK 逆向-逻辑修改-Smail 语法 3、APK 逆向-视图修改-Activity&Xml #章节点&#xff1a; 1、APP 资产-内在提取&外在抓包 2、APP 逆向-反编译&删验证&重打包 3、APP 安全-存储&服务&组件&注册等 演示案例&a…

RasberryPi 3B树莓派基本配置

RaspberryPi 3B树莓派基本配置 文章目录 RaspberryPi 3B树莓派基本配置一、准备工作1.1 硬件准备&#xff1a;1.1.1 树莓派和电源适配器&#xff1a;1.1.2 USB转TTL模块&#xff1a;1.1.3 读卡器和TF卡&#xff1a; 1.2 软件准备&#xff1a;1.2.1 下载 Raspberry Pi OS&#x…

SpringMvc后续3

返回值问题 ModelAndView返回 字符串返回 转发和重定向 默认返回页面是转发效果 如果需要重定向&#xff0c;在返回页面的时候&#xff0c;追加redirect:&#xff0c;后边需要追加视图后缀 Ajax返回 控制层 jsp文件 导入json包 Session问题

案例-上海某科技公司:监控易7.0重塑服务器监控模式

在上海这座充满创新与活力的城市中&#xff0c;科技型企业如雨后春笋般涌现&#xff0c;而上海某科技发展有限公司&#xff08;以下简称“该公司”&#xff09;便是其中的佼佼者。随着业务的蓬勃发展和IT环境的日益复杂&#xff0c;服务器作为业务运行的核心&#xff0c;其稳定…

2024全国大学省数学建模竞赛A题-原创参考论文(部分+第一问代码)

一问题重述 1.1 问题背景 "板凳龙"&#xff0c;又称"盘龙"&#xff0c;是浙闽地区的传统地方民俗文化活动。这种独特的表演艺术形式融合了中国传统龙舞的精髓和地方特色&#xff0c;展现了人们对美好生活的向往和对传统文化的传承。 在板凳龙表演中&am…

批量文件编码转换用python实现的utf8转gb2312,vscode设置特殊文件的默认打开编码

批量文件编码转换用python实现的utf8转gb2312, 任意编码之间的相互转换都是可以的.改一下下面的参数即可 convert.py文件内容如下 import os import glob import chardet#检测文件编码类型 def detect_file_encoding(file_path):with open(file_path, rb) as f:data f.read(…

InternVL-2B尝试

以最新的官方文档为准&#xff1a;https://internvl.readthedocs.io/en/latest/get_started/installation.html 一、环境配置 a. 下载InternVL完整的repo&#xff08;无权重&#xff0c;空间占的不大&#xff09; git clone https://github.com/OpenGVLab/InternVL.git b. …

Shopee 9.9大促活动定档,下半年首个大促你报名了吗?

官方数据显示&#xff0c;2023年9.9大促期间&#xff0c;仅活动开始后的两个小时内&#xff0c;Shopee的跨境订单量就同比增长了12倍。而去年12.12大促期间&#xff0c;活动开始两小时内&#xff0c;Shopee的跨境订单量增长到了平时的17倍&#xff0c;Shopee Mall的订单量激增了…

iOS——方法交换Method Swizzing

什么是方法交换 Method Swizzing是发生在运行时的&#xff0c;主要用于在运行时将两个Method进行交换&#xff0c;我们可以将Method Swizzling代码写到任何地方&#xff0c;但是只有在这段Method Swilzzling代码执行完毕之后互换才起作用。 利用Objective-C Runtimee的动态绑定…