🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
Logger.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/I18n.hpp"
25#include "AstUtil/SourceLocation.hpp" // for A_SOURCE_FILE_PATH
26#include <iostream> // for std::cout
27#include <sstream> // for std::ostringstream
28#include <stdarg.h> // for va_list
29
30
31AST_NAMESPACE_BEGIN
32
41enum class ELogLevel
42{
43 eDebug,
44 eInfo,
45 eWarning,
46 eError,
47 eCritical,
48 eFatal
49};
50
51
52
53
56{
57public:
59 : line_{0}
60 , file_{nullptr}
61 , function_{nullptr}
62 , category_{nullptr}
63 {}
64 MessageLogContext(const char* fileName, int lineNumber, const char* functionName, const char* categoryName = nullptr)
65 : line_{lineNumber}
66 , file_{fileName}
67 , function_{functionName}
68 , category_{categoryName}
69 {}
70
71 int line_{};
72 const char* file_{};
73 const char* function_{};
74 const char* category_{};
75};
76
77
78AST_UTIL_CAPI void aLogMessageV(ELogLevel level, const MessageLogContext& context, const char* format, va_list ap);
79AST_UTIL_CAPI void aLogMessage(ELogLevel level, const MessageLogContext& context, const char* format, ...);
80
81
83{
84public:
85 LoggerStream(ELogLevel level, const MessageLogContext& context)
86 : context_{ context }
87 , level_{ level }
88 , stream_{}
89 {}
90 LoggerStream(ELogLevel level, const char* fileName, int lineNumber, const char* functionName, const char* categoryName = nullptr)
91 : context_{ fileName, lineNumber, functionName, categoryName }
92 , level_{ level }
93 , stream_{}
94 {}
95 LoggerStream(const LoggerStream& other)
96 : context_{ other.context_ }
97 , level_{ other.level_ }
98 , stream_{}
99 {}
101 {
102 aLogMessage(level_, context_, stream_.str().c_str());
103 }
104 inline LoggerStream& space()
105 {
106 stream() << ' '; return *this;
107 }
108 inline LoggerStream& operator<<(bool t)
109 {
110 stream() << (t ? "true" : "false"); return space();
111 }
112 inline LoggerStream& operator<<(char t)
113 {
114 stream() << t; return space();
115 }
116 inline LoggerStream& operator<<(signed short t)
117 {
118 stream() << t; return space();
119 }
120 inline LoggerStream& operator<<(unsigned short t)
121 {
122 stream() << t; return space();
123 }
124 inline LoggerStream& operator<<(signed int t)
125 {
126 stream() << t; return space();
127 }
128 inline LoggerStream& operator<<(unsigned int t)
129 {
130 stream() << t; return space();
131 }
132 inline LoggerStream& operator<<(signed long t)
133 {
134 stream() << t; return space();
135 }
136 inline LoggerStream& operator<<(unsigned long t)
137 {
138 stream() << t; return space();
139 }
140 inline LoggerStream& operator<<(float t)
141 {
142 stream() << t; return space();
143 }
144 inline LoggerStream& operator<<(double t)
145 {
146 stream() << t; return space();
147 }
148 inline LoggerStream& operator<<(const char* t)
149 {
150 stream() << (t); return space();
151 }
152 inline LoggerStream& operator<<(const void* t)
153 {
154 stream() << t; return space();
155 }
156 inline std::ostringstream& stream()
157 {
158 return stream_;
159 }
160protected:
163 std::ostringstream stream_;
164};
165
167{
168public:
169 inline NoopStream& space()
170 {
171 return *this;
172 }
173 template<typename T>
174 inline NoopStream& operator<<(const T&)
175 {
176 return *this;
177 }
178};
179
180
182{
183public:
185 :context_{}
186 {}
187 MessageLogger(const char* file, int line, const char* function)
188 : context_{file, line, function}
189 {}
190 template<typename ...Args>
191 inline void debug(const char* msg, Args&& ...args) const
192 {
193 aLogMessage(ELogLevel::eDebug, context_, msg, std::forward<Args>(args)...);
194 };
195 template<typename ...Args>
196 inline void noDebug(const char*, Args&& ...args) const{}
197 template<typename ...Args>
198 void info(const char* msg, Args&& ...args) const
199 {
200 aLogMessage(ELogLevel::eInfo, context_, msg, std::forward<Args>(args)...);
201 }
202 template<typename ...Args>
203 inline void warning(const char* msg, Args&& ...args) const
204 {
205 aLogMessage(ELogLevel::eWarning, context_, msg, std::forward<Args>(args)...);
206 }
207 template<typename ...Args>
208 inline void error(const char* msg, Args&& ...args) const
209 {
210 aLogMessage(ELogLevel::eError, context_, msg, std::forward<Args>(args)...);
211 }
212 template<typename ...Args>
213 inline void critical(const char* msg, Args&& ...args) const
214 {
215 aLogMessage(ELogLevel::eCritical, context_, msg, std::forward<Args>(args)...);
216 }
217 template<typename ...Args>
218 inline void fatal(const char* msg, Args&& ...args) const
219 {
220 aLogMessage(ELogLevel::eFatal, context_, msg, std::forward<Args>(args)...);
221 }
222 inline LoggerStream debug() const{return LoggerStream(ELogLevel::eDebug, context_); }
223 inline NoopStream noDebug() const{ return NoopStream(); }
224 inline LoggerStream info() const{return LoggerStream(ELogLevel::eInfo, context_); }
225 inline LoggerStream warning() const{return LoggerStream(ELogLevel::eWarning, context_);}
226 inline LoggerStream error() const{return LoggerStream(ELogLevel::eError, context_);}
227 inline LoggerStream critical() const{return LoggerStream(ELogLevel::eCritical, context_); };
228 inline LoggerStream fatal() const{return LoggerStream(ELogLevel::eFatal, context_); };
229private:
230 MessageLogContext context_;
231};
232
233
234// 日志宏定义
235
236#ifdef NDEBUG
237#define aDebug(...) while(false) AST_PREPEND_NAMESPACE(MessageLogger)().noDebug()
238#else
239#define aDebug(...) AST_PREPEND_NAMESPACE(MessageLogger)(A_SOURCE_FILE_PATH, __LINE__, __FUNCTION__).debug(__VA_ARGS__)
240#endif
241#define aInfo(...) AST_PREPEND_NAMESPACE(MessageLogger)(A_SOURCE_FILE_PATH, __LINE__, __FUNCTION__).info(__VA_ARGS__)
242#define aWarning(...) AST_PREPEND_NAMESPACE(MessageLogger)(A_SOURCE_FILE_PATH, __LINE__, __FUNCTION__).warning(__VA_ARGS__)
243#define aError(...) AST_PREPEND_NAMESPACE(MessageLogger)(A_SOURCE_FILE_PATH, __LINE__, __FUNCTION__).error(__VA_ARGS__)
244#define aCritical(...) AST_PREPEND_NAMESPACE(MessageLogger)(A_SOURCE_FILE_PATH, __LINE__, __FUNCTION__).critical(__VA_ARGS__)
245#define aFatal(...) AST_PREPEND_NAMESPACE(MessageLogger)(A_SOURCE_FILE_PATH, __LINE__, __FUNCTION__).fatal(__VA_ARGS__)
246
247
248#define AST_CHECK_NULLPTR(variable) if(variable == nullptr){aError(_(#variable " 未设置(nullptr)")); return eErrorNullPtr;}
249#define AST_CHECK_ERRCODE(rc, msg) if(rc){aError(msg); return rc;}
250#define AST_CHECK_INVALID(condition) if(condition){aError(_("无效参数,条件为 " #condition)); return eErrorInvalidParam;}
251
252
256AST_NAMESPACE_END
257
258
定义 Logger.hpp:83
MessageLogContext context_
上下文信息
定义 Logger.hpp:161
ELogLevel level_
等级
定义 Logger.hpp:162
std::ostringstream stream_
缓冲区
定义 Logger.hpp:163
日志消息的上下文信息
定义 Logger.hpp:56
定义 Logger.hpp:182
定义 Logger.hpp:167
ELogLevel
日志等级
定义 Logger.hpp:42
@ eWarning
警告信息
@ eDebug
调试信息
@ eInfo
一般信息
@ eFatal
致命错误
@ eCritical
严重错误
Unit T
特斯拉
定义 Unit.cpp:492