代码拉取完成,页面将自动刷新
#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, <);
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。