0. 前言
- 参考资料:官网wiki就够用了
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");