安装
git clone https://github.com/gabime/spdlog.git
然后将./spdlog/include/spdlog
拷贝到工程目录下就ok了,该库是header-only的
使用
将官方给的demo拷贝下来:
/* ************************************************************************
2 > File Name: test11.cpp
3 > Author: Qian JiLi
4 > mail: 193937157@qq.com
5 > Created Time: Thu May 4 20:09:16 2023
6 > Description: official spdlog example
7 ************************************************************************/
#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 debug
spdlog::debug("This message should be displayed..");
// change log pattern
spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
// Compile time log levels
// define SPDLOG_ACTIVE_LEVEL to desired level
SPDLOG_TRACE("Some trace message with param {}", 42);
SPDLOG_DEBUG("Some debug message");
}
新建makefile文件:
all:test11
test11:test11.cpp
g++ -g -o ./bin/test11 test11.cpp -I./ -std=c++11
spdlog的结构
logger registry(日志管理器):负责管理所有的logger,用户建立的所有logger都会在registry处进行登记然后统一管理
logger(日志记录器):是用户直接操作的对象,通过操作logger进行日志逻辑的生成
sink(日志记录器槽):受logger控制,执行具体的动作(动作包括写入日志文件/输出到控制台)
一个logger registry管多个logger,一个logger管多个sink。logger registry中的logger是通过name进行对应的。后面使用的时候可以直接通过名称获取对应的日志对象。
常用api
设定日志级别并输出到控制台
spdlog支持一下几种级别,
trace = SPDLOG_LEVEL_TRACE // 最低级(用来记录代码执行轨迹)
debug = SPDLOG_LEVEL_DEBUG // (用来记录debug信息)
info = SPDLOG_LEVEL_INFO
warn = SPDLOG_LEVEL_WARN
err = SPDLOG_LEVEL_ERROR
critical = SPDLOG_LEVEL_CRITICAL
off = SPDLOG_LEVEL_OFF // 最高级
使用spdlog::set_level
设置想看到的日志级别,如:
// 只显示info及比info高级的信息,trace 和 debug 不显示
spdlog::set_level(spdlog::level::info);
有点类似于java中的logger:
// application.properties
logging.level.com.nowcoder.mycommunity=ERROR
// LoggerTest.java
@Test
public void testLogger(){
System.out.println(logger.getName());
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
测试:
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/spdlog.h"
void stdout_example() {
spdlog::set_level(spdlog::level::critical);
spdlog::info("hello {}", "world");
spdlog::critical("hello {}", "world");
}
int main() { stdout_example(); }
写日志文件
#include "spdlog/sinks/basic_file_sink.h"
void basic_log_file_example() {
// 开启并创建本地日志
auto my_logger =
spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt", true);
// 设置该日志的显示级别
my_logger->set_level(spdlog::level::warn);
// 向该日志中写入信息
my_logger->info("Hello, {}!", "World");
my_logger->warn("Hello, {}!", "World");
}
#include "spdlog/sinks/daily_file_sink.h"
void daliy_log_file_example() {
// 每天凌晨两点半创建新文件
auto my_logger =
spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
// 设置该日志的显示级别
my_logger->set_level(spdlog::level::warn);
// 向该日志中写入信息
my_logger->info("Hello, {}!", "World");
my_logger->warn("Hello, {}!", "World");
}
#include "spdlog/sinks/rotating_file_sink.h"
void rotating_example()
{
// 创建一个max_size大小的日志文件,文件最多保留3个
auto max_size = 1024*1024 * 5;
auto max_files = 3;
auto logger = spdlog::rotating_logger_mt("some_logger_name", "logs/rotating.txt", max_size, max_files);
}
int main() {
basic_log_file_example();
daliy_log_file_example();
}
实时刷新日志
my_logger->flush_on(spdlog::level::trace);
在不同函数中调用logger
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h"
void writeLog(int n) {
for (int i = 0; i < n; ++i) {
// 获取logger后输出日志
auto myLogger = spdlog::get("baseLogger");
myLogger->info("{}: Hello, {}!", i + 1, "World");
myLogger->info("Welcome to spdlog!");
myLogger->error("Some error message with arg: {}", 1);
// 带文件名与行号的日志输出
SPDLOG_LOGGER_INFO(myLogger, "Support for floats {:03.2f}", 1.23456);
SPDLOG_LOGGER_WARN(myLogger, "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::error("Some error message with arg: {}", 1);
spdlog::warn("Easy padding in numbers like {:08d}", 12);
spdlog::info("Support for floats {:03.2f}", 1.23456);
}
}
void testSPDLog() {
// 设定日志最大100k,且最多保留10个
auto myLogger = spdlog::rotating_logger_mt("baseLogger", "logs/basic.log", 1024 * 100, 10);
spdlog::set_default_logger(myLogger);
myLogger->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%l](%@): %v"); // 非通过宏输出的日志%@输出为空
myLogger->set_level(spdlog::level::info);
myLogger->info("Hello, {}!", "World");
writeLog(10);
}