cpp-mirai-client  v2.6.1
cpp client for mirai-api-http
Logger.hpp
浏览该文件的文档.
1// Copyright (C) 2022 Numendacil and contributors
2//
3// This program is free software: you can redistribute it and/or modify
4// it under the terms of the GNU Affero General Public License as
5// published by the Free Software Foundation, either version 3 of the
6// License, or (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11// GNU Affero General Public License for more details.
12//
13// You should have received a copy of the GNU Affero General Public License
14// along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16#ifndef MIRAI_LOGGER_HPP_
17#define MIRAI_LOGGER_HPP_
18
19#include <atomic>
20#include <mutex>
21#include <string>
22#include <type_traits>
23
24#ifdef TRACE
25#undef TRACE
26#endif
27#ifdef DEBUG
28#undef DEBUG
29#endif
30#ifdef INFO
31#undef INFO
32#endif
33#ifdef WARN
34#undef WARN
35#endif
36#ifdef ERROR
37#undef ERROR
38#endif
39#ifdef FATAL
40#undef FATAL
41#endif
42#ifdef OFF
43#undef OFF
44#endif
45
46namespace Mirai
47{
48
49/// 日志等级
50enum class LoggingLevels : uint8_t
51{
52 TRACE = 0,
53 DEBUG,
54 INFO,
55 WARN,
56 ERROR,
57 FATAL,
58 OFF
59};
60
61/**
62 * @brief 日志接口类
63 *
64 */
66{
67protected:
68 std::atomic<LoggingLevels> level_ = LoggingLevels::INFO;
69
70public:
71 ILogger() = default;
72 ILogger(LoggingLevels level) : level_(level) {}
73 ILogger(const ILogger&) = delete;
74 ILogger& operator=(const ILogger&) = delete;
75 ILogger(ILogger&&) = delete;
77
78 /// 设置日志等级
79 void SetLoggingLevel(LoggingLevels level) { this->level_ = level; }
80
81 /**
82 * @brief 检查该等级的日志是否会被输出
83 *
84 * @param level 日志等级
85 * @return `bool`
86 */
87 bool CheckLoggingLevel(LoggingLevels level) { return !(this->level_ > level); }
88
89 /**
90 * @brief 输出日志
91 *
92 * 不推荐直接调用该函数。应该使用对应的输出宏 `LOG_INFO`, `LOG_TRACE` 等先调用 `CheckLoggingLevel` 判断后再调用,
93 * 这样可以防止不必要的字符串计算。
94 * @param msg 日志内容
95 * @param level 日志等级
96 */
97 virtual void log(const std::string& msg, LoggingLevels level) = 0;
98 virtual ~ILogger() = default;
99};
100
101/**
102 * @brief 什么都不干的日志类
103 *
104 */
105class NullLogger : public ILogger
106{
107public:
109 void log(const std::string& /*msg*/, LoggingLevels /*level*/) override {}
110};
111
112} // namespace Mirai
113
114#define MIRAI_LOGGING_LEVELS_TRACE 0
115#define MIRAI_LOGGING_LEVELS_DEBUG 1
116#define MIRAI_LOGGING_LEVELS_INFO 2
117#define MIRAI_LOGGING_LEVELS_WARN 3
118#define MIRAI_LOGGING_LEVELS_ERROR 4
119#define MIRAI_LOGGING_LEVELS_FATAL 5
120#define MIRAI_LOGGING_LEVELS_OFF 6
121
122#ifndef MIRAI_LOGGING_LEVEL
123#define MIRAI_LOGGING_LEVEL MIRAI_LOGGING_LEVELS_INFO
124#endif
125
126#if MIRAI_LOGGING_LEVEL <= MIRAI_LOGGING_LEVELS_TRACE
127#define LOG_TRACE(logger, msg) \
128 do \
129 { \
130 if ((logger).CheckLoggingLevel(Mirai::LoggingLevels::TRACE)) \
131 (logger).log((msg), Mirai::LoggingLevels::TRACE); \
132 } while (0)
133#else
134#define LOG_TRACE(logger, msg) (void)0
135#endif
136
137#if MIRAI_LOGGING_LEVEL <= MIRAI_LOGGING_LEVELS_DEBUG
138#define LOG_DEBUG(logger, msg) \
139 do \
140 { \
141 if ((logger).CheckLoggingLevel(Mirai::LoggingLevels::DEBUG)) \
142 (logger).log((msg), Mirai::LoggingLevels::DEBUG); \
143 } while (0)
144#else
145#define LOG_DEBUG(logger, msg) (void)0
146#endif
147
148#if MIRAI_LOGGING_LEVEL <= MIRAI_LOGGING_LEVELS_INFO
149#define LOG_INFO(logger, msg) \
150 do \
151 { \
152 if ((logger).CheckLoggingLevel(Mirai::LoggingLevels::INFO)) \
153 (logger).log((msg), Mirai::LoggingLevels::INFO); \
154 } while (0)
155#else
156#define LOG_INFO(logger, msg) (void)0
157#endif
158
159#if MIRAI_LOGGING_LEVEL <= MIRAI_LOGGING_LEVELS_WARN
160#define LOG_WARN(logger, msg) \
161 do \
162 { \
163 if ((logger).CheckLoggingLevel(Mirai::LoggingLevels::WARN)) \
164 (logger).log((msg), Mirai::LoggingLevels::WARN); \
165 } while (0)
166#else
167#define LOG_WARN(logger, msg) (void)0
168#endif
169
170#if MIRAI_LOGGING_LEVEL <= MIRAI_LOGGING_LEVELS_ERROR
171#define LOG_ERROR(logger, msg) \
172 do \
173 { \
174 if ((logger).CheckLoggingLevel(Mirai::LoggingLevels::ERROR)) \
175 (logger).log((msg), Mirai::LoggingLevels::ERROR); \
176 } while (0)
177#else
178#define LOG_ERROR(logger, msg) (void)0
179#endif
180
181#if MIRAI_LOGGING_LEVEL <= MIRAI_LOGGING_LEVELS_FATAL
182#define LOG_FATAL(logger, msg) \
183 do \
184 { \
185 if ((logger).CheckLoggingLevel(Mirai::LoggingLevels::FATAL)) \
186 (logger).log((msg), Mirai::LoggingLevels::FATAL); \
187 } while (0)
188#else
189#define LOG_FATAL(logger, msg) (void)0
190#endif
191
192#endif
日志接口类
Definition: Logger.hpp:66
virtual ~ILogger()=default
ILogger(LoggingLevels level)
Definition: Logger.hpp:72
bool CheckLoggingLevel(LoggingLevels level)
检查该等级的日志是否会被输出
Definition: Logger.hpp:87
virtual void log(const std::string &msg, LoggingLevels level)=0
输出日志
ILogger(const ILogger &)=delete
std::atomic< LoggingLevels > level_
Definition: Logger.hpp:68
ILogger(ILogger &&)=delete
ILogger()=default
ILogger & operator=(ILogger &&)=delete
void SetLoggingLevel(LoggingLevels level)
设置日志等级
Definition: Logger.hpp:79
ILogger & operator=(const ILogger &)=delete
什么都不干的日志类
Definition: Logger.hpp:106
void log(const std::string &, LoggingLevels) override
输出日志
Definition: Logger.hpp:109
所有mirai相关的对象的命名空间
LoggingLevels
日志等级
Definition: Logger.hpp:51