spdlog输出格式设置

前言

阅读本文之前,相信你已经对spdlog有了一定的了解,并且已经去尝试使用spdlog的API去打印一些东西。
如果还不知道spdlog是什么,或者想了解spdlog但还不知道如何使用的请阅读以下博文
  1. log库spdlog简介及使用
  2. spdlog源码阅读
  3. spdlog源码学习
或者去各种搜索引擎搜索,网上各种教程一抓一大把。
如果以上文档不能给你带来任何帮助,请阅读spdlog官方帮助文档。

Github地址: https://github.com/gabime/spdlog

打印格式设置

在使用spdlog时,一般都需要按照需求去设置输出日志的打印格式,例如:
    1. 时间 YYYY-MM-DD HH:MM:SS显示
    2. 日志等级(track,info,debug)是否打印
    3. 多线程调试时打印线程ID

示例

//创建一个控制台打印实例
std::shared_ptr<spdlog::logger> m_logger = spdlog::stdout_logger_mt("consoleStdout");
//设置打印格式
m_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%n] [%l] %v");

函数原型 (简写)

namespace spdlog
{
    class logger
    {
    public:
        // Set the format of the log message from this logger
        void set_pattern(const std::string &);
    };
}

格式参数总结

源代码中显示pattern格式位置:
    #include<spdlog/details/pattern_formatter_impl.h>
格式中时间设置居多,所以分为两部分,时间格式介绍,其他格式介绍。
不在表格范围内的字母会以%(字母)的形式打印出来。

时间格式一览

formatexplaine.g.
%aAbbreviated weekday nameSun
%AFull weekday nameSunday
%b/%hAbbreviated monthMonthJan
%BFull month nameJanuary
%cDate and time representationThu Aug 23 15:35:46 2014
%Cyear-2 digit18
%YYear2018
%D/%xShort MM/DD/YY date08/23/01
%mMonth1-12
%dDay1-31
%H24 Hour0-23
%I12 Hour0-12
%MMinuter0-59
%SSecond0-59
%eMilliseconds0-999
%fMicroseconds
%FNanoseconds
%pAM/PMAM
%r12 hour clock02:55:02 pm
%R24 hour HH:MM time23:59
%T/%XHH:MM:SS23:59:59
%zISO 8601 offset from UTC in timezone (+-HH:MM)+08:00

其他格式设置

formatexplaine.g.
%nlogger_name创建logger时填入的名称
%llog_levelinfo,debug,track,error
%Lshort log_level 简写的日志等级I,D,T,E
%tthreadID线程ID
%vmessageContent日志正文

作者:shizheng163
转载请注明出处,谢谢合作!

### 在spdlog中实现相对路径的格式输出 为了在spdlog中实现相对路径的格式输出,避免绝对路径出现在日志中,可以通过自定义 `formatter` 或修改 `source_loc` 的行为来实现。以下是一个详细的解决方案: #### 1. 自定义 `formatter` spdlog 允许用户通过自定义 `formatter` 来控制日志的输出格式。可以通过继承 `spdlog::custom_formatter` 并重写其方法来实现相对路径的输出[^3]。 以下是一个示例代码,展示如何将绝对路径转换为相对路径: ```cpp #include "spdlog/spdlog.h" #include "spdlog/fmt/ostr.h" #include <filesystem> #include <string> class RelativePathFormatter : public spdlog::custom_formatter { public: void format(const spdlog::details::log_msg &msg, const std::tm &, spdlog::memory_buf_t &dest) override { // 获取原始消息 auto full_message = fmt::format("{}", msg.payload); // 获取源文件位置 auto source_loc = msg.source; // 将绝对路径转换为相对路径 std::filesystem::path abs_path(source_loc.file_name); std::filesystem::path base_dir("/your/base/directory"); // 替换为你的项目根目录 std::filesystem::path rel_path = std::filesystem::relative(abs_path, base_dir); // 格式化日志消息 fmt::format_to(dest, "[{}:{}] {}", rel_path.string(), source_loc.line, full_message); } }; int main() { // 创建一个控制台日志记录器 auto console_logger = spdlog::stdout_color_mt("console"); // 设置自定义格式化器 console_logger->set_formatter(std::make_unique<RelativePathFormatter>()); // 记录一条日志 SPDLOG_INFO("This is a test log message."); return 0; } ``` #### 2. 使用 `set_pattern` 和字符串替换 如果不想完全自定义 `formatter`,也可以通过 `set_pattern` 方法结合字符串替换的方式实现相对路径的输出。以下是一个示例: ```cpp #include "spdlog/spdlog.h" #include "spdlog/sinks/stdout_color_sinks.h" #include <filesystem> #include <string> int main() { // 创建一个控制台日志记录器 auto console_logger = spdlog::stdout_color_mt("console"); // 设置日志格式 console_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%@] - %v"); // 定义一个函数,在每次记录日志前替换绝对路径为相对路径 auto replace_absolute_with_relative = [](std::string &log_line) { std::filesystem::path abs_path("/absolute/path/to/your/file.cpp"); // 替换为实际文件路径 std::filesystem::path base_dir("/your/base/directory"); // 替换为你的项目根目录 std::filesystem::path rel_path = std::filesystem::relative(abs_path, base_dir); // 替换日志中的绝对路径为相对路径 size_t pos = log_line.find(abs_path.string()); if (pos != std::string::npos) { log_line.replace(pos, abs_path.string().length(), rel_path.string()); } }; // 拦截日志并替换路径 spdlog::set_async_mode(1024); // 启用异步模式以拦截日志 spdlog::flush_every(std::chrono::seconds(1)); spdlog::set_formatter(std::make_unique<spdlog::pattern_formatter>("[%@] %v")); // 记录一条日志 SPDLOG_INFO("This is a test log message."); return 0; } ``` #### 注意事项 1. 需要确保项目的根目录路径(如 `/your/base/directory`)正确设置,否则可能导致路径转换失败。 2. 如果使用的是 C++17 或更高版本,可以利用 `<filesystem>` 提供的 `std::filesystem::relative` 函数[^1]。 3. 在某些情况下,可能需要对不同平台的路径分隔符进行处理,例如 Windows 使用 `\` 而 Unix 使用 `/`。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值