Qt使用spdlog日志
来源:微信公众号「编程学习基地」
@
spdlog日志
spdlog是一个开源的、快速的、仅有头文件的C++11 日志库,code地址在 https://github.com/gabime/spdlog 目前最新的发布版本为Version 1.8.0。它提供了向流、标准输出、文件、系统日志、调试器等目标输出日志的能力。它支持的平台包括Windows、Linux、Mac、Android。
spdlog只要包含头文件即可使用,简单方便,下载源码之后找到include目录,将include目录下的spdlog复制到你需要打印日志的项目下,然后导入头文件
#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h"
创建日志
basic log
不带滚动,日志文件会一直被写入,不断变大。
// Create basic file logger (not rotated)
auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic-log.txt");
my_logger->info("Some log message");
创建一个支持多线程的日志
rotating log
滚动日志,当日志文件超出规定大小时,会删除当前日志文件中所有内容,重新开始写入。
从函数声明可以看出,参数max_file_size 规定了文件的最大值,文件内容超过此值就会清空。
rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files)
参数max_files 规定了滚动文件的个数。当logger_name存满时,将其名称更改为logger_name.1,再新建一个logger_name文件来存储新的日志。再次存满时,把logger_name.1改名为logger_name.2,logger_name改名为logger_name.1,新建一个logger_name来存放新的日志。max_files 数量为几,就可以有几个logger_name文件用来滚动。
示例:
size_t max_size = 1024 * 10;
std::string basename = "testLog.log";
std::shared_ptr<spdlog::logger> file_logger; //日志的文件指针
file_logger = spdlog::rotating_logger_mt("2232", basename, max_size, 0);
日志保存在工作目录下的testLog.log里面
输出打印到Concole
spdlog::set_pattern("%+ [thread %t]"); //设置输出格式直接打印
spdlog::trace("This message shold not be displayed!");
spdlog::debug("This message shold not be displayed!");
控制台带颜色输出
日志等级
enum level_enum
{
trace = SPDLOG_LEVEL_TRACE,
debug = SPDLOG_LEVEL_DEBUG,
info = SPDLOG_LEVEL_INFO,
warn = SPDLOG_LEVEL_WARN,
err = SPDLOG_LEVEL_ERROR,
critical = SPDLOG_LEVEL_CRITICAL,
off = SPDLOG_LEVEL_OFF,
};
设置日志等级
spdlog::set_level(spdlog::level::info); // Set global log level to debug
设置日志等级之后可以打印的日志等级最高位info,也就是debug和trace不打印
spdlog::set_pattern("%+ [thread %t]");
spdlog::set_level(spdlog::level::info); // Set global log level to debug
spdlog::trace("This message shold not be displayed!");
spdlog::debug("This message shold not be displayed!");
spdlog::info("This message shold be displayed..");
spdlog::critical("This message shold be displayed..");
spdlog::set_level(spdlog::level::debug); // Set global log level to debug
spdlog::debug("This message shold be displayed..");
spdlog::critical("This message shold be displayed..");
打印结果:
[2020-09-20 00:24:29.160] [info] This message shold be displayed.. [thread 12932]
[2020-09-20 00:24:29.162] [critical] This message shold be displayed.. [thread 12932]
[2020-09-20 00:24:29.162] [debug] This message shold be displayed.. [thread 12932]
[2020-09-20 00:24:29.162] [critical] This message shold be displayed.. [thread 12932]
输出格式
参考:https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
Pattern flags are in the form of %flag
and resembles the strftime function:
flag | meaning | example |
---|---|---|
%v |
The actual text to log | "some user text" |
%t |
Thread id | "1232" |
%P |
Process id | "3456" |
%n |
Logger's name | "some logger name" |
%l |
The log level of the message | "debug", "info", etc |
%L |
Short log level of the message | "D", "I", etc |
%a |
Abbreviated weekday name | "Thu" |
%A |
Full weekday name | "Thursday" |
%b |
Abbreviated month name | "Aug" |
%B |
Full month name | "August" |
%c |
Date and time representation | "Thu Aug 23 15:35:46 2014" |
%C |
Year in 2 digits | "14" |
%Y |
Year in 4 digits | "2014" |
%D or %x |
Short MM/DD/YY date | "08/23/14" |
%m |
Month 01-12 | "11" |
%d |
Day of month 01-31 | "29" |
%H |
Hours in 24 format 00-23 | "23" |
%I |
Hours in 12 format 01-12 | "11" |
%M |
Minutes 00-59 | "59" |
%S |
Seconds 00-59 | "58" |
%e |
Millisecond part of the current second 000-999 | "678" |
%f |
Microsecond part of the current second 000000-999999 | "056789" |
%F |
Nanosecond part of the current second 000000000-999999999 | "256789123" |
%p |
AM/PM | "AM" |
%r |
12 hour clock | "02:55:02 pm" |
%R |
24-hour HH:MM time, equivalent to %H:%M | "23:55" |
%T or %X |
ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S | "23:55:59" |
%z |
ISO 8601 offset from UTC in timezone ([+/-]HH:MM) | "+02:00" |
%E |
Seconds since the epoch | "1528834770" |
%% |
The % sign | "%" |
%+ |
spdlog's default format | "[2014-10-31 23:46:59.678] [mylogger] [info] Some message" |
%^ |
start color range (can be used only once) | "[mylogger] [info(green)] Some message" |
%$ |
end color range (for example %[1]%$ %v) (can be used only once) | [+++] Some message |
%@ |
Source file and line (use SPDLOG_TRACE(..), SPDLOG_INFO(...) etc. instead of spdlog::trace(...) | my_file.cpp:123 |
%s |
Basename of the source file (use SPDLOG_TRACE(..), SPDLOG_INFO(...) etc.) | my_file.cpp |
%g |
Full or relative path of the source file as appears in the __FILE__ macro (use SPDLOG_TRACE(..), SPDLOG_INFO(...) etc.) |
/some/dir/my_file.cpp |
%# |
Source line (use SPDLOG_TRACE(..), SPDLOG_INFO(...) etc.) | 123 |
%! |
Source function (use SPDLOG_TRACE(..), SPDLOG_INFO(...) etc. see tweakme for pretty-print) | my_func |
%o |
Elapsed time in milliseconds since previous message | 456 |
%i |
Elapsed time in microseconds since previous message | 456 |
%u |
Elapsed time in nanoseconds since previous message | 11456 |
%O |
Elapsed time in seconds since previous message | 4 |
设置输出格式
file_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e][thread %t][%@,%!][%l] : %v");
关闭日志
//Release and close all loggers
//把所有的log对象智能指针放置到unordered_map中去,然后调用clear函数
spdlog::drop_all();
源码阅读
https://www.cnblogs.com/eskylin/archive/2017/03/01/6483199.html
参考文献
[1] https://www.cnblogs.com/oucsheep/p/8426548.html
+++ ↩︎