C++ 【异步日志模块和std::cout << 一样使用习惯替代性好】 使用示例,后续加上远程日志

简单 易用

使用示例

    CLogSystem::Instance().SetLogLevel( E_LOG_LEVEL::LOG_LEVEL_INFO | E_LOG_LEVEL::LOG_LEVEL_DEBUG | E_LOG_LEVEL::LOG_LEVEL_DUMP );CLogSystem::Instance().SetFileInfo(true, "./log.txt");LogDebug() << 12;LogInfo() << "hello, world!";std::string str = { 1, 2, 3, 4, 12 };QByteArray data;QDataStream out(&data, QIODevice::WriteOnly);out.setByteOrder(QDataStream::BigEndian);uint16_t u16MsgId = 0x55AA;uint8_t u8Length = 0x01;uint8_t u8Result = 0x01;out << u16MsgId << u8Length << u8Result;LogDump() << data.data();

在这里插入图片描述

公共头定义

/*
**  File name:   LogCommon.h
**  Author:      
**  Date:        2024-11-4
**  Brief:       日志系统公共头文件
**  Copyright (C) 1392019713@qq.com All rights reserved.
*/#pragma once#include <string>
#include <sstream>enum E_LOG_LEVEL
{LOG_LEVEL_DEBUG = 1,  // 调试信息LOG_LEVEL_INFO = 2,   // 一般信息LOG_LEVEL_WARN = 4,   // 警告信息LOG_LEVEL_ERROR = 16,  // 错误信息LOG_LEVEL_DUMP = 32,   // 16进制数据
};static const char* GetLogLevelString(int nLevel)
{switch (nLevel){case LOG_LEVEL_DEBUG:return "DEBUG";case LOG_LEVEL_INFO:return "INFO";case LOG_LEVEL_WARN:return "WARN";case LOG_LEVEL_ERROR:return "ERROR";case LOG_LEVEL_DUMP:return "DUMP";default:return "NONE";}
}**日志流类**
/*
**  File name:   LogStream.h
**  Author:      
**  Date:        2024-11-4
**  Brief:       日志流类
**  Copyright (C) 1392019713@qq.com All rights reserved.
*/#pragma once#include <stdint.h>
#include "LogCommon.h"
#include "LogSystem.h"
#include "LogWriter.h"
#include <string>
#include <chrono>class CByteArray;class CLogLocator
{
public:CLogLocator(const char* szFile, uint32_t nLine);~CLogLocator();public:const char* m_szFile;uint32_t m_nLine;
};class CLogStream
{
public:/** @brief 构造函数* @param eLevel 日志级别* @param szMsg 日志内容* @param szFile 日志文件名* @param szFunc 日志函数名* @param nLine 日志行号* @Note 日志格式为 [2024-01-01 12:34:56.789] [DEBUG] [file:func:line] [pid] msg*/CLogStream(E_LOG_LEVEL eLevel, const CLogLocator& rLogLocator);CLogStream& operator <<(bool bArg);CLogStream& operator <<(char cArg);CLogStream& operator <<(int16_t n16Arg);CLogStream& operator <<(uint16_t u16Arg);CLogStream& operator <<(int32_t n32Arg);CLogStream& operator <<(uint32_t u32Arg);CLogStream& operator <<(int64_t n64Arg);CLogStream& operator <<(uint64_t u64Arg);CLogStream& operator <<(double dArg);CLogStream& operator <<(const char* szArg);CLogStream& operator <<(const std::string& strArg);~CLogStream();private:std::string String2Hex(const std::string& str);private:std::string m_strMsg;std::string m_strLogHead;E_LOG_LEVEL m_eLevel;
};

实现

#include "../Include/LogStream.h"CLogLocator::CLogLocator(const char* szFile, uint32_t nLine)
{m_szFile = szFile;m_nLine = nLine;
}CLogLocator::~CLogLocator()
{
}//
CLogStream::CLogStream(E_LOG_LEVEL eLevel, const CLogLocator& rLogLocator)
{auto now = std::chrono::system_clock::now();std::time_t   now_time_t = std::chrono::system_clock::to_time_t(now);std::tm now_tm{};localtime_s(&now_tm, &now_time_t);auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;char szTime[27] = { 0 };strftime(szTime, sizeof(szTime), "[%Y-%m-%d %H:%M:%S", &now_tm);snprintf(szTime + strlen(szTime), sizeof(szTime) - strlen(szTime), ".%03ld]", static_cast<long>(milliseconds.count()));m_strLogHead = szTime + std::string(" [") + std::string(GetLogLevelString(eLevel)) + "]";if (CLogSystem::Instance().IsHasFileInfo()){m_strLogHead += " [" + std::string(rLogLocator.m_szFile) +  ":" + std::to_string(rLogLocator.m_nLine) + "]";}if (CLogSystem::Instance().IsHasPid()){auto tid = std::this_thread::get_id();std::stringstream s;s << tid;m_strLogHead += " [" + s.str() + "]";}m_eLevel = eLevel;
}CLogStream::~CLogStream()
{CByteArray byteArray;if (m_eLevel == E_LOG_LEVEL::LOG_LEVEL_DUMP){std::string strLog = String2Hex(m_strMsg);byteArray.m_strMsg = m_strLogHead + " " + strLog + "\n";std::cout << strLog << '\n';}else {byteArray.m_strMsg = m_strLogHead  + " " + m_strMsg + "\n";std::cout << m_strMsg << '\n';}CLogWriter::Instance().WriteLog(byteArray);
}std::string CLogStream::String2Hex(const std::string& str)
{std::string strResult;for (size_t i = 0; i < str.size(); i++){char szValue[4];memset(szValue, 0, sizeof(szValue));snprintf(szValue, sizeof(szValue), "%02X ", (uint8_t)str[i]);strResult += szValue;}return strResult;
}CLogStream& CLogStream::operator<<(bool bArg)
{if (bArg){m_strMsg += " true";}else{m_strMsg += " false";}return *this;
}CLogStream& CLogStream::operator<<(char cArg)
{m_strMsg += cArg;return *this;
}CLogStream& CLogStream::operator<<(int16_t n16Arg)
{m_strMsg += std::to_string(n16Arg);return *this;
}CLogStream& CLogStream::operator<<(uint16_t u16Arg)
{m_strMsg += std::to_string(u16Arg);return *this;
}CLogStream& CLogStream::operator<<(int32_t n32Arg)
{m_strMsg += std::to_string(n32Arg);return *this;
}CLogStream& CLogStream::operator<<(uint32_t u32Arg)
{m_strMsg += std::to_string(u32Arg);return *this;
}CLogStream& CLogStream::operator<<(int64_t n64Arg)
{m_strMsg += std::to_string(n64Arg);return *this;
}CLogStream& CLogStream::operator<<(uint64_t u64Arg)
{m_strMsg += std::to_string(u64Arg);return *this;
}CLogStream& CLogStream::operator<<(double dArg)
{m_strMsg += std::to_string(dArg);return *this;
}CLogStream& CLogStream::operator<<(const char* szArg)
{m_strMsg += szArg;return *this;
}CLogStream& CLogStream::operator<<(const std::string& strArg)
{m_strMsg += strArg;return *this;
}

具体实现链接 git https://gitee.com/wyj4869/LogSystem.git

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINUX c++环境

安装docker 拉取code-server镜像 1.安装GCC&#xff0c;GDB yum -y install gcc yum -y install gcc-c yum install gdb 创建文件夹和文件 linux下C开发_linux c-CSDN博客 第一步:预处理&#xff1a;将源代码的.c 、.cpp 、.h 等文件包含到一个文件中&#xff0c;预处理结…

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…

源码安装triton 及出错处理,跟最简应用示例 01 vectorAdd 验证

-1, 源码安装 triton出错信息 WARNING: The user site-packages directory is disabled. error: cant create or remove files in install directory The following error occurred while trying to add or remove files in the installation…

EC2还原快照

EC2还原快照 AWS EC2 磁盘快照 是您 Amazon Elastic Block Store (EBS) 卷在特定时间点的增量备份。您可以使用快照创建 EBS 卷的副本&#xff0c;以便在出现故障时恢复数据或将数据迁移到其他区域。 创建磁盘快照 找到ec2实例挂载的磁盘&#xff0c;直接选择创建快照 等待创建…

提升数据分析效率:Excel Power Query和Power Pivot的妙用

在日常工作中&#xff0c;微软的Excel Power Query和Power Pivot是提升数据处理和分析效率的利器。他们的特点也各不相同&#xff0c;Power Query侧重数据的高效导入与清洗&#xff0c;Power Pivot更测试数据建模与复杂计算。下面将介绍它们各自的功能&#xff0c;并提供应用案…

优先算法 —— 双指针系列 - 快乐数

1. 快乐数 题目链接&#xff1a; 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/description/ 2. 题目解析 示例1&#xff1a; 示例2&#xff1a; 3. 算法原理 两种情况&#xff1a;我们可以把两种情况都看作为循环&#xff0…

【C++打怪之路Lv16】-- map set

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电&#xff0c;真双极性模拟输入可以选择10 V&#xff0c;5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式&#xff1a; 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …

利用Python爬虫获取1688商品类目:技术解析

在电商领域&#xff0c;数据的获取和分析对于市场趋势的把握至关重要。1688作为中国领先的B2B电商平台&#xff0c;其商品类目的数据对于商家来说具有极高的价值。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;以合法合规的方式获取1688商品类目信息。 Python爬虫技术…

全文单词统计

目标&#xff1a;统计词频 import scala.io.Source //知识点 //1.字符串.split("分隔符")&#xff1a;把字符串用指定的分隔符。拆分成多份&#xff0c;保存在数组中 object test1 {def main(args: Array[String]): Unit { //从文件1.txt中读入内容val contentSourc…

【SPIE出版|四大高校联合举办】先进算法与图像处理技术国际学术会议(IC-AAIP 2025)

&#x1f4da;IC-AAIP 2025【ISSN:0277786X】 2025年先进算法与图像处理技术国际学术会议 ⏰时间&#xff1a;2025年8月9日至10日 &#x1f440;地点&#xff1a;中国沈阳 &#x1f4dd;出版商&#xff1a;SPIE 组委负责人刘老师&#xff1a;13660240104 2025年先…

小程序-基于java+SpringBoot+Vue的戏曲文化苑小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

通过 SSH 进行WordPress网站的高级服务器管理

我在管理hostease的服务器时&#xff0c;时常需要通过SSH登录服务器进行修改。而在网站管理中&#xff0c;SSH不仅是一个基础工具&#xff0c;更是高级用户用来精细化管理和优化服务器的重要工具。通过SSH&#xff0c;你可以深入监控服务器的性能、精细管理系统资源&#xff0c…

MFC 对话框中显示CScrollView实例

有时候我们需要在对话框中显示CScrollView效果的控件&#xff0c;类似于以下效果&#xff1a; 使用实例可参考&#xff1a;MFC对话框显示CScrollView例子_哔哩哔哩_bilibili 创建CScrollView中显示的子对话框与子类&#xff1a; 两个对话框对应的类&#xff1a; CScrollView继…

vue3 ajax获取json数组排序举例

使用axios获取接口数据 可以在代码中安装axios包&#xff0c;并写入到package.json文件&#xff1a; npm install axios -S接口调用代码举例如下&#xff1a; const fetchScore async () > {try {const res await axios.get(http://127.0.0.1:8000/score/${userInput.v…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…

mini-spring源码分析

IOC模块 关键解释 beanFactory&#xff1a;beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry&#xff0c;BeanDefinition注册表接口&#xff0c;定义注册BeanDefinition的方法 beanReference&#xff1a;增加Bean…

linux内核读写硬盘文件 kernel_writekernel_read

简介 在内核中读取硬盘文件&#xff0c;内核5.10测试了下&#xff0c;可以正常运行。 代码 1. 使用filp_open打开文件 2. 使用kernel_write和kernel_read读写文件 3. 使用filp_close关闭文件 #include <linux/module.h> #include <linux/init.h> #include &l…

记录一次 k8s 节点内存不足的排查过程

背景&#xff1a;前端服务一直报404&#xff0c;查看k8s日志&#xff0c;没发现报错&#xff0c;但是发现pods多次重启。 排查过程&#xff1a; 查看pods日志&#xff0c;发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…