高性能网络库设计之日志组件

简介: 高性能网络库设计之日志组件

简单的日志系统,包含了日志级别定义、日志宏,以及一个单例的 Logger 类,方便程序中统一、灵活地打印日志  

1日志级别(LogLevel 枚举)

enum LogLevel
{
    INFO,   // 普通重要流程信息
    ERROR,  // 错误信息,不影响程序运行
    FATAL,  // 毁灭性错误,程序一般需要退出
    DEBUG,  // 调试信息,便于开发时排查问题
};

2. 日志打印宏(LOG_INFO、LOG_ERROR、LOG_FATAL、LOG_DEBUG)

//宏参数是一个格式字符串 LogmsgFormat 和可变参数 ...
//这是一个宏定义,名字是 LOG_INFO
#define  LOG_INFO(LogmsgFormat, ...)\
do\                //使用 do { ... } while(0) 包裹宏体,是为了让宏在任何位置(如 if 语句中)都能安全使用,避免意外逻辑错误。
{\
   Logger &logger=Logger::instance();\     //获取日志系统的单例对象 Logger。用引用 logger 引用这个对象,避免复制
   logger.setLogLevel(INFO);\                //设置当前这条日志的级别为 INFO(普通流程日志)。
   char buf[1024]={0};\                                     //定义一个字符串缓冲区,用于保存格式化后的日志内容。
   snprintf(buf,1024,LogmsgFormat,##__VA_ARGS__);\          //使用 snprintf 把用户传入的格式字符串和参数格式化为日志文本,保存在 buf 中。
   logger.log(buf);\                                                //将格式化后的日志字符串传入 Logger::log() 函数打印输出
} while (0)

#define  LOG_ERROR(LogmsgFormat, ...)\
do\
{\
   Logger &logger=Logger::instance();\
   logger.setLogLevel(ERROR);\
   char buf[1024]={0};\
   snprintf(buf,1024,LogmsgFormat,##__VA_ARGS__);\
   logger.log(buf);\
} while (0)

#define  LOG_FATAL(LogmsgFormat, ...)\
do\
{\
   Logger &logger=Logger::instance();\
   logger.setLogLevel(FATAL);\
   char buf[1024]={0};\
   snprintf(buf,1024,LogmsgFormat,##__VA_ARGS__);\
   logger.log(buf);\
   exit(-1);\                                                                   //代表出现致命错误,记录完日志后直接退出程序。
} while (0)

#ifdef   MUDEBUG                                                            //如果没有定义 MUDEBUG,LOG_DEBUG 会被编译为空,避免发布版本输出调试信息。
#define  LOG_DEBUG(LogmsgFormat, ...)\
do\
{\
   Logger &logger=Logger::instance();\
   logger.setLogLevel(DEBUG);\
   char buf[1024]={0};\
   snprintf(buf,1024,LogmsgFormat,##__VA_ARGS__);\
   logger.log(buf);\
} while (0)
#else
#define  LOG_DEBUG(LogmsgFormat, ...)
#endif
3. Logger 类设计
//输出一个日志类
class  Logger:noncopyable
{
    public:
    //获取日志唯一的实例对象
    static  Logger&  instance();  //获取 唯一实例,这是 Singleton 设计模式的核心接口。返回一个引用,保证全局使用的是同一个 Logger。
    //设置日志级别
    void  setLogLevel(int Level);       //设置当前日志输出的级别:
    //写日志
    void log(std::string  msg);         //打印日志消息(写入日志系统、终端、文件等)。
    private:
    int logLevel_;                              //当前 Logger 实例保存的日志级别,在调用 log() 时使用
    Logger()                                            //私有构造函数,防止外部直接创建对象,保证 只能通过 instance() 创建一次
    {
    }
};

函数方法实现

//获取日志唯一的实例对象
  Logger&  Logger::instance()//第一次调用 instance() 时,创建唯一一个 Logger 实例,线程安全
  {
        static  Logger  logger;
        return   logger;
  }

  
 //设置日志级别
 void  Logger::setLogLevel(int Level)// 设置日志级别
 {
        logLevel_=Level;
 }

 
 //写日志[级别信息]  time   msg
 void Logger::log(std::string  msg)
 {
    switch (logLevel_)//logLevel_ 是当前日志的级别,它决定输出的前缀
    {
    case INFO:
        std::cout<<"[INFO]";
        break;
        case ERROR:
        std::cout<<"[ERROR]";
        break;
        case FATAL:
        std::cout<<"[FATAL]";
        break;
        case DEBUG:
        std::cout<<"[DEBUG]";
        break;
    
    default:
        break;
    }
    //打印时间和msg,Timestamp::now().toString() 获取当前时间字符串;
    std::cout<< Timestamp::now().toString()<<" :"<<msg<<std::endl;
 }

 //体输出格式类似:

[INFO]2025-07-11 20:11:35.123456 : 服务启动成功
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
7月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
253 2
|
7月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
203 1
|
7月前
基于Reactor模式的高性能网络库github地址
https://github.com/zyi30/reactor-net.git
178 0
|
5月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
363 0
|
7月前
|
缓存 索引
基于Reactor模式的高性能网络库之缓冲区Buffer组件
Buffer 类用于处理 Socket I/O 缓存,负责数据读取、写入及内存管理。通过预分配空间和索引优化,减少内存拷贝与系统调用,提高网络通信效率,适用于 Reactor 模型中的异步非阻塞 IO 处理。
248 3
|
6月前
|
机器学习/深度学习 算法 数据库
基于GoogleNet深度学习网络和GEI步态能量提取的步态识别算法matlab仿真,数据库采用CASIA库
本项目基于GoogleNet深度学习网络与GEI步态能量图提取技术,实现高精度步态识别。采用CASI库训练模型,结合Inception模块多尺度特征提取与GEI图像能量整合,提升识别稳定性与准确率,适用于智能安防、身份验证等领域。
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
4306 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
9月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
954 54
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
434 9

热门文章

最新文章