news 2026/4/17 15:14:37

MPRPC项目(第十天,日志功能实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MPRPC项目(第十天,日志功能实现)

一、日志功能

在本项目中,日志有以下功能

1、异步写入:使用独立线程写日志,不影响主业务逻辑性能

2、分级日志:区分INFO和ERROR级别,便于过滤和处理

3、按日期分文件:每天生成独立的日志文件,便于管理和查找

4、维护系统稳定性和排查问题

多个线程指需要使用日志记录的线程,

二、日志管理

1、logger.h

#pragma once #include "lockqueue.h" #include<string> enum LogLevel { INFO,//普通信息 ERROR,//错误信息 }; //Mprpc框架提供的日志系统 class Logger { public: //获取日志唯一的实例对象 static Logger& GetInstance(); //设置日志级别 void SetLogLevel(LogLevel level); //写日志 void Log(std::string msg); private: LogLevel m_loglevel;//记录日志级别 LockQueue<std::string> m_lockQueue;//日志缓冲队列 Logger(); Logger(const Logger& other) = delete; Logger(Logger&&) = delete; }; //定义宏 #define LOG_INFO(logmsgFormat, ...) \ do \ { \ Logger& logger = Logger::GetInstance(); \ logger.SetLogLevel(INFO); \ char c[1024] = {0}; \ snprintf(c, 1024, logmsgFormat, ##__VA_ARGS__); \ logger.Log(c); \ } while(0); #define LOG_ERROR(logmsgFormat, ...) \ do \ { \ Logger& logger = Logger::GetInstance(); \ logger.SetLogLevel(ERROR); \ char c[1024] = {0}; \ snprintf(c, 1024, logmsgFormat, ##__VA_ARGS__); \ logger.Log(c); \ } while(0);

2、logger.cc

#include"logger.h" #include<iostream> //获取日志唯一的实例对象 Logger& Logger::GetInstance(){ static Logger logger; return logger; } Logger::Logger(){ //启动专门的写日志线程 std::thread writeLogTask([&](){ for(;;){ //获取当前日期,然后从队列获取日志信息,写入对应的日志文件中 time_t now = time(NULL); tm* now_tm = localtime(&now); char file_name[128]; sprintf(file_name, "%d-%d-%d.log.txt", now_tm->tm_year + 1900, now_tm->tm_mon + 1, now_tm->tm_mday); FILE* pf = fopen(file_name, "a+"); if(pf == NULL){ std::cout << "logger::open log file error" << std::endl; exit(EXIT_FAILURE); } std::string msg = m_lockQueue.Pop(); char time_buf[128]; sprintf(time_buf, "%d:%d:%d =>[%s]", now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec, m_loglevel == INFO ? "INFO" : "ERROR"); msg.insert(0, time_buf); msg.append("\n"); fputs(msg.c_str(), pf); fclose(pf); } }); //设置分离线程,守护线程 writeLogTask.detach(); } //设置日志级别 void Logger::SetLogLevel(LogLevel level){ m_loglevel = level; } //写日志 void Logger::Log(std::string msg){ m_lockQueue.Push(msg); }

三、异步日志队列

1、在MPRPC框架中的价值

  1. RPC调用性能:RPC服务的响应时间不会受日志写入影响(工作线程只需将日志消息放入队列即可继续执行业务逻辑,无需等待磁盘I/O)

  2. 高并发支持:多个客户端同时请求时,日志记录不会成为瓶颈

  3. 可靠性:即使日志文件系统出现问题,也不会影响RPC服务的正常运行

异步日志的唯一潜在缺点是在程序异常终止时可能丢失队列中的日志,但对于大多数应用场景,其性能优势远大于这个风险。

2、logqueue.h

这里使用条件变量,当队列为空时,日志线程调用wait,释放lock锁,让工作线程能写日志

#pragma once #include<queue> #include<thread> #include<mutex> #include<condition_variable> //异步写日志的日志队列 template<typename T> class LockQueue{ public: //多个工作线程都会写日志 void Push(const T& data){ std::lock_guard<std::mutex> lock(m_mutex); m_queue.push(data); m_condvariable.notify_one(); } //主线程会读取日志 T Pop(){ std::unique_lock<std::mutex> lock(m_mutex); while(m_queue.empty()){ m_condvariable.wait(lock); } T data = m_queue.front(); m_queue.pop(); return data; } private: std::queue<T> m_queue; std::mutex m_mutex; std::condition_variable m_condvariable; };

四、应用例子

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:57:06

高频模拟电路设计中的在线仿真核心要点

高频模拟电路设计中的在线仿真&#xff1a;从原理到实战的深度实践 你有没有遇到过这样的场景&#xff1f; 一个2.4GHz的低噪声放大器&#xff08;LNA&#xff09;在仿真时增益漂亮、噪声优秀&#xff0c;可一旦打样回来测试&#xff0c;却发现增益跌了3dB&#xff0c;甚至偶尔…

作者头像 李华
网站建设 2026/4/18 8:33:52

Aryabhata-1.0:JEE数学解题效率之王

Aryabhata-1.0&#xff1a;JEE数学解题效率之王 【免费下载链接】Aryabhata-1.0 项目地址: https://ai.gitcode.com/hf_mirrors/PhysicsWallahAI/Aryabhata-1.0 导语&#xff1a;印度教育科技巨头Physics Wallah推出专为JEE数学优化的70亿参数小语言模型Aryabhata-1.0&…

作者头像 李华
网站建设 2026/4/18 8:30:38

全速与低速设备识别机制:技术细节全面讲解

USB全速与低速设备识别机制&#xff1a;从硬件到枚举的完整解析你有没有遇到过这样的情况&#xff1f;自己设计的USB小键盘插上电脑毫无反应&#xff0c;或者鼠标时灵时不灵。排除驱动问题后&#xff0c;往往发现根源出在一个小小的电阻上——没错&#xff0c;就是那个连接在D或…

作者头像 李华
网站建设 2026/4/18 8:31:19

腾讯混元0.5B:超轻量4位量化AI推理新方案

腾讯混元0.5B&#xff1a;超轻量4位量化AI推理新方案 【免费下载链接】Hunyuan-0.5B-Instruct-AWQ-Int4 腾讯开源混元0.5B指令微调模型&#xff0c;专为高效部署设计&#xff0c;支持4位整数量化&#xff0c;显著降低计算资源需求。模型具备双思维推理模式&#xff0c;可灵活适…

作者头像 李华
网站建设 2026/4/18 8:36:08

smol-vision:轻松优化多模态AI模型的实用指南

smol-vision&#xff1a;轻松优化多模态AI模型的实用指南 【免费下载链接】smol-vision 项目地址: https://ai.gitcode.com/hf_mirrors/merve/smol-vision 大语言模型技术的飞速发展带来了性能飞跃&#xff0c;但模型体积庞大、部署成本高昂的问题也日益凸显。smol-vis…

作者头像 李华
网站建设 2026/4/17 23:35:45

Qwen3-235B-FP8大模型:256K上下文性能大突破

Qwen3-235B-FP8大模型&#xff1a;256K上下文性能大突破 【免费下载链接】Qwen3-235B-A22B-Instruct-2507-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-235B-A22B-Instruct-2507-FP8 导语 阿里云旗下通义千问团队正式发布Qwen3-235B-A22B-Instruct-2…

作者头像 李华