当前位置:网站首页>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
边栏推荐
- Stone from another mountain - Intelligent Question and answer technology in wechat search
- 进销存软件排行榜前十名!
- 2021-04-15
- 这五年的6个编程感悟!
- Logistics trade related
- 自监督学习(SSL)Self-Supervised Learning
- 腾讯云服务器发送邮件失败
- System design and analysis - Technical Report - a solution for regularly clearing verification code
- 聚合生态,使能安全运营,华为云安全云脑智护业务安全
- 力扣每日一题-第25天-495.提莫攻击
猜你喜欢
Explain in detail the principle and implementation of redis distributed lock

WebService接口发布和调用

JS垃圾回收

The running rabbit fell

Important knowledge of golang: mutex

12 BeautifulSoup类的初始化

Shandong: food "hidden money", consumption "sweeping monk"

js遍历数组(用forEach()方法)

golang 重要知识:waitgroup 解析

WebService interface publishing and calling
随机推荐
Wechat applet guides users to add applet animation page
How is it safe to open an account for futures? Which futures company has a relatively low handling fee for futures and is suitable for retail investors to open an account?
Important knowledge of golang: waitgroup parsing
直播间源码在开发前期必须做的工作及开发步骤
The work and development steps that must be done in the early stage of the development of the source code of the live broadcasting room
js中的push函数介绍
F5《2022年应用策略现状报告》:边缘部署及负载安全成亚太地区关注焦点
golang 重要知识:atomic 原子操作
MySQL advanced statement I
Redis缓存三大异常的处理方案梳理总结
How strong is Jingdong's takeout after entering meituan and starving the hinterland?
golang 重要知识:定时器 timer
idea查看.class文件 idea查看.class文件夹
The "shoulder" of sales and service in the heavy truck industry, Linyi Guangshun deep ploughing product life cycle service
Sectigo(Comodo)证书的由来
Pop() element in JS
【Pyside2】 pyside2的窗口在maya置顶(笔记)
C. Add One--Divide by Zero 2021 and Codeforces Round #714 (Div. 2)
Three simple tips for accelerating yarn install
2021-05-08