参考文档:https://spdlog.docsforge.com/master/
spdlog简介Very fast, header only, C++ logging library.一个header-only的C++日志库 , 十分高效且易用 。
获取安装方式https://github.com/gabime/spdlog使用时只需要将git项目内的/include/spdlog文件夹整个放入项目的include目录下即可
使用样例#include "spdlog/spdlog.h"int main(){spdlog::info("Welcome to spdlog!");spdlog::error("Some error message with arg: {}", 1);spdlog::warn("Easy padding in numbers like {:08d}", 12);spdlog::critical("Support for int: {0:d};hex: {0:x};oct: {0:o}; bin: {0:b}", 42);spdlog::info("Support for floats {:03.2f}", 1.23456);spdlog::info("Positional args are {1} {0}..", "too", "supported");spdlog::info("{:<30}", "left aligned");spdlog::set_level(spdlog::level::debug); // Set global log level to debugspdlog::debug("This message should be displayed..");// change log patternspdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");// Compile time log levels// define SPDLOG_ACTIVE_LEVEL to desired levelSPDLOG_TRACE("Some trace message with param {}", 42);SPDLOG_DEBUG("Some debug message");}
快速入门几个核心概念
- logger:日志对象,每个日志内包含一个sink组成的vector,每个sink可以分别设置优先级 , logger本身也可设置优先级
- sink:直译是水槽,实际上是引流的对象或者可以认为是输出目标,spdlog库内置了多种不同类型的logger可供选择
- formatter:格式化对象 , 绝大部分情况下spdlog默认的格式就足够用了,但是如果有个性化需求,可以进行自定义格式
- level:日志级别,不同的日志库可能会有不同的设置 , 但是基本情况下都会有debug、info、warn、error等的级别划分来处理不同的情况,具体各个级别的情况可以根据自己的实际情况选取
std::shared_ptr<sink>
组成,logger的每条日志都会调用sink对象,由sink对象按照formatter的格式输出到sink指定的地方(有可能是控制台、文件等),接下来我们从内到外的讲解spdlog的这三个核心组件formatterformatter也即格式化对象,用于控制日志的输出格式,spdlog自带了默认的formatter,一般情况下 , 我们无需任何修改,直接使用即可 。注意,每个sink会有一个formatter
默认formatter默认formatter的格式为:[日期时间] [logger名] [log级别] log内容
[2022-10-13 17:00:55.795] [sidecar] [debug] found env KAFKA_PARTITION_VALUE : -1[2022-10-13 17:00:55.795] [sidecar_config] [debug] kafka_config.kafka_brokers : localhost:9092[2022-10-13 17:00:55.795] [sidecar_config] [debug] kafka_config.kafka_main_topic : workflow_queue[2022-10-13 17:00:55.795] [sidecar_config] [debug] kafka_config.kafka_partition_value : -1[2022-10-13 17:00:55.795] [sidecar] [info] SidecarConfig initialized
自定义formatter如果默认的formatter不符合需求,可以自定义formatter,具体方式如下- set_parrtern(pattern_string);
- 例如:
- 全局级别的:spdlog::set_pattern(" [%H:%M:%S %z] [thread %t] %v ");
- 单个logger级别的:some_logger->set_parttern(">>> %H:%M:%S %z %v <<<");
- 单个sink级别的:some_sink-> set_parttern(".. %H: %M ..");其中用到了%H %M这些占位符,事实上它们都是预先设定好的,想要查看所有的占位符情况,可以参考以下网站:https://spdlog.docsforge.com/v1.x/3.custom-formatting/#pattern-flags
控制台sinkspdlog中创建控制台sink非常简单,该方式创建的sink会输出到命令行终端,且是彩色的(也可以选非彩色的,但是有彩色的应该都会选彩色的吧……) 。后缀的_mt代表多线程 , _st代表单线程
auto sink1 = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
文件sink文件sink的类型有很多 , 这里展示几种经典类型auto sink1 = std::make_shared<spdlog::sinks::basic_file_sink_mt>(log_file_name);//最简单的文件sink,只需要指定文件名auto sink2 = std::make_shared<spdlog::sinks::daily_file_sink_mt>(log_file_name, path, 14, 22);//每天的14点22分在path下创建新的文件auto sink3 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_file_name, 1024 * 1024 * 10, 100, false);//轮转文件,一个文件满了会写到下一个文件,第二个参数是单文件大小上限,第三个参数是文件数量最大值
其他sinkostream_sinksyslog_sink......也可以通过继承base_sink创建子类来自定义sink,具体可以参考:https://spdlog.docsforge.com/v1.x/4.sinks/#implementing-your-own-sink
推荐阅读
- 无期迷途疑凶追影娜恰打法是什么
- 支付宝蚂蚁庄园10月13日正确答案是什么
- 火影忍者10月12日微信每日一题答案是什么
- 基于QT和C++实现的翻金币游戏
- 【python】Ubuntu中多条命令的运行
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点
- 小米手环1怎么用(小米手环强制恢复出厂)
- dnf搬砖徽章怎么得(dnf继承后徽章会消除吗)
- dnf徽章怎么大量获得(dnf徽章毕业要多少钱)
- Sentinel安装教程【Linux+windows】