程序跑着跑着出错了,自然就要去看日志文件,研究研究是哪里出错了。同时,记录日志也不能太慢了,速度总是十分重要的。Spdlog,也就是 Speed Log 的缩写,这个连名字都带着速度的 C++ 日志库,应该会让你满意。
当程序运行出错时,自然要查看日志文件,研究哪里出错了。同时,记录不能太慢。速度永远是非常重要的。Dlog,是Speed Log的缩写,是一个名字中带有Speed的C++日志库,应该能满足你。
C++
简介
Spdlog,是在 Github 上由 gabime 开源的 C++ 日志库,代码仓在
https://github.com/gabime/spdlog,目前版本为 1.6.1。Spdlog 以速度著称,且是 Header-Only 的,使用方便,兼容多个平台。Spdlog 还具有:格式化、异步模式、单线程/多线程、丰富的日志输出目标、运行时日志级别修改、Backtrace记录等,功能丰富,可以满足绝大多数场景的需求。
Splog,这是Github上的gabime开源的C++日志库。代码仓库位于
https://github.com/gabi Me/SPD log。当前版本是1.6.1。Spdlog以其速度、仅头文件、易于使用和兼容多种平台而闻名。Spdlog还具有以下特性:格式化、异步模式、单线程/多线程、丰富的日志输出目标、运行时日志级别修改、回溯记录等。功能丰富,可以满足大部分场景的需求。
Spdlog日志库
固定
可以将源代码以仅头文件的方式***到项目的编译树中,用C++11的编译器编译。
在将spdlog链接到项目代码之前,还可以使用静态库方法来编译spdlog:
git clone https://github.com/gabime/spdlog.gitcd spdlog && mkdir build && cd buildc***ke .. && ***ke -j
Spdlog支持广泛的平台,包括:
Linux, FreeBSD, OpenBSD, Solaris, AIXWindows (msvc 2013+, cygwin)***cOS (clang 3.5+)Android
也可以通过包管理直接安装,比如Hombrew。
brew install spdlog
在Fedora上,可以用yum等。
yum install spdlog
例子
下面是Spdlog的一个基本使用示例:
#include "spdlog/spdlog.h"#include "spdlog/sinks/basic_file_sink.h"int ***in() { spdlog::info("Welcome to spdlog!"); spdlog::warn("Easy padding in numbers like {:08d}", 12); spdlog::error("Positional args are {1} {0}..", "too", "supported");}
Spdlog使用fmt库格式化日志,可以直接调用info、warn等函数,使用默认的记录器输出日志。
可以使用set_level和set_pattern函数在运行时修改日志级别和格式:
spdlog::set_level(spdlog::level::debug);spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
Spdlog支持多种日志输出目标,包括命令行的stdout和stderr、基本文件、轮转文件、每日更新的文件、POSIX的syslog、systemd、Windows的Debug等。不同的输出目标需要包含相应的头文件,并使用相应的工厂构建函数。
Spdlog支持单线程和多线程记录器,其中多线程版本是线程安全的。单线程版本的工厂函数以_st结尾,多线程版本以_ mt结尾。
您可以使用不同的输出目标和不同线程版本的logger进行定制日志记录。诸如
#include "spdlog/sinks/rotating_file_sink.h"auto file_logger = spd::rotating_logger_mt("file_logger", "logs/mylogfile", 1048576 * 5, 3);
定义了一个多线程旋转文件的logger,名称为file_logger,输出文件路径为logs/mylogfile,最大5MB,最多保留3个文件。但是
#include "spdlog/sinks/daily_file_sink.h"auto daily_logger = spdlog::daily_logger_st("daily_logger", "logs/daily", 14, 55);
然后定义一个单线程日志记录器,每天更新文件,名称为daily_logger,输出路径为logs/daily,每天14:55新建一个日志文件。
更多
Spdlog 支持对于 Backtrace 的存储,可以在缓存记录一定数量的日志消息,并在需要时输出;spdlog::enable_backtrace(32);...spdlog::dump_backtrace();Spdlog 支持异步模式,使用预设的线程池进行异步日志记录,可以提升多线程的速度;auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async_log.txt");Spdlog支持 logger 的中心化注册,方便 logger 的引用;spdlog::register_logger(some_logger);auto logger = spdlog::get("logger1");Spdlog 性能优越,在性能测试中,进行了100万次循环测试,其中:单线程的基本文件 logger 达到每秒 5,777,626(约578万)次,平均每条消息耗时 0.17微秒,轮转文件和每日更新文件也得到了同样的性能;而在10个线程竞争同一个文件时,也能得到每秒 1,659,613(约166万)次的性能;使用10个线程的异步模式则能达到每秒 2,682,285(约268万)次。
Spdlog速度极快
摘要
Splog性能优越,功能丰富,内置支持十余种输出目标,单线程/多线程和异步,以及注册功能、回溯记录等其他便捷功能,使得Spdlog适用于大多数日志记录场景。
Spdlog采用仅头文件的方式设计,使用方便;代码格式标准,结构清晰,模块化程度高,代码质量高;完成项目测试和性能测试,完成编译支持;目前社区也比较活跃,是一个值得学习和参与的开源项目。
本文来自离开我后记得微笑投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/547863.html