高性能日志系统 日志输出模块逻辑

概述

该模块主要实现了一个日志系统的输出模块,通过多态、工厂模式等设计模式,构建灵活的日志输出架构。

  • 功能:格式化完成的标准日志消息,输出到指定为止
  • 拓展:支持同时将日志落地到不同的位置,也就是输出日志到不同位置
  • 输出位置
    • 标准输出:输出到屏幕上,主要用于测试日志是否正常运行
    • 指定文件:将日志信息输出到指定文件中,便于事后进行日志分析
    • 滚动文件:文件按照大小或者时间输出到指定文件中,方便按日期或者大小删除日志消息
  • 实现思想
    • 首先抽象出落地模块类
      • 根据不同落地方向,从基类派生出来即可
    • 其次工厂模式,创建与表示分离

架构设计

整体架构分析

  • 主框架定义了一个日志输出系统,包含多种日志输出方式,例如标准输出、文件输出、滚动文件输出
  • 模块代码通过基类 LogSink定义了一个统一的接口,并且通过派生类 StdoutSink 、 FileSink 、RollSink实现具体的日志输出方式
  • SinkFactory工厂类则是通过模版方法提供创建不同类型日志输出对象的功能
    • 保证单一职责原则,一个类派生类只负责一种日志输出方式

具体实现

LogSink基类

  • 定义所有日志输出的基类,参数分别接收日志的内容以及长度
class LogSink {
public:
    using ptr = std::shared_ptr<LogSink>;
    LogSink() {}
    virtual ~LogSink() {}
    virtual void log(const char *data, size_t len) = 0;
};

StdoutSink

  • 作用:实现将日志输出到显示器(标准输出)的功能
  • 实现逻辑: 使用std::cout::write标准库函数,输出一段指定长度的字符数据,一般用于二进制数据或者特定格式的字符串
class StdoutSink : public LogSink {
public:
    using ptr = std::shared_ptr<StdoutSink>;
    StdoutSink() = default;
    void log(const char *data, size_t len) {
        std::cout.write(data, len);
    }
};

FileSink

  • 功能:实现将日志写入到指定文件中
  • 实现逻辑 
    • 构造函数接收一个文件名filename,用于指定日志输出的指定文件
    • util::file::create_directory函数则是确保日志文件目录是否存在,如果不存在则对该目录进行创建
    • _ofs.oen:表示以二进制追加模式打开文件,如果文件不存在则会创建它
    • log函数则是通过write逻辑实现数据写入
    • _ofs.good():检查写操作是否成功,如果失败则输出错误信息
class FileSink : public LogSink {
public:
    using ptr = std::shared_ptr<FileSink>;
    FileSink(const std::string &filename): _filename(filename) {
        util::file::create_directory(util
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值