GKD.RoboCtrl
载入中...
搜索中...
未找到
logger.h
浏览该文件的文档.
1
14#pragma once
15
16#include <atomic>
17#include <format>
18#include <mutex>
19#include <string_view>
20#include <utility>
21
22#include "utils/singleton.hpp"
23#include "core/multiton.hpp"
24
25namespace roboctrl{
35namespace log{
36
37enum log_level { Debug = 0, Info, Warn, Error };
38
43class logger: public utils::singleton_base<logger> {
44public:
50 static void set_level(log_level level);
51
57 static log_level level();
58
59 friend class singleton_base<logger>;
60
71 template <typename... Args>
72 void log(log_level level,
73 std::string_view role,
74 std::format_string<Args...> fmt,
75 Args &&...args) {
76 if (static_cast<int>(level) < static_cast<int>(_level.load())) {
77 return;
78 }
79 const auto message = std::format(fmt, std::forward<Args>(args)...);
80 log_impl(level, role, message);
81 }
82
91 template <typename... Args>
92 void log_debug(std::format_string<Args...> fmt, Args &&...args) {
93 log(log_level::Debug, "", fmt, std::forward<Args>(args)...);
94 }
95
104 template <typename... Args>
105 void log_info(std::format_string<Args...> fmt, Args &&...args) {
106 log(log_level::Info, "", fmt, std::forward<Args>(args)...);
107 }
108
117 template <typename... Args>
118 void log_warn(std::format_string<Args...> fmt, Args &&...args) {
119 log(log_level::Warn, "", fmt, std::forward<Args>(args)...);
120 }
121
130 template <typename... Args>
131 void log_error(std::format_string<Args...> fmt, Args &&...args) {
132 log(log_level::Error, "", fmt, std::forward<Args>(args)...);
133 }
134
135 static void set_filter(const std::string filter);
136
137private:
138 logger() = default;
139
140 void log_impl(log_level level, std::string_view role, std::string_view message);
141 static std::string_view level_to_string(log_level level);
142
143 mutable std::mutex _mutex;
144 std::atomic<log_level> _level{log_level::Info};
145 std::string filter_;
146};
147
148#define LOG_LOGGER_CALL(level, role, fmt, ...) \
149 ::roboctrl::logger::instance().log(level, role, fmt __VA_OPT__(, ) __VA_ARGS__)
150
151#define GET_ROLE (std::string(__FILE__) + ":" + std::to_string(__LINE__) + ":" + __FUNCTION__)
152
153#define LOG_DEBUG(fmt, ...) LOG_LOGGER_CALL(::roboctrl::log_level::Debug, GET_ROLE, fmt __VA_OPT__(, ) __VA_ARGS__)
154#define LOG_INFO(fmt, ...) LOG_LOGGER_CALL(::roboctrl::log_level::Info, GET_ROLE, fmt __VA_OPT__(, ) __VA_ARGS__)
155#define LOG_WARN(fmt, ...) LOG_LOGGER_CALL(::roboctrl::log_level::Warn, GET_ROLE, fmt __VA_OPT__(, ) __VA_ARGS__)
156#define LOG_ERROR(fmt, ...) LOG_LOGGER_CALL(::roboctrl::log_level::Error, GET_ROLE, fmt __VA_OPT__(, ) __VA_ARGS__)
157
177template <typename T>
179protected:
188 template <typename... Args>
189 void log(log_level level, std::format_string<Args...> fmt, Args &&...args) const
190 requires descable<T>{
191 logger::instance().log(level, static_cast<const T*>(this)->desc(), fmt, std::forward<Args>(args)...);
192 }
193
201 template <typename... Args>
202 void log_debug(std::format_string<Args...> fmt, Args &&...args) const {
203 log(log_level::Debug, fmt, std::forward<Args>(args)...);
204 }
205
213 template <typename... Args>
214 void log_info(std::format_string<Args...> fmt, Args &&...args) const {
215 log(log_level::Info, fmt, std::forward<Args>(args)...);
216 }
217
225 template <typename... Args>
226 void log_warn(std::format_string<Args...> fmt, Args &&...args) const {
227 log(log_level::Warn, fmt, std::forward<Args>(args)...);
228 }
229
237 template <typename... Args>
238 void log_error(std::format_string<Args...> fmt, Args &&...args) const {
239 log(log_level::Error, fmt, std::forward<Args>(args)...);
240 }
241};
242}
243
244using namespace log;
245
246}
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition logger.h:178
void log(log_level level, std::format_string< Args... > fmt, Args &&...args) const
输出日志
Definition logger.h:189
void log_error(std::format_string< Args... > fmt, Args &&...args) const
输出error日志
Definition logger.h:238
void log_debug(std::format_string< Args... > fmt, Args &&...args) const
输出debug日志
Definition logger.h:202
void log_warn(std::format_string< Args... > fmt, Args &&...args) const
输出warn日志
Definition logger.h:226
void log_info(std::format_string< Args... > fmt, Args &&...args) const
输出info日志
Definition logger.h:214
void log_warn(std::format_string< Args... > fmt, Args &&...args)
打印warn日志
Definition logger.h:118
void log_error(std::format_string< Args... > fmt, Args &&...args)
打印error日志
Definition logger.h:131
static void set_level(log_level level)
设置日志等级
Definition logger.cpp:44
static log_level level()
获取日志等级
Definition logger.cpp:48
void log_debug(std::format_string< Args... > fmt, Args &&...args)
打印debug日志
Definition logger.h:92
void log(log_level level, std::string_view role, std::format_string< Args... > fmt, Args &&...args)
日志接口
Definition logger.h:72
void log_info(std::format_string< Args... > fmt, Args &&...args)
打印info日志
Definition logger.h:105
提供单例模式的单例基类
Definition singleton.hpp:19
static logger & instance()
获取单例实例
Definition singleton.hpp:29
用于实现多例模式的通用组件。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
auto desc(const descable auto &owner) -> std::string
获取一个可描述对象的描述信息
Definition multiton.hpp:262