C++ 日志工具 spdlog 简单实用

0. 前言

1. 安装与引入

1.1 安装

  • 因为spdlog
git clone https://github.com/gabime/spdlog.git
cd spdlog && mkdir build && cd build
cmake .. && make -j

1.2 其他项目中引入

  • 因为spdlog只有头文件,所以有两种形式引入
    • 预编译包
    • 引入头文件
cmake_minimum_required(VERSION 3.10)
project(spdlog_examples CXX)

if(NOT TARGET spdlog)
    # Stand-alone build
    find_package(spdlog REQUIRED)
endif()

# ---------------------------------------------------------------------------------------
# Example of using pre-compiled library
# ---------------------------------------------------------------------------------------
add_executable(example example.cpp)
target_link_libraries(example PRIVATE spdlog::spdlog)

# ---------------------------------------------------------------------------------------
# Example of using header-only library
# ---------------------------------------------------------------------------------------
if(SPDLOG_BUILD_EXAMPLE_HO)
    add_executable(example_header_only example.cpp)
    target_link_libraries(example_header_only PRIVATE spdlog::spdlog_header_only)
endif()

2. 使用

  • 我关心的功能

    • 构建logger,并进行配置。配置内容包括:日志输出到哪里、是否线程安全、是否异步进行

    • 设置日志level以及输出level(logger单独设置level,每个sink单独设置)

    • 自定义输出日志格式

    • 注册、获取logger

    • 输出日志内容

2.1 构建logger

  • 有两种方式

    • 直接构建logger(单一sink)
    • 先构建sink,再构建logger(多sinks)
  • 一些注意事项

    • _mt 结尾的就是线程安全的logger,_st 的就是单线程logger
    • 每个sink都有一个对应的logger
  • 单一sink

// One sink one logger
auto stdout_color_mt_logger =
    spdlog::stdout_color_mt("stdout_color_mt_logger");
auto stdout_logger_mt = spdlog::stdout_logger_mt("stdout_logger_mt");
auto rotating_logger_mt =
    spdlog::rotating_logger_mt("rotating_logger_mt",  // logger name
                            w    "logs/rotating",       // log file path
                                1048576 * 5,           // max file size
                                3                      // max file
    );
auto file_logger_mt =
    spdlog::basic_logger_mt("basic_file_logger_mt", "logs/file");
auto daily_logger_mt =  // log filename basename.YYYY-MM-DD.ext
    spdlog::daily_logger_mt("daily_logger_mt",  // logger name
                            "logs/daily.txt",   // log file path
                            2,                  // hour
                            30                  // minute
    );  // create log file at given time point
  • 多sink对应一个logger
// console sink
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
console_sink->set_level(spdlog::level::warn);
console_sink->set_pattern("[multi_sink_example] [%^%l%$] %v");

// file sink
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(
    "logs/multisink.txt", true);
file_sink->set_level(spdlog::level::trace);

// create logger based on console and file sink
spdlog::logger logger("multi_sink", {console_sink, file_sink});
logger.set_level(spdlog::level::debug);  // global level

2.2 设置日志等级

  • 如上面代码所示:
    • 每个logger都可以设置日志等级
    • 单个logger对sinks时,每个sink可以单独设置日志等级
  • 除了logger和sink外,还可以设置全局日志等级
spdlog::set_level(spdlog::level::debug); // Set global log level to debug
  • 现有日志等级为
// spdlog::level::trace
// spdlog::level::debug
// spdlog::level::info
// spdlog::level::warn
// spdlog::level::err
// spdlog::level::critical
// spdlog::level::off

2.3 自定义日志输出格式

  • 默认日志输出格式为:[2014-10-31 23:46:59.678] [my_loggername] [info] Some message
  • 有两种设置输出格式的方法
    • set_pattern(pattern_string);
    • set_formatter(std::make_unique<my_custom_formatter>());
  • set_pattern
spdlog::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***"); // 全局

some_logger->set_pattern(">>>>>>>>> %H:%M:%S %z %v <<<<<<<<<"); // logger

some_logger->sinks()[0]->set_pattern(">>>>>>>>> %H:%M:%S %z %v <<<<<<<<<");
some_logger->sinks()[1]->set_pattern(".."); // sink
  • 更多请参考 wiki

2.4 注册与获取

// 通过 std::shared_ptr<logger> 注册
spdlog::register_logger(some_logger);

// 通过 logger name 获取
spdlog::get("logger1")->info("hello");

// 删除注册内容
spdlog::drop("logger_name");
//or remove them all
spdlog::drop_all()

2.5 输出日志

spdlog::info("info message");
spdlog::info("hello {}", "world");
spdlog::info("{}: {} + {} = {}", "note", 1, 1, 2);
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");

3. 其他

  • 可通过 spdlog::info 这样直接使用,即使用默认logger
    • 默认logger是stdout, colored and multithreaded
    • 默认logger可修改
// 修改默认logger
spdlog::set_default_logger(some_other_logger);

// 
spdlog::info("Use the new default logger");
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的spdlog是一个快速、易于使用的日志记录库。它提供了多种日志记录模式,支持多线程,具有灵活的格式化选项,并且在性能上表现出色。你可以使用spdlog来记录应用程序中的各种事件、错误和调试信息。 要使用spdlog,首先你需要在你的C++项目中包含spdlog头文件,并将spdlog库链接到你的项目中。你可以通过下载spdlog的源代码并手动添加到你的项目中,或者使用包管理工具(如vcpkg)来安装spdlog。 下面是一个简单的示例,展示了如何在C++中使用spdlog进行日志记录: ```cpp #include <spdlog/spdlog.h> int main() { // 创建一个名为"my_logger"的日志记录器 auto logger = spdlog::stdout_logger_mt("my_logger"); // 设置日志记录级别为调试 spdlog::set_level(spdlog::level::debug); // 记录不同级别的日志信息 logger->info("This is an info message"); logger->warn("This is a warning message"); logger->error("This is an error message"); return 0; } ``` 在上面的示例中,我们创建了一个名为"my_logger"的日志记录器,并将其输出到控制台(stdout)。然后,我们设置日志记录级别为调试(debug),这意味着所有调试级别及更高级别的日志消息都会被记录。 最后,我们使用logger对象记录了一些不同级别的日志消息。日志消息的格式可以根据你的需要进行自定义。 这只是一个简单的示例,你可以根据你的具体需求使用spdlog进行更复杂的日志记录。你可以查看spdlog的文档以获取更多详细信息和示例:https://github.com/gabime/spdlog

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值