LogSystem beta 1.4
This is a logging system project
 
载入中...
搜索中...
未找到
logger.hpp
浏览该文件的文档.
1
11#pragma once
12#include "util.hpp"
13#include "level.hpp"
14#include "format.hpp"
15#include "sink.hpp"
16#include "looper.hpp"
17#include <atomic>
18#include <mutex>
19#include <cstdarg>
20#include <unordered_map>
21
22namespace Xulog
23{
30 enum class LoggerType
31 {
34 };
41 class Logger
42 {
43 public:
44 using ptr = std::shared_ptr<Logger>;
53 Logger(const std::string &loggername,
54 LogLevel::value level,
55 Formatter::ptr &formatter,
56 std::vector<LogSink::ptr> sinks)
57 : _logger_name(loggername),
58 _limit_level(level),
59 _formatter(formatter),
60 _sinks(sinks.begin(), sinks.end()) {}
66 const std::string &name()
67 {
68 return _logger_name;
69 }
77 void debug(const std::string &file, size_t line, const std::string &fmt, ...)
78 {
79 // 是否达到输出等级
81 return;
82 // 将不定参进行格式化,将其转为字符串
83 va_list ap;
84 va_start(ap, fmt);
85 char *res;
86 int ret = vasprintf(&res, fmt.c_str(), ap);
87 if (ret == -1)
88 {
89 std::cout << "vasprintf fail\n";
90 return;
91 }
92 va_end(ap);
93 serialize(LogLevel::value::DEBUG, file, line, res);
94 free(res);
95 }
103 void info(const std::string &file, size_t line, const std::string &fmt, ...)
104 {
105 // 是否达到输出等级
107 return;
108 // 将不定参进行格式化,将其转为字符串
109 va_list ap;
110 va_start(ap, fmt);
111 char *res;
112 int ret = vasprintf(&res, fmt.c_str(), ap);
113 if (ret == -1)
114 {
115 std::cout << "vasprintf fail\n";
116 return;
117 }
118 va_end(ap);
119 serialize(LogLevel::value::INFO, file, line, res);
120 free(res);
121 }
129 void warn(const std::string &file, size_t line, const std::string &fmt, ...)
130 {
131 // 是否达到输出等级
133 return;
134 // 将不定参进行格式化,将其转为字符串
135 va_list ap;
136 va_start(ap, fmt);
137 char *res;
138 int ret = vasprintf(&res, fmt.c_str(), ap);
139 if (ret == -1)
140 {
141 std::cout << "vasprintf fail\n";
142 return;
143 }
144 va_end(ap);
145 serialize(LogLevel::value::WARN, file, line, res);
146 free(res);
147 }
156 void error(const std::string &file, size_t line, const std::string &fmt, ...)
157 {
158 // 是否达到输出等级
160 return;
161 // 将不定参进行格式化,将其转为字符串
162 va_list ap;
163 va_start(ap, fmt);
164 char *res;
165 int ret = vasprintf(&res, fmt.c_str(), ap);
166 if (ret == -1)
167 {
168 std::cout << "vasprintf fail\n";
169 return;
170 }
171 va_end(ap);
172 serialize(LogLevel::value::ERROR, file, line, res);
173 free(res);
174 }
182 void fatal(const std::string &file, size_t line, const std::string &fmt, ...)
183 {
184 // 是否达到输出等级
186 return;
187 // 将不定参进行格式化,将其转为字符串
188 va_list ap;
189 va_start(ap, fmt);
190 char *res;
191 int ret = vasprintf(&res, fmt.c_str(), ap);
192 if (ret == -1)
193 {
194 std::cout << "vasprintf fail\n";
195 return;
196 }
197 va_end(ap);
198 serialize(LogLevel::value::FATAL, file, line, res);
199 free(res);
200 }
204 {
205 return _msg;
206 }
207
210 std::string getName()
211 {
212 return _logger_name;
213 }
217 {
218 return _limit_level;
219 }
223 {
224 return _formatter;
225 }
229 {
230 return _logger_type;
231 }
232
233 protected:
240 virtual void log(const char *data, size_t len) = 0;
249 void serialize(LogLevel::value level, const std::string &file, size_t line, char *str)
250 {
251 // 日志内容格式化
252 _msg = LogMsg(level, line, file, _logger_name, str);
253
254 std::stringstream ss;
255 _formatter->Format(ss, _msg);
256 // 日志落地
257 log(ss.str().c_str(), ss.str().size());
258 }
260 std::mutex _mutex;
261 std::string _logger_name;
262 std::atomic<LogLevel::value> _limit_level;
264 std::vector<LogSink::ptr> _sinks;
266 };
273 class SyncLogger : public Logger
274 {
275 public:
284 SyncLogger(const std::string &loggername, LogLevel::value level, Formatter::ptr &formatter, std::vector<LogSink::ptr> sinks)
285 : Logger(loggername, level, formatter, sinks)
286 {
288 }
289
290 protected:
297 void log(const char *data, size_t len) override
298 {
299 std::unique_lock<std::mutex> lock(_mutex);
300 if (_sinks.empty())
301 return;
302 else
303 for (auto &sink : _sinks)
304 {
305 sink->log(data, len);
306 }
307 }
308 };
315 class AsyncLogger : public Logger
316 {
317 public:
327 AsyncLogger(const std::string &loggername,
328 LogLevel::value level,
329 Formatter::ptr &formatter,
330 std::vector<LogSink::ptr> sinks,
331 AsyncType looper_type)
332 : Logger(loggername, level, formatter, sinks),
333 _looper(std::make_shared<AsyncLooper>(std::bind(&AsyncLogger::realLog, this, std::placeholders::_1), looper_type))
334 {
336 }
343 void log(const char *data, size_t len) // 将数据写入缓冲区
344 {
345 _looper->push(data, len);
346 }
352 void realLog(Buffer &buf)
353 {
354 if (_sinks.empty())
355 return;
356 for (auto &sink : _sinks)
357 {
358 sink->log(buf.begin(), buf.readAbleSize());
359 }
360 }
361
362 private:
364 };
365
373 {
374 using ptr = std::shared_ptr<LoggerBuilder>;
375
376 public:
415 void buildLoggerName(const std::string &name)
416 {
417 _logger_name = name;
418 }
426 {
427 _limit_level = level;
428 }
444 void buildFormatter(const std::string &pattern = "[%d{%y-%m-%d|%H:%M:%S}][%t][%c][%f:%l][%p]%T%m%n")
445 {
446 _formatter = std::make_shared<Formatter>(pattern);
447 }
455 template <typename SinkType, typename... Args>
456 void buildSink(Args &&...args)
457 {
458 LogSink::ptr psink = SinkFactory::create<SinkType>(std::forward<Args>(args)...);
459 _sinks.push_back(psink);
460 }
466 virtual Logger::ptr build() = 0;
467
471 {
472 return _formatter;
473 }
474
475 protected:
478 std::string _logger_name;
481 std::vector<LogSink::ptr> _sinks;
482 };
483
491 {
492 public:
499 {
500 assert(!_logger_name.empty());
501 if (_sinks.empty())
502 {
503 buildSink<StdoutSink>();
504 }
506 {
507 return std::make_shared<AsyncLogger>(_logger_name, _limit_level, _formatter, _sinks, _looper_type);
508 }
509 return std::make_shared<SyncLogger>(_logger_name, _limit_level, _formatter, _sinks);
510 }
511 };
519 {
520 public:
529 {
530 // C++11 之后,静态局部变量是线程安全的
531
532 static LoggerManager eton;
533 return eton;
534 }
542 void addLogger(Logger::ptr &logger)
543 {
544 // 不加锁的情况下先检查
545 if (hasLogger(logger->name()))
546 return;
547 // 加锁后直接插入 避免重复加锁
548 std::unique_lock<std::mutex> lock(_mutex);
549 _loggers.insert(std::make_pair(logger->name(), logger));
550 }
557 bool hasLogger(const std::string &name)
558 {
559 std::unique_lock<std::mutex> lock(_mutex);
560 auto it = _loggers.find(name);
561 if (it == _loggers.end())
562 return false;
563 return true;
564 }
571 Logger::ptr getLogger(const std::string &name)
572 {
573 std::unique_lock<std::mutex> lock(_mutex);
574 auto it = _loggers.find(name);
575 if (it == _loggers.end())
576 {
577 std::cout << "未找到日志器!日志器名称:" << name << std::endl;
578 return Logger::ptr();
579 }
580 return it->second;
581 }
588 {
589 return _root_logger;
590 }
591
592 private:
599 {
600 std::unique_ptr<Xulog::LoggerBuilder> builder(new Xulog::LocalLoggerBuild());
601 builder->buildLoggerName("root");
602 builder->buildFormatter();
603 _root_logger = builder->build();
604 _loggers.insert(std::make_pair("root", _root_logger));
605 }
612
613 private:
614 std::mutex _mutex;
616 std::unordered_map<std::string, Logger::ptr> _loggers;
617 };
618
626 {
627 public:
636 {
637 assert(!_logger_name.empty());
638 if (_sinks.empty())
639 {
640 buildSink<StdoutSink>();
641 }
642 Logger::ptr logger;
644 {
645 logger = std::make_shared<AsyncLogger>(_logger_name, _limit_level, _formatter, _sinks, _looper_type);
646 }
647 else
648 {
649 logger = std::make_shared<SyncLogger>(_logger_name, _limit_level, _formatter, _sinks);
650 }
651
653 return logger;
654 }
655 };
656}
#define DEBUG(fmt,...)
使用默认日志器打印调试信息
Definition Xulog.h:95
异步日志器
Definition logger.hpp:316
AsyncLogger(const std::string &loggername, LogLevel::value level, Formatter::ptr &formatter, std::vector< LogSink::ptr > sinks, AsyncType looper_type)
构造函数
Definition logger.hpp:327
AsyncLooper::ptr _looper
异步事件循环器
Definition logger.hpp:363
void realLog(Buffer &buf)
实际落地函数,将缓冲区中的日志写入接收器
Definition logger.hpp:352
void log(const char *data, size_t len)
将数据写入缓冲区
Definition logger.hpp:343
异步工作器类
Definition looper.hpp:45
std::shared_ptr< AsyncLooper > ptr
Definition looper.hpp:47
异步日志缓冲区类
Definition buffer.hpp:24
size_t readAbleSize()
获取可读数据的长度
Definition buffer.hpp:66
const char * begin()
获取可读数据的起始地址
Definition buffer.hpp:57
std::shared_ptr< Formatter > ptr
Definition format.hpp:238
全局日志器建造者
Definition logger.hpp:626
Logger::ptr build() override
构建日志器
Definition logger.hpp:635
局部日志器建造者
Definition logger.hpp:491
Logger::ptr build() override
建造日志器
Definition logger.hpp:498
日志等级类
Definition level.hpp:18
value
日志等级的枚举值
Definition level.hpp:27
std::shared_ptr< LogSink > ptr
智能指针类型
Definition sink.hpp:29
日志器建造者
Definition logger.hpp:373
void buildEnableUnsafeAsync()
Definition logger.hpp:395
std::vector< LogSink::ptr > _sinks
日志输出接收器
Definition logger.hpp:481
std::string _logger_name
日志器名称
Definition logger.hpp:478
AsyncType _looper_type
异步类型
Definition logger.hpp:476
LoggerBuilder()
构建接收器
Definition logger.hpp:384
void buildLoggerLevel(LogLevel::value level)
设置日志器级别
Definition logger.hpp:425
void buildLoggerType(LoggerType type=LoggerType::LOGGER_SYNC)
设置日志器类型
Definition logger.hpp:405
void buildSink(Args &&...args)
构建接收器
Definition logger.hpp:456
LoggerType _logger_type
日志器类型
Definition logger.hpp:477
Formatter::ptr getFormatter()
获取格式化器
Definition logger.hpp:470
std::shared_ptr< LoggerBuilder > ptr
Definition logger.hpp:374
LogLevel::value _limit_level
日志级别
Definition logger.hpp:479
Formatter::ptr _formatter
日志格式化器
Definition logger.hpp:480
void buildLoggerName(const std::string &name)
设置日志器名称
Definition logger.hpp:415
void buildFormatter(const std::string &pattern="[%d{%y-%m-%d|%H:%M:%S}][%t][%c][%f:%l][%p]%T%m%n")
设置日志格式
Definition logger.hpp:444
virtual Logger::ptr build()=0
建造日志器
抽象日志器基类
Definition logger.hpp:42
Logger(const std::string &loggername, LogLevel::value level, Formatter::ptr &formatter, std::vector< LogSink::ptr > sinks)
构造函数
Definition logger.hpp:53
std::string _logger_name
日志器名称
Definition logger.hpp:261
LogLevel::value getLimitLevel()
获取限制等级
Definition logger.hpp:216
std::string getName()
获取日志器名称
Definition logger.hpp:210
void fatal(const std::string &file, size_t line, const std::string &fmt,...)
记录致命级别日志
Definition logger.hpp:182
Formatter::ptr _formatter
日志格式化器
Definition logger.hpp:263
std::mutex _mutex
互斥锁
Definition logger.hpp:260
Formatter::ptr getFormatter()
获取格式化器
Definition logger.hpp:222
void info(const std::string &file, size_t line, const std::string &fmt,...)
记录信息级别日志
Definition logger.hpp:103
std::vector< LogSink::ptr > _sinks
日志输出接收器
Definition logger.hpp:264
LogMsg getMsg()
获取日志消息的结构化数据
Definition logger.hpp:203
void debug(const std::string &file, size_t line, const std::string &fmt,...)
记录调试级别日志
Definition logger.hpp:77
void warn(const std::string &file, size_t line, const std::string &fmt,...)
记录警告级别日志
Definition logger.hpp:129
std::atomic< LogLevel::value > _limit_level
日志级别
Definition logger.hpp:262
LogMsg _msg
存储临时的消息对象
Definition logger.hpp:259
void error(const std::string &file, size_t line, const std::string &fmt,...)
记录错误级别日志
Definition logger.hpp:156
std::shared_ptr< Logger > ptr
Definition logger.hpp:44
LoggerType _logger_type
Definition logger.hpp:265
virtual void log(const char *data, size_t len)=0
抽象日志输出接口
const std::string & name()
获取日志器名称
Definition logger.hpp:66
void serialize(LogLevel::value level, const std::string &file, size_t line, char *str)
序列化日志消息
Definition logger.hpp:249
LoggerType getLoggerType()
获取日志器类型
Definition logger.hpp:228
日志器管理器
Definition logger.hpp:519
Logger::ptr rootLogger()
获取根日志器
Definition logger.hpp:587
static LoggerManager & getInstance()
获取日志器管理器的实例
Definition logger.hpp:528
std::unordered_map< std::string, Logger::ptr > _loggers
日志器映射
Definition logger.hpp:616
bool hasLogger(const std::string &name)
检查是否存在指定名称的日志器
Definition logger.hpp:557
void addLogger(Logger::ptr &logger)
添加日志器到管理器
Definition logger.hpp:542
Logger::ptr getLogger(const std::string &name)
获取指定名称的日志器
Definition logger.hpp:571
Logger::ptr _root_logger
默认日志器
Definition logger.hpp:615
std::mutex _mutex
互斥锁
Definition logger.hpp:614
LoggerManager()
构造函数
Definition logger.hpp:598
~LoggerManager()
析构函数
Definition logger.hpp:611
static LogSink::ptr create(Args &&...args)
创建日志落地对象
Definition sink.hpp:270
同步日志器
Definition logger.hpp:274
void log(const char *data, size_t len) override
直接通过落地模块句柄进行日志输出
Definition logger.hpp:297
SyncLogger(const std::string &loggername, LogLevel::value level, Formatter::ptr &formatter, std::vector< LogSink::ptr > sinks)
构造函数
Definition logger.hpp:284
日志格式化器类的定义
日志等级类的定义和实现
实现异步工作器
Definition buffer.hpp:12
AsyncType
异步工作器类型
Definition looper.hpp:34
@ ASYNC_UNSAFE
不考虑资源,无限扩容,性能测试
@ ASYNC_SAFE
缓冲区满则阻塞
LoggerType
日志器类型
Definition logger.hpp:31
@ LOGGER_ASYNC
异步日志器
@ LOGGER_SYNC
同步日志器
日志落地模块的实现
日志消息结构体
Definition message.hpp:24
实用工具类的实现