【7】基于多设计模式下的同步异步日志系统-代码设计

news/2025/1/12 2:42:30/

8.5 日志落地(LogSink)类设计(简单工厂模式)

1.⽇志落地类主要负责落地⽇志消息到⽬的地。
它主要包括以下内容:
• Formatter⽇志格式化器:主要是负责格式化⽇志消息,
• mutex互斥锁:保证多线程⽇志落地过程中的线程安全,避免出现交叉输出的情况。
这个类⽀持可扩展,其成员函数log设置为纯虚函数,当我们需要增加⼀个log输出⽬标, 可以增加⼀个类继承⾃该类并重写log⽅法实现具体的落地⽇志逻辑。
2.⽬前实现了三个不同⽅向上的⽇志落地:
• 标准输出:StdoutSink
• 固定⽂件:FileSink
• 滚动⽂件:RollSink
2.1滚动⽇志⽂件输出的必要性:

▪ 由于机器磁盘空间有限, 我们不可能⼀直⽆限地向⼀个⽂件中增加数据
▪ 如果⼀个⽇志⽂件体积太⼤,⼀⽅⾯是不好打开,另⼀⽅⾯是即时打开了由于包含数据巨⼤,也不利于查找我们需要的信息
▪ 所以实际开发中会对单个⽇志⽂件的⼤⼩也会做⼀些控制,即当⼤⼩超过某个⼤⼩时(如1GB),我们就重新创建⼀个新的⽇志⽂件来滚动写⽇志。 对于那些过期的⽇志, ⼤部分企业内部都有专⻔的运维⼈员去定时清理过期的⽇志,或者设置系统定时任务,定时清理过期⽇志。

2.2⽇志⽂件的滚动思想:

⽇志⽂件滚动的条件有两个:⽂件⼤⼩ 和 时间。我们可以选择:
▪ ⽇志⽂件在⼤于 1GB 的时候会更换新的⽂件
▪ 每天定点滚动⼀个⽇志⽂件

本项⽬基于⽂件⼤⼩的判断滚动⽣成新的⽂件

#ifndef __M_SINK_H__
#define __M_SINK_H__
#include "util.hpp"
#include "message.hpp"
#include "formatter.hpp"
#include <memory>
#include <mutex>
namespace bitlog{
class LogSink {public:using ptr = std::shared_ptr<LogSink>;LogSink() {}virtual ~LogSink() {}virtual void log(const char *data, size_t len) = 0;
};
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);}
};
class FileSink : public LogSink {public:using ptr = std::shared_ptr<FileSink>;FileSink(const std::string &filename):_filename(filename) {util::file::create_directory(util::file::path(filename));_ofs.open(_filename, std::ios::binary | std::ios::app);assert(_ofs.is_open());}const std::string &file() {return _filename; }void log(const char *data, size_t len) {_ofs.write((const char*)data, len);if (_ofs.good() == false) {std::cout << "⽇志输出⽂件失败!\n";}}private:std::string _filename;std::ofstream _ofs;
};
class RollSink : public LogSink {public:using ptr = std::shared_ptr<RollSink>;RollSink(const std::string &basename, size_t max_fsize):_basename(basename), _max_fsize(max_fsize), _cur_fsize(0){util::file::create_directory(util::file::path(basename));}void log(const char *data, size_t len) {initLogFile();_ofs.write(data, len);if (_ofs.good() == false) {std::cout << "⽇志输出⽂件失败!\n";}_cur_fsize += len;}private:void initLogFile() {if (_ofs.is_open() == false || _cur_fsize >= _max_fsize) {_ofs.close();std::string name = createFilename();_ofs.open(name, std::ios::binary | std::ios::app);assert(_ofs.is_open());_cur_fsize = 0;return;}return;} std::string createFilename() {time_t t = time(NULL);struct tm lt;localtime_r(&t, &lt);std::stringstream ss;ss << _basename;ss << lt.tm_year + 1900;ss << lt.tm_mon + 1;ss << lt.tm_mday;ss << lt.tm_hour;ss << lt.tm_min;ss << lt.tm_sec;ss << ".log";return ss.str();}private:std::string _basename;std::ofstream _ofs;size_t _max_fsize;size_t _cur_fsize;
};
class SinkFactory {public:template<typename SinkType, typename ...Args>static LogSink::ptr create(Args &&...args) {return std::make_shared<SinkType>(std::forward<Args>(args)...);}
};
}
#endif

http://www.ppmy.cn/news/1270838.html

相关文章

除法求值[中等]

一、题目 给你一个变量对数组equations和一个实数值数组values作为已知条件&#xff0c;其中equations[i] [Ai, Bi]和values[i]共同表示等式Ai / Bi values[i]。每个Ai或Bi是一个表示单个变量的字符串。另有一些以数组queries表示的问题&#xff0c;其中queries[j] [Cj, Dj…

vue3+TypeScript全局事件总线mitt

在vue3中 $ on&#xff0c;$off 和 $once 实例方法已被移除&#xff0c;组件实例不再实现事件触发接口&#xff0c;因此大家熟悉的EventBus便无法使用了。然而我们习惯了使用EventBus&#xff0c;对于这种情况我们可以使用Mitt库 npm i mitt -S 首先要在全局挂载 mitt 在app…

2023版本QT学习记录 -2- 标准文件对话框

头文件的使用 #include "QFileDialog"函数原型 getOpenFileName效果 参数 未完待续

SpringBoot 究竟是如何跑起来的

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《SpringBoot》。&#x1f3af;&#x1f3af; &…

Cglib动态代理从入门到掌握

Cglib 动态代理 本文的写作目的是为了探究 Spring 框架中在使用Transactional标注的方法中使用 this 进行自调用时事务失效的原因&#xff0c;各种视频教程中只是简单指出 this 指向的不是代理类对象&#xff0c;而是目标类对象&#xff0c;但是并没有解释为什么 this 不是代理…

12.4~12.14概率论复习与相应理解(学习、复习、备考概率论,这一篇就够了)

未分配的题目 概率计算&#xff08;一些转换公式与全概率公式&#xff09;与实际概率 &#xff0c;贝叶斯 一些转换公式 相关性质计算 常规&#xff0c;公式的COV与P 复习相关公式 计算出新表达式的均值&#xff0c;方差&#xff0c;再套正态分布的公式 COV的运算性质 如…

laravel使用ajax登录,和自定义生成验证码

使用larave框架操作ajax发送get请求&#xff0c;和自义定验证码 1. 后端登录代码 <?phpnamespace CriusWeb\FzUserAdmin\Http\Controllers;use App\Models\Admin; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Routing\Controller; use I…

VRRP协议详解

目录 一、基础概念 1、概念 2、VRRP的基本结构 状态机 二、VRRP主备备份工作过程 1、备份工作过程 2、VRRP的负载分担工作 三、实验 一、基础概念 1、概念 VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的I…