加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
sink.hpp 3.33 KB
一键复制 编辑 原始数据 按行查看 历史
刘弘韬 提交于 2024-03-18 10:23 . 上传一下
#ifndef __M_SINK_H__
#define __M_SINK_H__
#include "utils.hpp"
#include <iostream>
#include <memory>
#include <string>
#include <sstream>
#include <fstream>
#include <assert.h>
namespace logs{
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:
void log(const char* data, size_t len) override{
std::cout.write(data, len);
}
};
class FileSink : public LogSink{
public:
//打开文件 并将操作句柄管理起来
FileSink(const std::string &pahtname)
:_pathname(pahtname){
logs::util::File::createDirectory(logs::util::File::getDirPath(pahtname));
_ofs.open(_pathname, std::ios::binary | std::ios::app);
assert(_ofs.is_open());
}
void log(const char* data, size_t len)override{
_ofs.write(data, len);
assert(_ofs.good());
}
private:
std::string _pathname;
std::ofstream _ofs;
};
class RollSink : public LogSink{
public:
//打开文件 并将操作句柄管理起来
RollSink(const std::string &basename, size_t max_file_size)
:_basename(basename)
,_max_file_size(max_file_size)
,_cur_file_size(0)
,_cnt(0){
std::string pathname = createNewFile();
util::File::createDirectory(util::File::getDirPath(pathname));
_ofs.open(pathname, std::ios::binary | std::ios::app);
assert(_ofs.is_open());
}
void log(const char* data, size_t len)override{
if(_cur_file_size >= _max_file_size){
std::string pathname = createNewFile();
_ofs.close(); // 记得关闭
_ofs.open(pathname, std::ios::binary | std::ios::app);
assert(_ofs.is_open());
_cur_file_size = 0;
}
_ofs.write(data,len);
assert(_ofs.good());
_cur_file_size += len;
}
private:
std::string createNewFile(){
//获取系统时间 通过时间来获取构造文件的扩展名
time_t t = util::Date::now();
struct tm lt;
localtime_r(&t, &lt);
std::stringstream filename;
filename << _basename;
filename << lt.tm_year + 1900;
filename << lt.tm_mon + 1;
filename << lt.tm_mday;
filename << lt.tm_hour;
filename << lt.tm_min;
filename << "-";
filename << _cnt++;
filename << ".log";
return filename.str();
}
private:
std::string _basename;
std::ofstream _ofs;
size_t _max_file_size;
size_t _cur_file_size;
size_t _cnt;
};
// 用模板来扩展
class SinkFactory{
public:
// 由于类型不同,构造函数不同,就需要使用不同的参数-> 不定参数
template<class SinkType,class ...Args>
static LogSink::ptr create(Args&& ...args){
return std::make_shared<SinkType>(std::forward<Args>(args)...);
}
};
} // namespace logs
#endif // __M_SINK__H
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化