Qt使用spdlog日志

1,047 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

来源:微信公众号「编程学习基地」

spdlog日志

spdlog是一个开源的、快速的、仅有头文件的C++11 日志库,code地址在 github.com/gabime/spdl… 目前最新的发布版本为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]

输出格式

参考:github.com/gabime/spdl…

Pattern flags are in the form of %flag and resembles the strftime function:

flagmeaningexample
%vThe actual text to log"some user text"
%tThread id"1232"
%PProcess id"3456"
%nLogger's name"some logger name"
%lThe log level of the message"debug", "info", etc
%LShort log level of the message"D", "I", etc
%aAbbreviated weekday name"Thu"
%AFull weekday name"Thursday"
%bAbbreviated month name"Aug"
%BFull month name"August"
%cDate and time representation"Thu Aug 23 15:35:46 2014"
%CYear in 2 digits"14"
%YYear in 4 digits"2014"
%D or %xShort MM/DD/YY date"08/23/14"
%mMonth 01-12"11"
%dDay of month 01-31"29"
%HHours in 24 format 00-23"23"
%IHours in 12 format 01-12"11"
%MMinutes 00-59"59"
%SSeconds 00-59"58"
%eMillisecond part of the current second 000-999"678"
%fMicrosecond part of the current second 000000-999999"056789"
%FNanosecond part of the current second 000000000-999999999"256789123"
%pAM/PM"AM"
%r12 hour clock"02:55:02 pm"
%R24-hour HH:MM time, equivalent to %H:%M"23:55"
%T or %XISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S"23:55:59"
%zISO 8601 offset from UTC in timezone ([+/-]HH:MM)"+02:00"
%ESeconds 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 %^[+++]%$ %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
%sBasename of the source file (use SPDLOG_TRACE(..), SPDLOG_INFO(...) etc.)my_file.cpp
%gFull 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
%oElapsed time in milliseconds since previous message456
%iElapsed time in microseconds since previous message456
%uElapsed time in nanoseconds since previous message11456
%OElapsed time in seconds since previous message4

设置输出格式

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();

源码阅读

www.cnblogs.com/eskylin/arc…

参考文献

[1] www.cnblogs.com/oucsheep/p/…