spdlog源码阅读 (3): log_msg和BasicWriter
4. log_msg和它的打手BasicWriter
在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能。那么到底在spdlog中它是怎么
起到这个作用的呢?
不妨现在代码中搜索下log_msg的具体使用(即在logger_impl.h中),可以得出一下几种用法:
1. log_msg.raw << msg;
2. log_msg.raw.write(fmt, args...);
3. err_msg.formatted.write("[*** LOG ERROR ***] [{}] [{}] [{}]{}", name(), msg, date_buf, details::os::eol);
上面三行代码是log_msg使用的最几种体现,而做相应操作的raw和formatted是
MemoryWriter类型的对象。
4.1 打手BasicWriter
接上文,继续向上查看MemoryWriter的定义,发现:
typedef BasicMemoryWriter<char> MemoryWriter;
继续查看BasicMemoryWriter:
template <typename Char, typename Allocator = std::allocator<Char> >
class BasicMemoryWriter: public BasicWriter<Char>
//......
在类内部并没有发现我们想要找的"<<"操作符,也没有write。继续向它的父类寻求帮助,
此处打手BasicWriter出现了。
BasicWriter &operator<<(int value)
{
write_decimal(value);
return *this;
}
在BasicWriter中,"<<"操作符针对不同参数类型分别提供了对应的实现。打手装备了
武器write_decimal,下面我们就看看这个武器是如何的锋利(叼)。
4.2 打手武器篇
作为程序猿闲话少说,直接代码
template <typename Int>
void write_decimal(Int value)
{
1. typedef typename internal::IntTraits<Int>::MainType MainType;
MainType abs_value = static_cast<MainType>(value);
if (internal::is_negative(value))
{
abs_value = 0 - abs_value;
*write_unsigned_decimal(abs_value, 1) = '-';
}
else
{
write_unsigned_decimal(abs_value, 0);
}
}
line1: 使用IntTraits::MainType 定义了一个类型叫MainType,
template <bool FitsIn32Bits>
struct TypeSelector
{
typedef uint32_t Type;
};
template <>
struct TypeSelector<false>
{
typedef uint64_t Type;
};
template <typename T>
struct IntTraits
{
// Smallest of uint32_t and uint64_t that is large enough to represent
// all values of T.
typedef typename
TypeSelector<std::numeric_limits<T>::digits <= 32>::Type MainType;
};
在spdlog中这种写法较多,例如判断是否无符号数,通过模板的参数演绎来获取真实的类型。
更多的内容参见(SGI __type_traits)。
write_decimal继续执行调用write_unsigned_decimal通过单独处理10进制下的每一位转换为
字符串,存储到buffer中。
4.3 buffer
在本文示例中,最后的buffer是MemoryBuffer。一般是一个char类型的存储区,默认大小为500字节。
当存储的内容大于该限制时,则进行转储,并扩大空间。扩大的空间每次以当前的缓冲区大小加上,
当前缓冲区的一半。
5 写在最后
关于spdlog的先写到这里,到今天已经有三篇分别介绍: sink,sink的作用,以及日志的缓冲区。
当然实际上spdlog还有更多内容,例如formatter等。后面如果有机会,会整理一个比较完整的类图
放在后面,帮助理解。
(人不是全能的,如果有错误的地方,还请大家不吝指出,本人不胜感激)。
spdlog源码阅读 (3): log_msg和BasicWriter的更多相关文章
- spdlog源码阅读 (2): sinks的创建和使用
2. sink创建 2.1 还是rotating_file_sink 我们仍然以rotating_file_sink为例来说明在spdlog中sink的创建过程. 在spdlog-master/tes ...
- spdlog源码阅读 (1): sinks
0. spdlog简单介绍 spdlog 是一个快速的 C++ 日志库,只包含头文件,兼容 C++11.项目地址 特性: 非常快 只包含头文件 无需依赖第三方库 支持跨平台 - Linux / Win ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
随机推荐
- [2017.02.04] C++学习记录(1)
编编程语言的目的是帮助程序员以代码的形式表述ideas.编程语言一方面为程序员提供一组关于可以做什么的抽象,另一方面为程序员提供可以被机器执行的轮子.C++编程语言,支持4种编程范式:过程式(Proc ...
- iOS WebViewJavascriptBridge初步尝试与图文详细讲解
JS和OC的交互这是个永恒话题,使用场景也是越来越多,如今一些reactnative.vue框架等,都是在重点结合原生与H5的混合使用. 那么,如何快捷方便的使用两者交互是一个很重要的关键点. 1.传 ...
- Unity起步-1.1下载和安装Unity
1.1.下载和安装Unity 1.1.1 选取版本 首先找到Unity官方网站https://store.unity.com/cn,如果要下载最新版本,可以选择"立即下载".不过我 ...
- Ninject之旅之十二:Ninject在Windows Form程序上的应用(附程序下载)
摘要: 下面的几篇文章介绍如何使用Ninject创建不同类型的应用系统.包括: Windows Form应用系统 ASP.NET MVC应用系统 ASP.NET Web Form应用系统 尽管对于不同 ...
- Python之字符串详解1
1. 查看类型 name = 'allen' print(type(name)) #查看类型 <class 'str'> #类型为str age = 19 print(type(name) ...
- 纯css 构造的tip
css部分: <style> .abc{ margin-top:20px; } span{ position:relative; display: inline-block; back ...
- cloudbase-init 自动扩盘的副作用 - 每天5分钟玩转 OpenStack(154)
这是 OpenStack 实施经验分享系列的第 4 篇. cloudbase-init 的一项功能是自动扩展 windows 的 C 盘.比如 windows 镜像是 20G,在部署 instance ...
- 简单C程序,迷宫
#include<stdio.h> #include <stdlib.h> int visit(int, int); ][] = { {, , , , , , , , ,}, ...
- 第二章:JavaScript对象
一.window对象 1.属性 2.方法 二.history对象 1.方法 三.location对象 1.属性 2.方法 四.Document对象 1.属性 2.方法
- 解决Ubuntu不能连接xshell
首先,判断Ubuntu是否安装了ssh服务: 1.ps -e |grep ssh 如果服务已经启动,则可以同时看到“ssh-agent”和“sshd”,否则表示没有安装服务,或没有开机启动 2.安装s ...