spdlog源码解析

基础抽象

sink
#level_t level_
+void log(const details::log_msg &msg)
+void flush()
+void set_pattern(const std::string &pattern)
+void set_formatter(std::unique_ptr sink_formatter)
+void set_level(level::level_enum log_level)
+level::level_enum level()
+bool should_log(level::level_enum msg_level)
formatter
+void format(const details::log_msg &msg, memory_buf_t &dest)
+std::unique_ptr clone()

其中sink中的log,flush,set_pattern,set_formatter为纯虚函数
formatter为虚类

base_sink

base_sink<Mutex>
#unique_ptr formatter_
#Mutex mutex_
#void sink_it_(const details::log_msg &msg)
#void flush_()
#void set_pattern_(const std::string &pattern)
#void set_formatter_(std::unique_ptr sink_formatter)
sink

base_sink模板类继承了sink,模板参数提供了同步机制。其实现了基类中的log,flush,set_pattern和set_formatter抽象方法,log方法中会调用抽象方法sink_it_,flush方法调用抽象方法flush_

template <typename Mutex>
void SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::log(const details::log_msg &msg) {
    std::lock_guard<Mutex> lock(mutex_);
    sink_it_(msg);
}

template <typename Mutex>
void SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::flush() {
    std::lock_guard<Mutex> lock(mutex_);
    flush_();
}

template <typename Mutex>
void SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::set_pattern(const std::string &pattern) {
    std::lock_guard<Mutex> lock(mutex_);
    set_pattern_(pattern);
}

template <typename Mutex>
void SPDLOG_INLINE
spdlog::sinks::base_sink<Mutex>::set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) {
    std::lock_guard<Mutex> lock(mutex_);
    set_formatter_(std::move(sink_formatter));
}

日志

支持两种日志类型,同步和异步,分别是logger和async_logger,日志级别使用枚举level_enum,定义为

enum level_enum : int {
    trace = SPDLOG_LEVEL_TRACE,
    debug = SPDLOG_LEVEL_DEBUG,
    info = SPDLOG_LEVEL_INFO,
    warn = SPDLOG_LEVEL_WARN,
    err = SPDLOG_LEVEL_ERROR,
    critical = SPDLOG_LEVEL_CRITICAL,
    off = SPDLOG_LEVEL_OFF,
    n_levels
};

logger和async_logger的关系为

async_logger
-weak_ptr<thread_pool> thread_pool_
-async_overflow_policy overflow_policy_
logger
#vector<sink_ptr> sinks_
#string name_
#level_t level_
#level_t flush_level_
#err_handler custom_err_handler_
#backtracer tracer_
#void sink_it_(const details::log_msg &msg)
#void flush_()
enable_shared_from_this<async_logger>

日志创建

对于同步和异步日志,有两种不同的工厂,分别是synchronous_factory和async_factory_impl。
synchronous_factory类通过成员函数模板静态方法create来创建logger
async_factory_impl模板类通过成员函数模板静态方法create来创建async_logger

synchronous_factory
+template ~typename Sink, typename... SinkArgs~ shared_ptr~spdlog::logger~ create~~(std::string logger_name, SinkArgs &&...args)
async_factory_impl<async_overflow_policy>
+template ~typename Sink, typename... SinkArgs~ shared_ptr~async_logger~ create(std::string logger_name, SinkArgs &&...args)

日志管理

通过registry来统一管理日志,内部使用unordered_map来管理logger

registry
-unordered_map<std::string,logger_ptr> loggers_
+void register_logger(std::shared_ptr<logger> new_logger)
+void initialize_logger(std::shared_ptr<logger> new_logger)
+std::shared_ptr~logger~ get(const std::string &logger_name)

register_logger:将logger注册到unordered_map中
get:从unordered_map中获取name对应的logger

formatter子类

1
1..N
pattern_formatter
flag_formatter
# padding_info padinfo_
+void format(log_msg& msg, tm &tm_time, memory_buf_t&dest)
custom_flag_formatter
+unique_ptr clone()
name_formatter<ScopedPadder>
level_formatter<ScopedPadder>
short_level_formatter<ScopedPadder>
t_formatter<ScopedPadder>
v_formatter<ScopedPadder>
a_formatter<ScopedPadder>
A_formatter<ScopedPadder>
c_formatter<ScopedPadder>
C_formatter<ScopedPadder>
Y_formatter<ScopedPadder>
D_formatter<ScopedPadder>
m_formatter<ScopedPadder>
d_formatter<ScopedPadder>
H_formatter<ScopedPadder>
I_formatter<ScopedPadder>
M_formatter<ScopedPadder>
S_formatter<ScopedPadder>
e_formatter<ScopedPadder>
f_formatter<ScopedPadder>
F_formatter<ScopedPadder>
E_formatter<ScopedPadder>
p_formatter<ScopedPadder>
r_formatter<ScopedPadder>
R_formatter<ScopedPadder>
T_formatter<ScopedPadder>
z_formatter<ScopedPadder>
pid_formatter<ScopedPadder>
source_location_formatter<ScopedPadder>
short_filename_formatter<ScopedPadder>
source_filename_formatter<ScopedPadder>
source_linenum_formatter<ScopedPadder>
source_funcname_formatter<ScopedPadder>
elapsed_formatter<ScopePadder, Units>
formatter
full_formatter
b_formatter
B_formatter
color_start_formatter
color_stop_formatter
ch_formatter

full_formatter:[%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%s:%#] %v,标识为+
name_formatter:日志名,标识为n
level_formatter:日志级别,标识为l
short_level_formatter:日志级别的缩写,标识为L
t_formatter:显示线程id,标识为t
v_formatter:显示日志内容,标识为v
a_formatter:显示周几的缩写,标识为a
A_formatter:显示周几,标识为A
b_formatter:显示月份的缩写,标识为b或者h
B_formatter:显示月份,标识为B
c_formatter:显示年月日时分秒,标识为c
C_formatter:显示年,其中年只显示2位,标识为C
Y_formatter:显示年,年显示4位,标识为Y
D_formatter:显示年月日,标识为D或者x
m_formatter:显示1-12月,标识为m
d_formatter:显示1-31日,标识为d
H_formatter:显示24小时,标识为H
I_formatter:显示12小时,标识 为 I
M_formatter:显示分钟,标识为 M
S_formatter:显示徐浩然,标识为S
e_formatter:显示毫秒,标识为e
f_formatter:显示微秒,标识为f
F_formatter:显示纳秒,标识为F
E_formatter:显示从epoch的秒数,标识为E
p_formatter:显示am/pm
r_formatter:12小时制显示,包含am/pm,标识为r
R_formatter:24小时制显示,标识为R
T_formatter:ISO 8601时间格式,标识为T或者X
z_formatter:显示时区,标识为z
pid_formatter:显示进程id,标识 为P
color_start_formatter:颜色开始,标识为^
color_stop_formatter:颜色结束,标识为$
source_location_formatter:显示文件名以及行号,标识为@
short_filename_formatter:显示文件名,不包含目录,标识为s
source_filename_formatter:显示全文件名,标识为g
source_linenum_formatter:显示行号,标识 为#
source_funcname_formatter:显示函数名,标识为!
ch_formatter:显示字符,标识为%
elapsed_formatter:离上一次输出日志的经过的时间

  • ‘u’:表示纳秒
  • ‘i’:表示微秒
  • ’o’:表示毫秒
  • ‘O’:表示秒
  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值