c++ 日志输出库 spdlog 简介(1)

参考文章:

log库spdlog简介及使用 - 网络资源是无限的 - CSDN博客 http://blog.csdn.net/fengbingchun/article/details/78347105

spdLog的使用 - 烟消bug云散的专栏 - CSDN博客 http://blog.csdn.net/yanxiaobugyunsan/article/details/79088533

官方参考文档: QuickStart · gabime/spdlog Wiki · GitHub

https://github.com/gabime/spdlog/wiki/1.-QuickStart

1、下载源码

代码地址在 https://github.com/gabime/spdlog

点击downLoad下载即可。

2、example解析

下载压缩包并解压:使用visual studio 打开vcxproj后缀的项目文件(我用的是VS2013)

在解决方案中找到example.cpp,这个源文件例举了spdlog的各种用法:

首先需要包含spdlog的头文件

#include "spdlog/spdlog.h"

并且要声明spdlog的命名空间

namespace spd = spdlog;

(1)控制台(console)输出日志

使用控制台输出日志的话,需要这两个头文件:

#include <iostream>
#include <memory>

代码如下:

// Console logger with color
        auto console = spd::stdout_color_mt("console");
        console->info("Welcome to spdlog!");
        console->error("Some error message with arg{}..", 1);

        // Formatting examples
        console->warn("Easy padding in numbers like {:08d}", 12);
        console->critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
        console->info("Support for floats {:03.2f}", 1.23456);
        console->info("Positional args are {1} {0}..", "too", "supported");
        console->info("{:<30}", "left aligned");

        spd::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name) function");

auto console = spd::stdout_color_mt("console"); 中“console”为logger名称,可以随意命名。

warn,critical,info 为不同等级的log,输出在控制台会以不同颜色表示。

注意,logger使用完,程序关闭之前需要调用drop函数释放logger对象,否则如果程序没有关闭,就无法再建立同样名称的logger。

在example.cpp中main函数的最后调用了

// Release and close all loggers
        spdlog::drop_all();

如果只想关闭console的log,可以这样写:

spd::drop("basic_logger");

(2)basic log

不带滚动,日志文件会一直被写入,不断变大。

// Create basic file logger (not rotated)
        auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic-log.txt");
        my_logger->info("Some log message");

(3)rotating log

滚动日志,当日志文件超出规定大小时,会删除当前日志文件中所有内容,重新开始写入。

从函数声明可以看出,参数max_file_size 规定了文件的最大值,文件内容超过此值就会清空。

rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files)

参数max_files 规定了滚动文件的个数。当logger_name存满时,将其名称更改为logger_name.1,再新建一个logger_name文件来存储新的日志。再次存满时,把logger_name.1改名为logger_name.2,logger_name改名为logger_name.1,新建一个logger_name来存放新的日志。max_files 数量为几,就可以有几个logger_name文件用来滚动。

下面的例子运行后生成了三个log文件。

// Create a file rotating logger with 5mb size max and 3 rotated files
        //auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 1048576 * 5, 3);
        auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 256, 2);
        for (int i = 0; i < 10; ++i)
            rotating_logger->info("{} * {} equals {:>10}", i, i, i*i);

每个文件内容如下,后缀数字越大,日志内容越早:

(4)daily log

每天会新建一个日志文件,新建日志文件的时间可自己设定。

// Create a daily logger - a new file is created every day on 2:30am
        auto daily_logger = spd::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
        // trigger flush if the log severity is error or higher
        daily_logger->flush_on(spd::level::err);
        daily_logger->info(123.44);

上述代码输出的日志,如果程序不退出的话,就是每天2:30 am创建新的文件。如果一天多次运行这个程序,就会有多个日志文件,如下图:

为了把每天的log写到同一个文件中去,参考http://blog.csdn.net/yanxiaobugyunsan/article/details/79088533

可以这样写:

//创建文件名类似于: log_2018-01-17.txt
        typedef spdlog::sinks::daily_file_sink<std::mutex, spdlog::sinks::dateonly_daily_file_name_calculator> dateonly_daily_file_sink_mt;
        auto m_logger = spdlog::create<dateonly_daily_file_sink_mt>("m_logger", "logs/dateonly.txt", 0, 0);
        m_logger->info("test daily info");
        m_logger->error("test daily error");

(5)flush 将buffer刷入文件

遇到指定级别的日志会立马将缓存输出到文件中,如果不立刻写入,当程序发生崩溃或产生异常而退出时,有些重要log可能还没等写入到文件中。日志的各个级别如下面代码所示:

typedef enum
{
    trace = 0,
    debug = 1,
    info = 2,
    warn = 3,
    err = 4,
    critical = 5,
    off = 6
} level_enum;
// trigger flush if the log severity is error or higher

        daily_logger->flush_on(spd::level::err);
        daily_logger->info(123.44);
        daily_logger->error("Error happended! ");


3、MFC中调用spdlog

原文地址:https://www.cnblogs.com/oucsheep/p/8426548.html

时间: 2024-10-07 21:49:54

c++ 日志输出库 spdlog 简介(1)的相关文章

c++ 日志输出库 spdlog 简介(2)

继续上一篇,example.cpp解析. 1.set_pattern 自定义日志格式 官方参考:https://github.com/gabime/spdlog/wiki/3.-Custom-formatting 可以为所有的log制定格式,也可以为指定的log制定格式,注意下面代码中rotating_logger为指针变量. auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/ro

9 个技巧,解决 K8s 中的日志输出问题

作者 | 元乙??阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想把这些年积累的经验以文章的形式发出来,让看到文章的同学少走弯路.K8s 日志系列文章内容偏向落地实操以及经验分享,且内容会随着技术的迭代而不定期更新,本文为该系列文章的第 3 篇. 第一篇:<6 个 K8s 日志系统建设中的典型问题,你遇到过几个?> 第二篇:<一文看懂 K8s 日志系统设计

如何快速的把日志输出到磁盘上

不管是做客户端业务,还是做服务端业务,日志子系统都是非常重要的一个组件. 日志系统的输出目的地可以是disk,也可以是tty,更可以是network. 我的日志系统可以输出到tty,不同log level可以有不同的color,这样看日志非常的醒目,当然这里着重谈的是如何快速的把log内容写到磁盘上. 其实,如何快速的把log内容写到磁盘上,网上文章已经汗牛充栋,真正高质量的没多少,本篇可能也是狗尾续貂之作.不过,我的log子系统能够达到106M/s的输出速率. 详细介绍我的log系统之前,推荐

日志输出法则

运行日志应用场景 原型迭代过程 该场景下,一定需要日志输出.原因很显然,因为是个迭代过程,整体结构模型并不明确,一些逻辑都不是很可靠的,故需要提供一个侧面可供观察程序运行动态. 二次开发 二次开发一般也是采用一种原型来迭代完成的.即便不是基于原型迭代变化,那日志观察则更是需要,至少依赖平台的一些调用我们需要观察.程序员一般对于不是自己定义的逻辑都是不能完全信任的.除非有可靠评测数据. 对于有单元测试的依赖项 有单元测试,那就是说有可信可靠的评测数据.对于这部分依赖项,同二次开发说明的,那我们只管

ACE服务端编程5:ACE日志输出和跟踪

服务器程序经常需要在命令行中显示错误消息.状态或者用来跟踪程序的执行路径,最简单的方法是使用printf. ACE提供了更强大日志设施: 1.可以在编译时启用或禁用宏: 2.可以动态的启用或禁用宏: 3.支持日志严重级别: 4.支持日志重定向: 5.支持多线程安全和线程级配置: 使用ACE的日志相关功能,需要引入<ace/Log_Msg.h>头文件. ACE日志输出 ACE提供了两个宏来支持日志输出:ACE_DEBUG.ACE_ERROR. 这两个宏的内部实现和行为都是一样,只是为了在语义上区

支持windows linux下将指定内存段转为16进制与ascii码的日志输出类

来源:http://blog.csdn.net/lezhiyong 1. 简介 将指定内存段转为16进制与asci码的输出到日志文件的类. 2. 功能介绍 1) 支持window与linus双系统. 2) 可指定输出目录. 3) 日志能输出的时间精确到毫秒,日志能输出线程号. 4) 提供字符串输出. 5) 提供指定内存转换为16进制输出. 6) 提供指定内存转换为16进制和ascii码同时输出. 7) 可调整16进制输出间距. 3. 原理和算法 1) 模块是基于C++语言编写: 2) 通过条件定

【原创】日志输出到串口设备导致的问题

问题场景: 测试人员报告,业务 modb 作为 RabbitMQ 的消费者,消费消息的速度非常慢,慢到大约每秒 2 条左右,从而导致 RabbitMQ 的队列中积压了 4000+ 条消息. 排查过程: 先通过 top 命令定位一下 [[email protected]_1 ~]# top -Hp 8177 top - 09:50:33 up 34 min, 8 users, load average: 4.76, 4.32, 3.65 Tasks: 2 total, 0 running, 2 s

Python3.x:日期库dateutil简介

Python3.x:日期库dateutil简介 安装 pip install python-dateutil 关于parser #字符串可以很随意,可以用时间日期的英文单词,可以用横线.逗号.空格等做分隔符. #没指定时间默认是0点,没指定日期默认是今天,没指定年份默认是今年. from dateutil.parser import parse parse("Wed, Nov 12") #输出结果:datetime.datetime(2013, 11, 12, 0, 0) parse(

Snort日志输出插件详解

Snort是一款老牌的开源入侵检测工具,本文主要讨论他作为日志分析时的各种插件的应用.Snort的日志一般位于:/var/log/snort/目录下.可以通过修改配置文件来设置Snort的报警形式.基于文本的格式.Libpcap格式和数据库是Snort最重要的三种报警形式.本文主要对每种报警形式及其配置进行介绍. 1工作模式及输出插件 Snort拥有3种工作模式,分别为嗅探器模式.分组日志模式与网络入侵检测模式. (1)嗅探器模式 Snort使用Libpcap包捕获库,即TCPDUMP使用的库.