spdlog封装使用

使用spdlog:

拉取官网spdlog代码,在项目中引入include路径(仅头文件,编译器需要支持C++11)
spdlog地址:https://github.com/gabime/spdlog
官方详细文档:https://github.com/gabime/spdlog/wiki

简单封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Log.h

#pragma once

#include "spdlog/spdlog.h"
#include "spdlog/async.h"
#include "spdlog/sinks/daily_file_sink.h"


#ifdef _WIN32
#define __FILENAME__ (strrchr(__FILE__, '\\') ? (strrchr(__FILE__, '\\') + 1):__FILE__)
#else
#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
#endif

#define SPDLOG_LOGGER_CALL_(LV, ...) if (auto logger = SpdLog::Instance().logger[LV]) logger->log(spdlog::source_loc{__FILENAME__, __LINE__, SPDLOG_FUNCTION}, LV, __VA_ARGS__)
#define LogTrace(...) SPDLOG_LOGGER_CALL_(spdlog::level::trace,__VA_ARGS__)
#define LogDebug(...) SPDLOG_LOGGER_CALL_(spdlog::level::debug,__VA_ARGS__)
#define LogInfo(...) SPDLOG_LOGGER_CALL_(spdlog::level::info,__VA_ARGS__)
#define LogWarn(...) SPDLOG_LOGGER_CALL_(spdlog::level::warn,__VA_ARGS__)
#define LogError(...) SPDLOG_LOGGER_CALL_(spdlog::level::err,__VA_ARGS__)
#define LogCritical(...) SPDLOG_LOGGER_CALL_(spdlog::level::critical,__VA_ARGS__)

class SpdLog {

public:
std::shared_ptr<spdlog::logger> logger[spdlog::level::n_levels]{ nullptr };
static SpdLog& Instance() {
static SpdLog log;
return log;
}
// Windows + async日志记录,确保在main()函数退出时调用spdlog::shutdown()函数
static void Clear() {
spdlog::drop_all();
spdlog::shutdown();
}
private:

SpdLog() {
// 初始化log等级
InitSpdLog(spdlog::level::debug);
}
~SpdLog() {
Clear();
}
SpdLog(const SpdLog& other) = delete;
SpdLog& operator=(const SpdLog& other) = delete;

void InitSpdLog(spdlog::level::level_enum level = spdlog::level::trace, const char* logDir = "./log/") {
const char* levelStr;
char fileName[255];
// 设置当出发 warn 或更严重的错误时立刻刷新日志
spdlog::flush_on(spdlog::level::warn);
// 设置刷新间隔
spdlog::flush_every(std::chrono::seconds(2));
// 设置日志记录级别
spdlog::set_level(static_cast<spdlog::level::level_enum>(level));
// 设置日志格式
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e][%P:%t] %v [%@:%!]");

// 创建异步日志,
#define CraeteLogger(LV)\
levelStr = spdlog::level::to_string_view((spdlog::level::level_enum)LV).data();\
fmt::format_to(fileName, "{}{}.log{}", logDir, levelStr,'\0');\
logger[LV] = spdlog::daily_logger_mt<spdlog::async_factory>(levelStr, fileName, 23, 58);\

switch (level) {
case spdlog::level::trace:
CraeteLogger(spdlog::level::trace);
[[fallthrough]];
case spdlog::level::debug:
CraeteLogger(spdlog::level::debug);
[[fallthrough]];
case spdlog::level::info:
CraeteLogger(spdlog::level::info);
[[fallthrough]];
case spdlog::level::warn:
CraeteLogger(spdlog::level::warn);
[[fallthrough]];
case spdlog::level::err:
CraeteLogger(spdlog::level::err);
[[fallthrough]];
case spdlog::level::critical:
CraeteLogger(spdlog::level::critical);
[[fallthrough]];
case spdlog::level::off:
break;
case spdlog::level::n_levels:
break;
default:
break;
}
};
};


注意:

Windows + async日志记录,一定要确保在main()函数退出时调用spdlog::shutdown()函数
否则退出时会导致应用程序死锁

spdlog封装使用
https://www.inktea.eu.org/2022/d453.html
作者
inktea
发布于
2022年5月7日
许可协议