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的更多相关文章

  1. spdlog源码阅读 (2): sinks的创建和使用

    2. sink创建 2.1 还是rotating_file_sink 我们仍然以rotating_file_sink为例来说明在spdlog中sink的创建过程. 在spdlog-master/tes ...

  2. spdlog源码阅读 (1): sinks

    0. spdlog简单介绍 spdlog 是一个快速的 C++ 日志库,只包含头文件,兼容 C++11.项目地址 特性: 非常快 只包含头文件 无需依赖第三方库 支持跨平台 - Linux / Win ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  5. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  6. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  7. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  8. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  9. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

随机推荐

  1. iOS 图片水印、图片合成文字或图片实现

    这个需求可能有时候会碰到,比如自己的照片加版权,打水印等 网上的方法,有不少感觉不全对,或者需求不是特全,这里我总结了3种场景下的需求: 1.本地图片合成文字 2.本地图片合成图片 3.网络图片先下载 ...

  2. hdoj 2674 N!

    N!Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. log4jdbc打印完整SQL

    一.log4jdbc简单介绍: log4jdbc是工作在jdbc层的一个日志框架,能够记录SQL及数据库连接执行信息. 一般的SQL日志会把占位符和参数值分开打印,log4jdbc则会记录数据库执行的 ...

  4. EF6的多线程与分库架构设计实现

    1.项目背景 这里简单介绍一下项目需求背景,之前公司的项目基于EF++Repository+UnitOfWork的框架设计的,其中涉及到的技术有RabbitMq消息队列,Autofac依赖注入等常用的 ...

  5. 自学javaee程序员之路--ssm的小项目(一)

    大家好~我叫王聪,缩写是WC(不是厕所!不是厕所!).是一名某内陆大四的学生.这两个月自学了javaee---关于web的一些心得,分享记录一下.建立这个博客的目的是望各位前辈学长指正批评~~也是建立 ...

  6. 前端开发在IOS端遇到的一个诡异问题(Delegate 失效)

    一.前言 最近同事问到一个问题,一个前端页面在IOS端真机测试下出现一个比较诡异的问题,如果没有遇到过估计也是一筹莫展.今天特此记录一下,或许能帮到后面遇到这个问题的朋友少绕一些弯路.这是关于JQue ...

  7. Android名片扫描识别系统SDK

    Android名片扫描识别系统SDK 一.Android名片扫描识别系统应用背景 这些年,随着移动互联的发展,APP应用成爆发式的增长,在很多APP中都涉及到对名片信息的录入,如移动CRM.移动端OA ...

  8. iOS Storyboard适配问题

      通用的Storyboard 通用的stroyboard文件是通向自适应布局光明大道的第一步.在一个storyboard文件中适配iPad和iPhone的布局在iOS8中已不再是梦想.我们不必再为不 ...

  9. JavaScript 深浅拷贝

    JavaScript有五种基本数据类型(Undefined, null, Boolean, String, Number),还有一种复杂的数据类型,就是对象. Undefined 其实是已声明但没有赋 ...

  10. 线程协作方法sleep、yield、wait、join

      sleep(休眠)   当t线程调用Thread.sleep()时,会让线程t休眠指定时间   Thread.sleep() 和 Thread.currentThread().sleep() 效果 ...