LogSystem beta 1.4
This is a logging system project
 
载入中...
搜索中...
未找到
sink.hpp
浏览该文件的文档.
1
8#pragma once
9#include "util.hpp"
10#include <memory>
11#include <fstream>
12#include <cassert>
13#include <sstream>
14#include <cstring>
15#include <vector>
16#include <utility>
17
18namespace Xulog
19{
26 class LogSink
27 {
28 public:
29 using ptr = std::shared_ptr<LogSink>;
31 virtual ~LogSink() {}
40 virtual void log(const char *data, size_t len) = 0;
41 };
48 class StdoutSink : public LogSink
49 {
50 public:
55 enum class Color
56 {
57 Enable,
59 };
66 : _enable_color(enable)
67 {
68 }
77 void log(const char *data, size_t len)
78 {
79 // 设置日志等级颜色并输出
81 {
82 std::string msg = setColorBasedOnLogLevel(data, len);
83 std::cout << msg;
84 return;
85 }
86 std::cout.write(data, len);
87 }
88
89 private:
97 std::string setColorBasedOnLogLevel(const char *message, size_t len)
98 {
99 std::string logMessage(message, len);
100
101 // 存储日志级别和对应颜色
102 std::vector<std::pair<std::string, std::string>> logLevels = {
103 {"DEBUG", COLOR_DEBUG + "DEBUG" + COLOR_RESET},
104 {"INFO", COLOR_INFO + "INFO" + COLOR_RESET},
105 {"WARN", COLOR_WARN + "WARN" + COLOR_RESET},
106 {"ERROR", COLOR_ERROR + "ERROR" + COLOR_RESET},
107 {"FATAL", COLOR_FATAL + "FATAL" + COLOR_RESET}};
108
109 for (auto &level : logLevels)
110 {
111 size_t pos = 0;
112 while (pos < logMessage.size())
113 {
114 size_t found = logMessage.find(level.first, pos);
115 if (found == std::string::npos)
116 break;
117 logMessage.replace(found, level.first.size(), level.second);
118 pos = found + level.second.size();
119 }
120 }
121
122 return logMessage;
123 }
124
125 private:
126 const std::string COLOR_DEBUG = "\033[36m";
127 const std::string COLOR_INFO = "\033[32m";
128 const std::string COLOR_WARN = "\033[33m";
129 const std::string COLOR_ERROR = "\033[31m";
130 const std::string COLOR_FATAL = "\033[35m";
131 const std::string COLOR_RESET = "\033[0m";
133 };
134
141 class FileSink : public LogSink
142 {
143 public:
151 FileSink(const std::string &pathname)
152 : _pathname(pathname)
153 {
155 _ofs.open(_pathname, std::ios::binary | std::ios::app); // 打开文件
156 assert(_ofs.is_open());
157 }
166 void log(const char *data, size_t len)
167 {
168 _ofs.write(data, len);
169 assert(_ofs.good());
170 }
171
172 private:
173 std::string _pathname;
174 std::ofstream _ofs;
175 };
182 class RollSinkBySize : public LogSink
183 {
184 public:
193 RollSinkBySize(const std::string &basename, size_t max_size)
194 : _basename(basename), _max_fsize(max_size), _current_fsize(0), _cnt(0)
195 {
196 std::string pathname = creatNewFIle();
197 Util::File::createDirectory(Util::File::path(pathname)); // 创建目录
198 _ofs.open(pathname, std::ios::binary | std::ios::app);
199 assert(_ofs.is_open());
200 }
209 void log(const char *data, size_t len)
210 {
212 {
213 std::string pathname = creatNewFIle();
214 _ofs.close(); // 关闭原来已经打开的文件
215 _ofs.open(pathname, std::ios::binary | std::ios::app);
216 assert(_ofs.is_open());
217 _current_fsize = 0;
218 // _cnt = 0;
219 }
220 _ofs.write(data, len);
221 assert(_ofs.good());
222 _current_fsize += len;
223 }
224
225 private:
233 std::string creatNewFIle() // 大小判断,超过则创建新文件
234 {
235 // 获取系统时间,构造文件扩展名
236 time_t t = Util::Date::getTime();
237 struct tm lt;
238 localtime_r(&t, &lt);
239 std::stringstream filename;
240 filename << _basename << lt.tm_year + 1900 << lt.tm_mon + 1 << lt.tm_mday << lt.tm_hour << lt.tm_min << lt.tm_sec << "-" << _cnt++ << ".log";
241 return filename.str();
242 }
243
244 private:
245 std::string _basename;
246 std::ofstream _ofs;
247 size_t _max_fsize;
249 size_t _cnt;
250 };
251
259 {
260 public:
269 template <typename SinkType, typename... Args>
271 {
272 return std::make_shared<SinkType>(std::forward<Args>(args)...);
273 }
274 };
275}
文件日志落地实现
Definition sink.hpp:142
FileSink(const std::string &pathname)
构造函数
Definition sink.hpp:151
std::string _pathname
文件路径
Definition sink.hpp:173
void log(const char *data, size_t len)
日志写入到文件
Definition sink.hpp:166
std::ofstream _ofs
文件输出流
Definition sink.hpp:174
抽象日志落地基类
Definition sink.hpp:27
virtual ~LogSink()
Definition sink.hpp:31
std::shared_ptr< LogSink > ptr
智能指针类型
Definition sink.hpp:29
LogSink()
Definition sink.hpp:30
virtual void log(const char *data, size_t len)=0
日志输出
基于文件大小的滚动文件日志落地实现
Definition sink.hpp:183
size_t _current_fsize
当前文件大小
Definition sink.hpp:248
std::ofstream _ofs
文件输出流
Definition sink.hpp:246
void log(const char *data, size_t len)
日志写入到滚动文件
Definition sink.hpp:209
size_t _cnt
文件计数
Definition sink.hpp:249
RollSinkBySize(const std::string &basename, size_t max_size)
构造函数
Definition sink.hpp:193
std::string creatNewFIle()
创建新文件
Definition sink.hpp:233
std::string _basename
基础文件名
Definition sink.hpp:245
size_t _max_fsize
最大文件大小
Definition sink.hpp:247
日志落地对象工厂类
Definition sink.hpp:259
static LogSink::ptr create(Args &&...args)
创建日志落地对象
Definition sink.hpp:270
标准输出日志落地实现
Definition sink.hpp:49
Color _enable_color
颜色启用状态
Definition sink.hpp:132
const std::string COLOR_INFO
INFO 颜色
Definition sink.hpp:127
void log(const char *data, size_t len)
日志写入到标准输出
Definition sink.hpp:77
const std::string COLOR_ERROR
ERROR 颜色
Definition sink.hpp:129
Color
日志颜色设置
Definition sink.hpp:56
const std::string COLOR_FATAL
FATAL 颜色
Definition sink.hpp:130
StdoutSink(Color enable=Color::Unenable)
构造函数
Definition sink.hpp:65
const std::string COLOR_DEBUG
DEBUG 颜色
Definition sink.hpp:126
const std::string COLOR_RESET
颜色重置
Definition sink.hpp:131
std::string setColorBasedOnLogLevel(const char *message, size_t len)
根据日志级别设置颜色
Definition sink.hpp:97
const std::string COLOR_WARN
WARN 颜色
Definition sink.hpp:128
static size_t getTime()
获取当前时间戳
Definition util.hpp:32
static void createDirectory(const std::string &pathname)
创建目录及其父级目录
Definition util.hpp:82
static std::string path(const std::string &pathname)
获取文件路径
Definition util.hpp:68
Definition buffer.hpp:12
实用工具类的实现