当前位置:网站首页>spdlog记录日志示例 - 使用sink创建logger
spdlog记录日志示例 - 使用sink创建logger
2022-06-23 15:00:00 【NiuniuAndAdu】
spdlog记录日志示例 - 使用sink创建logger
1.概述
spdlog 源码 github地址: https://github.com/gabime/spdlog 。spdlog日志库自身带有包括控制台日志记录、基础文件日志记录、循环文件日志记录、每日文件日志记录等在内的日志记录方式,能满足日常不同的情景需求。
spdlog日志库的基本使用,包括创建日志记录器(logger)、创建日志记录器槽(sink)、设置日志输出内容格式(pattern)、设置日志输出等级(level)等。
本文主要从以下方面进行介绍:
- spdlog::sinks::stdout_color_sink_st 控制台日志记录器
- spdlog::sinks::basic_file_sink_mt 基础文件日志记录器
- spdlog::sinks::rotating_file_sink_mt 循环文件日志记录器
- spdlog::sinks::daily_file_sink_mt 每日文件日志记录器 创建使用多个sink的单个logger
- 创建使用同个sink的多个logger 设置sink的pattern控制输出内容格式 设置level,控制输出日志等级
- 通过spdlog::get(std::string)获取指定名称的logger进行使用
- 通过spdlog::default_logger()调用默认的logger进行使用
2.日志记录级别
日志记录级别包括:
- trace
- info
- debug
- warn
- err
- critical
- off
- n_levels
3. 日志记录器槽sink
sink 进行底层操作(比如格式化内容、输出内容到控制台/文件)的类。spdlog自带的几种sinks已经能满足日常需求,也可以派生其基类设计新的sink以满足特殊的需求。
sink类型有:
- spdlog::sinks::stdout_color_sink_st 控制台日志记录器
- spdlog::sinks::basic_file_sink_mt 基础文件日志记录器
- spdlog::sinks::rotating_file_sink_mt 循环文件日志记录器
- spdlog::sinks::daily_file_sink_mt 每日文件日志记录器
sink类主要使用的函数包括:
- set_pattern(const std::string&) :设置日志输出的内容格式。
- set_level(level_enum) : 设置日志输出的最低等级。
- log(log_msg):由logger自动调用,外部不会主动调用。
4.st/mt: 对象版本
spdlog中的logger对象和sink对象都有两种版本,一种是以st结尾的单线程版本,以及以mt结尾的多线程版本。
- st:单线程版本,不用加锁,效率更高。
- mt:多线程版本,用于多线程程序是线程安全的。
5、使用sink创建logger示例实例
5.1 控制台日志记录器(spdlog::sinks::stdout_color_sink_st)
创建名称为LoggerName1、内容输出到控制台的单线程版本日志记录器
auto logger1 = std::make_shared<spdlog::logger>("LoggerName1",
std::make_shared<spdlog::sinks::stdout_color_sink_st>());
5.2.基础文件日志记录器(spdlog::sinks::basic_file_sink_mt)
//<2.创建名称为LoggerName2、内容输出到Logs/BasicFileLog.txt的多线程版本日志记录器
auto logger2 = std::make_shared<spdlog::logger>("LoggerName2", std::make_shared<spdlog::sinks::basic_file_sink_mt>("Logs/BasicFileLog.txt"));
5.3.循环文件日志记录器(spdlog::sinks::rotating_file_sink_mt)
创建名称为LoggerName3、内容输出到Logs/RotatingFileLog.txt的多线程版本日志记录器。
- 参数102410245设置了文件最大容量为5mb;
- 参数3设置了文件最大数量为3;
- 当日志文件存储超过5mb时,将重命名日志文件并且新增另外一个日志文件;
- 当日志文件数量超过3时,将删除第一个日志文件;
auto logger3 = std::make_shared<spdlog::logger>("LoggerName3",
std::make_shared<spdlog::sinks::rotating_file_sink_mt>("Logs/RotatingFileLog.txt",1024 * 1024 * 5, 3));
5.4.每日文件日志记录器(spdlog::sinks::daily_file_sink_mt)
创建名称为LoggerName4、内容输出到Logs/DailyFileLog.txt的多线程版本日志记录器。
参数2和30指定每天生成日志文件的时间为凌晨2点30分。
auto logger4 = std::make_shared<spdlog::logger>("LoggerName4",
std::make_shared<spdlog::sinks::daily_file_sink_mt>("Logs/DailyFileLog.txt", 2,30));
5.5 创建使用多个sink的单个logger
实例1
//设置输出到控制台
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
console_sink->set_level(console_level);
//设置输出到文件
auto temp = spdlog::level::debug;
auto file_sink =
std::make_shared<spdlog::sinks::daily_file_sink_mt>(“./log/daily.txt”, 2, 30);
file_sink->set_level(daily_file_level);
spdlog::sinks_init_list sink_list = {
file_sink, console_sink };
std::shared_ptr<spdlog::logger> m_logger;
m_logger =
std::make_shared<spdlog::logger>(logger_name, sink_list.begin(), sink_list.end());
m_logger->set_level(logger_level);
m_logger->flush_on(logger_level); //注意:通过本语句,可使指定级别以上的日志Daily日志实时刷新到文件里。
实例2
//创建多个sink
auto sink1 = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
auto sink2 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>
("Logs/RotatingFileLog.txt", 1024 * 1024 * 5, 3);
std::vector< spdlog::sink_ptr> sinks = {
sink1,sink2 };
//创建使用多个sink的单个logger,logger会把内容输出到不同位置,此处是控制台以及RotatingFileLog.txt
auto logger = std::make_shared<spdlog::logger>("LoggerName",
sinks.begin(), sinks.end());
5.6 创建使用同个sink的多个logger
(1)创建sink
(2)创建共同使用同个sink的多个logger
//(1)创建sink
auto sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>
("Logs/RotatingFileLog.txt", 1024 * 1024 * 5, 3);
//(2)创建共同使用sink的多个logger,这些logger把内容一起输出到RotatingFileLog.txt中
auto logger1 = std::make_shared<spdlog::logger>("LoggerName1", sink);
auto logger2 = std::make_shared<spdlog::logger>("LoggerName2", sink);
auto logger3 = std::make_shared<spdlog::logger>("LoggerName3", sink);
5.7 设置sink的pattern控制输出内容格式
sink1->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%l]>>>%v");
sink2->set_pattern("[%Y-%m-%d][%L]%v");
5.8 设置level,控制输出日志等级
sink1->set_level(spdlog::level::debug);
sink2->set_level(spdlog::level::info);
logger->debug("The message will only be shown on stdout.");//因为日志等级为debug,所以只会调用sink1进行输出
logger->info("The message will only be shown on stdout.");//日志等级为info,sink1与sink2都会进行输出
5.9 通过spdlog::get(std::string)获取指定名称的logger进行使用
//<1.创建logger
//A.cpp
auto logger1 = std::make_shared<spdlog::logger>("LoggerName1",
std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
auto logger2 = std::make_shared<spdlog::logger>("LoggerName2",
std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
spdlog::register(logger2);
auto logger3 = spdlog::stdout_color_st("LoggerName3");
//<2.使用spdlog::get(std::string)获取logger
//B.cpp
auto logger1 = spdlog::get("LoggerName1");//logger1为空,因为logger1在A.cpp中没被注册
if (logger1)
{
logger1->info("Hello world!");
}
auto logger2 = spdlog::get("LoggerName2");//logger2不为空,因为logger2在A.cpp中已被注册
if (logger2)
{
logger2->info("Good Morning.");//输出
}
auto logger3 = spdlog::get("LoggerName3");//logger2不为空,因为spdlog自带的logger对象在构造时会自动注册
if (logger3)
{
logger3->info("Good Afternoon.");//输出
}
5.10 通过spdlog::default_logger()调用默认的logger进行使用
//<1.创建logger,并且将logger设置为默认的日志记录器
//A.cpp
auto logger = spdlog::stdout_color_mt("LoggerName");
spdlog::set_default_logger(logger);
//<2.使用spdlog::default_logger()获取默认的日志记录器
//B.cpp
auto logger = spdlog::default_logger();
if (logger)
{
logger->info("Hello World");//输出
}
spdlog::info("Hello China");//同样使用default_logger进行输出,更加方便的调用方式;未作default_logger是否为空的判断,会有程序中断的可能。
5.11.使用宏调用默认的logger的方法进行日志输出
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
#include <spdlog/spdlog.h>
SPDLOG_INFO("This message will be shown."); //输出
SPDLOG_DEBUG("This message will not be shown.");//不输出
5.12 使用fmt库格式化字符串
spdlog::info("Support for string.For example,hello,{}.", "Leborn Jame");
输出:[2021-04-13 22:06:21.219] [info] Support for string.For example,hello,Leborn Jame.
spdlog::warn("Supprot for integer.For example,{:08d}.", 23);
输出:[2021-04-13 22:07:48.865] [warning] Supprot for integer.For example,00000023.
spdlog::error("Support for float.For example,{:3.2}.", 1.23456);
输出:[2021-04-13 22:07:48.865] [error] Support for float.For example,1.2.
spdlog::critical("Support for position parameter.For example,{1} and {0}.", "dog", "cat");
输出:[2021-04-13 22:07:48.866] [critical] Support for position parameter.For example,cat and dog.
5.13 使用spdlog自带的logger
//<1.创建名称为LoggerName1、内容输出到控制台的单线程版本日志记录器
auto logger1 = spdlog::stdout_color_st("LoggerName1");
//<2.创建名称为LoggerName2、内容输出到Logs/BasicFileLog.txt的多线程版本日志记录器
auto logger2 = spdlog::basic_logger_mt("LoggerName2", "Logs/BasicFileLog.txt");
//<3.创建名称为LoggerName3、内容输出到Logs/RotatingFileLog.txt的多线程版本日志记录器
//参数1024*1024*5设置了文件最大容量为5mb,参数3设置了文件最大数量为3
//当日志文件存储超过5mb时,将重命名日志文件并且新增另外一个日志文件
//当日志文件数量超过3时,将删除第一个日志文件
auto logger3 =
spdlog::rotating_logger_mt("LoggerName3", "Logs/RotatingFileLog.txt", 1024 * 1024 * 5, 3);
//<4.创建名称为LoggerName4、内容输出到Logs/DailyFileLog.txt的多线程版本日志记录器
//参数2和30指定每天生成日志文件的时间为凌晨2点30分
auto logger4 = spdlog::daily_logger_mt("LoggerName4", "Logs/DailyFileLog.txt", 2, 30);
参考:
https://github.com/gabime/spdlog
https://blog.csdn.net/qq_39568245/article/details/115714105
边栏推荐
- General sequence representation learning in kdd'22 "Ali" recommendation system
- The "shoulder" of sales and service in the heavy truck industry, Linyi Guangshun deep ploughing product life cycle service
- Unshift() and shift() of JS
- Detailed steps for MySQL dual master configuration
- PHP指定字段大于100正序排,小于100随机排
- 12 BeautifulSoup类的初始化
- golang 重要知识:RWMutex 读写锁分析
- How to solve the problem that iterative semi supervised training is difficult to implement in ASR training? RTC dev Meetup
- List query sorting parameter processing
- 2021-05-22
猜你喜欢

WebService interface publishing and calling

Important knowledge of golang: mutex

MySQL create and manage tables

2021-05-08

小米为何深陷芯片泥潭?

5 minutes to quickly launch web applications and APIs (vercel)

《墨者学院——SQL手工注入漏洞测试(MySQL数据库)》

Important knowledge of golang: rwmutex read / write lock analysis

他山之石 | 微信搜一搜中的智能问答技术

Convert JSON file of labelme to coco dataset format
随机推荐
Gartner最新报告:低代码应用开发平台在国内的发展
Sfod: passive domain adaptation and upgrade optimization, making the detection model easier to adapt to new data (attached with paper Download)
php 二维数组插入
Sectigo(Comodo)证书的由来
2021-06-03
MySQL高级语句二
Mysql数据库---日志管理、备份与恢复
Important knowledge of golang: detailed explanation of context
Top 10 purchase, sales and inventory software rankings!
2021-05-22
Nfnet: extension of NF RESNET without BN's 4096 super batch size training | 21 year paper
FPN特征金字塔网络
2022年个人理财利率是多少?个人如何选择理财产品?
Sorting out and summarizing the handling schemes for the three major exceptions of redis cache
golang 重要知识:mutex
[cloud based co creation] intelligent supply chain plan: improve the decision-making level of the supply chain and help enterprises reduce costs and increase efficiency
Tencent ECS failed to send email
Unshift() and shift() of JS
Summary of operating system underlying knowledge (interview)
MySQL series: overview of the overall architecture