spdlog日志库--输出格式(fmt 库集成)

系列目录
spdlog日志库–基础介绍
spdlog日志库–源码解析
spdlog日志库–输出格式(fmt 库集成)
spdlog日志库–使用案例

1. 格式输出

fmt格式输出

使用fmtlib直接格式化(非spdlog内置)
虽然spdlog不直接使用{}作为占位符,但你可以在使用spdlog之前,使用fmtlib(spdlog的底层库)来格式化你的日志消息。
基础:

#include "fmt/core.h"  
#include "spdlog/spdlog.h"  
  
int main() {
   
     
    auto logger = spdlog::stdout_color_mt("my_logger");  
    int value = 42;  
    //std::string formatted_message = fmt::format("The value is: {}", value);  
    //logger->info(formatted_message);  
    logger->info("Hello {}", "world" );

    return 0;  
}

[2022-02-04 14:54:25.083] [info] Hello world

多参数形式:
方式一:第一个大括号内对应后面第一个参数 第二个大括号内对应第二个参数

spdlog::info("nice to  {}  {}", "meet" , "you");
					   0    1	   0       1
[2022-02-04 15:41:37.131] [info] nice to meet you
// 注意,{}之间不要有空格

方式二:大括号内输入整数,1代表参数后面以第二个数值,0代表参数后面第一个数值,以此类推。

spdlog::info("nice to {1} {0}", "you" , "meet");
                       1   0      0       1
[2022-02-04 15:48:07.328] [info] nice to meet you

说明: 大括号内的数字是参数标识符,它按照顺序排列。
例如:

spdlog::info("The last letter in the Alaphbet is {25}","a","b","c",
          "d","e","f","g","h","i","j","k","l","m","n","o","p","q",
          "r","s","t","u","v","w","x","y","z");

[2022-02-04 17:13:43.973] [info] The last letter in the Alaphbet is z

如果想在有参数的字符串内输出大括号,需要采取下面的代码

spdlog::info(" {
   
   {}}  {}","left is curly brace");
					  0        0
[2022-02-04 17:42:19.961] [info]  {
   
   } left is curly brace

或者

spdlog::info(" {1} {0}","{}","right is curly brace");

[2022-02-04 17:53:54.641] [info]  right is curly brace {
   
   }

2. format_spec 格式空间

大括号内的内容 可以是格式空间format_spec 或者时间格式空间chrono_format_spec
格式空间语法

format_spec =  [[fill]align][sign]["#"]["0"][width]["." precision]["L"][type] 

对齐 align 其左边的填充可以选 (注意 format_spec 或 chrono_format_spec 在大括号内的“:”之后添加)

align =  "<" | ">" | "^"<= 左对齐
“>= 右对齐

“^= 居中

代码块内(1、 2、 3上方 align后)没有说明宽度 默认空一格

spdlog::info("{:^} {:<} {:>}", "first","second","third");
				1    2   <
<think>好的,我需要回答用户关于spdlog C++日志库的使用教程和下载方法。首先,用户提到了几个引用,我需要查看这些引用中的信息,确保回答准确。根据引用[1],spdlog是一个简单易用的header-only库,支持异步日志和多种日志风格,比如fmt风格。引用[2]补充说spdlog是快速、异步且线程安全的,并提到了官网地址。引用[3]则涉及安装步骤,包括通过git克隆代码和用VS2019编译。 接下来,我需要按照用户的要求组织回答结构。用户需要教程和下载指南,所以分成安装步骤、基本使用、高级功能、注意事项和相关问题这几个部分比较合适。安装部分要涵盖两种方法:直接包含头文件的header-only方式和使用包管理工具如vcpkg,以及从源码编译的方法。基本使用需要展示初始化日志器、记录不同级别日志、设置输出格式和刷新策略的代码示例。高级功能包括异步日志、多日志器管理、文件轮转和自定义格式,这些在引用中都有提到,需要正确引用来源。 注意用户提到的系统级指令,比如行内数学表达式要用$...$,但这里可能用不上,但需要确保LaTeX语法正确。不过当前问题不涉及数学公式,所以可能不需要处理。另外,回答必须使用中文,结构清晰,并生成相关问题。需要检查引用标识是否正确添加,例如在提到异步日志时引用[2],在安装步骤中提到编译时引用[3]。 最后,生成的相关问题需要与spdlog相关,可能包括性能优化、配置方法、多线程使用等。要确保每个引用只在相关的地方标注,比如提到异步日志时引用[2],源码编译引用[3],整体介绍引用[1]。 现在需要确保所有信息准确,并且按照用户的格式要求,使用代码块包裹示例代码,正确引用来源。可能还需要验证示例代码的正确性,比如初始化日志器时是否正确使用spdlog::stdout_color_mt,以及设置日志级别和格式的方法是否符合spdlog的API。此外,注意事项部分要强调线程安全、性能影响和跨平台支持,这些在引用中都有所提及,需要正确归纳。 最后检查是否有遗漏的信息,比如下载地址是否正确,是否覆盖了用户可能需要的所有方面,如安装、基本使用、高级功能等,并确保语言流畅,结构清晰,符合用户的要求。</think>### spdlog C++ 日志库使用指南 #### 1. 安装与下载 spdlog 是一个**header-only**库,支持快速集成: - **直接包含头文件**:从 [GitHub仓库](https://github.com/gabime/spdlog) 下载源码,将 `include/spdlog` 目录添加到项目包含路径即可[^1]。 - **包管理器安装**:通过 `vcpkg install spdlog` 或 `conan install spdlog` 安装[^2]。 - **源码编译**(可选):使用 Git 克隆仓库后,用 VS2019 打开 `spdlog.sln` 编译生成静态库,适用于需要定制功能的场景[^3]。 --- #### 2. 基本使用 ##### 示例代码:记录日志 ```cpp #include <spdlog/spdlog.h> #include <spdlog/sinks/stdout_color_sinks.h> // 控制台彩色输出 int main() { // 初始化日志器 auto console_logger = spdlog::stdout_color_mt("console"); // 设置日志级别(默认为info) spdlog::set_level(spdlog::level::debug); // 记录不同级别日志 spdlog::debug("调试信息: {}", 42); // 仅当级别<=debug时输出 spdlog::info("常规信息: {}", "Hello"); spdlog::warn("警告: 内存占用过高"); spdlog::error("错误: 文件未找到"); // 刷新缓冲区(确保日志立即写入) spdlog::get("console")->flush(); return 0; } ``` *输出效果*: ![info] 常规信息: Hello ![warn] 警告: 内存占用过高 --- #### 3. 高级功能 - **异步日志**:通过 `spdlog::async_logger` 提升性能,避免阻塞主线程。 ```cpp spdlog::init_thread_pool(8192, 1); // 初始化线程池 auto async_file_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_file", "logs/async.log"); ``` - **多日志器管理**:支持同时输出到控制台、文件和网络。 ```cpp auto multi_sink = std::make_shared<spdlog::sinks::dist_sink_mt>(); multi_sink->add_sink(std::make_shared<spdlog::sinks::stdout_sink_mt>()); multi_sink->add_sink(std::make_shared<spdlog::sinks::daily_file_sink_mt>("app.log", 23, 59)); auto logger = std::make_shared<spdlog::logger>("multi_sink", multi_sink); ``` - **自定义格式**:通过 `set_pattern` 调整日志格式。 ```cpp spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%l] %v"); // 输出示例: [2024-05-20 14:30:00] [info] Hello ``` --- #### 4. 注意事项 1. **线程安全**:默认日志器为线程安全,但自定义 `sink` 需自行实现同步。 2. **性能影响**:高频日志建议启用异步模式,或降低日志级别(如生产环境关闭 `debug`)。 3. **跨平台支持**:兼容 Windows/Linux/macOS,需确保C++11及以上标准。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值