soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
slog.h
1#ifndef __SLOG__H__
2#define __SLOG__H__
3
4#ifdef _MSC_VER
5#if _MSC_VER <= 1400
6#define RetAddr() NULL
7#else
8#include <intrin.h>
9#define RetAddr() _ReturnAddress()
10#endif
11#else
12#define RetAddr() __builtin_return_address(0)
13#endif
14
15#include <interface/slog-i.h>
16
17#ifndef GETLOGMGR
18#define GETLOGMGR() SNS::SApplication::getSingletonPtr() ? SNS::SApplication::getSingleton().GetLogManager() : NULL
19#endif
20
21SNSBEGIN
22
23/**
24 * @class SLogBinary
25 * @brief 二进制日志数据类
26 */
28 public:
29 /**
30 * @brief 构造函数
31 * @param buf 二进制数据缓冲区
32 * @param len 二进制数据长度
33 */
34 SLogBinary(const char *buf, int len)
35 : _buf(buf)
36 , _len(len)
37 {
38 }
39
40 const char *_buf; ///< 二进制数据缓冲区
41 int _len; ///< 二进制数据长度
42};
43
44/**
45 * @class SLogStream
46 * @brief 日志流类,用于格式化日志输出
47 */
48class SOUI_EXP SLogStream {
49 public:
50 /**
51 * @brief 构造函数
52 * @param buf 缓冲区指针
53 * @param len 缓冲区长度
54 */
55 SLogStream(char *buf, int len);
56
57 public:
58 /**
59 * @brief 重载运算符<<,用于输出各种类型的数据
60 */
61 SLogStream &operator<<(const void *t);
62 SLogStream &operator<<(const char *t);
63 SLogStream &operator<<(const wchar_t *t);
64 SLogStream &operator<<(bool t);
65 SLogStream &operator<<(char t);
66 SLogStream &operator<<(wchar_t t);
67 SLogStream &operator<<(unsigned char t);
68 SLogStream &operator<<(short t);
69 SLogStream &operator<<(unsigned short t);
70 SLogStream &operator<<(int t);
71 SLogStream &operator<<(unsigned int t);
72 SLogStream &operator<<(long t);
73 SLogStream &operator<<(unsigned long t);
74 SLogStream &operator<<(long long t);
75 SLogStream &operator<<(unsigned long long t);
76 SLogStream &operator<<(float t);
77 SLogStream &operator<<(double t);
78 SLogStream &operator<<(const SLogBinary &binary);
79
80 /**
81 * @brief 格式化输出日志
82 * @param format 格式字符串
83 * @param ... 可变参数列表
84 */
85 SLogStream &writeFormat(const char *format, ...);
86 SLogStream &writeFormat(const wchar_t *format, ...);
87
88 private:
89 /**
90 * @brief 写入长整型数据
91 * @param t 长整型数据
92 */
93 SLogStream &writeLongLong(long long t);
94
95 /**
96 * @brief 写入无符号长整型数据
97 * @param t 无符号长整型数据
98 */
99 SLogStream &writeULongLong(unsigned long long t);
100
101 /**
102 * @brief 写入指针数据
103 * @param t 指针数据
104 */
105 SLogStream &writePointer(const void *t);
106
107 /**
108 * @brief 写入字符串数据
109 * @param t 字符串数据
110 */
111 SLogStream &writeString(const char *t);
112
113 /**
114 * @brief 写入宽字符串数据
115 * @param t 宽字符串数据
116 * @param nLen 字符串长度(默认为-1,表示自动计算)
117 */
118 SLogStream &writeWString(const wchar_t *t, int nLen = -1);
119
120 /**
121 * @brief 写入二进制数据
122 * @param t 二进制数据
123 */
124 SLogStream &writeBinary(const SLogBinary &t);
125
126 private:
127 SLogStream();
129 char *_begin; ///< 缓冲区起始地址
130 char *_end; ///< 缓冲区结束地址
131 char *_cur; ///< 当前写入位置
132};
133
134/**
135 * @typedef LogCallback
136 * @brief 日志回调函数类型
137 * @param tag 日志标签
138 * @param pLogStr 日志字符串
139 * @param level 日志级别
140 * @param file 文件名
141 * @param line 行号
142 * @param fun 函数名
143 * @param retAddr 返回地址
144 */
145typedef void (*LogCallback)(const char *tag, const char *pLogStr, int level, const char *file, int line, const char *fun, void *retAddr);
146
147/**
148 * @class Log
149 * @brief 日志记录类
150 */
151class SOUI_EXP Log {
152 public:
153 enum
154 {
155 MAX_TAGLEN = 100, ///< 最大标签长度
156 MAX_LOGLEN = 1024, ///< 最大日志长度
157 };
158
159 public:
160 /**
161 * @brief 构造函数
162 * @param tag 日志标签
163 * @param level 日志级别
164 * @param filename 文件名
165 * @param funcname 函数名
166 * @param lineIndex 行号
167 * @param pAddr 返回地址
168 */
169 Log(const char *tag, int level, const char *filename, const char *funcname, int lineIndex, void *pAddr);
170
171 /**
172 * @brief 析构函数
173 */
174 ~Log();
175
176 /**
177 * @brief 获取日志流对象
178 * @return 日志流对象引用
179 */
180 SLogStream &stream();
181
182 /**
183 * @brief 设置日志级别
184 * @param nLevel 日志级别
185 */
186 static void setLogLevel(int nLevel);
187
188 /**
189 * @brief 设置日志回调函数
190 * @param logCallback 日志回调函数指针
191 */
192 static void setLogCallback(LogCallback logCallback);
193
194 /**
195 * @brief 设置日志回显功能
196 * @param bEnable 是否启用回显
197 */
198 static void setLogEcho(bool bEnable);
199
200 private:
201 /**
202 * @brief 默认日志回调函数
203 * @param tag 日志标签
204 * @param pLogStr 日志字符串
205 * @param level 日志级别
206 * @param file 文件名
207 * @param line 行号
208 * @param fun 函数名
209 * @param retAddr 返回地址
210 */
211 static void DefCallback(const char *tag, const char *pLogStr, int level, const char *file, int line, const char *fun, void *retAddr);
212
213 char m_tag[MAX_TAGLEN]; ///< 日志标签
214 int m_level; ///< 日志级别
215 void *m_pAddr; ///< 返回地址
216 const char *m_file; ///< 文件名
217 const char *m_func; ///< 函数名
218 int m_line; ///< 行号
219 char m_logBuf[MAX_LOGLEN + 1]; ///< 日志缓冲区
220 SLogStream m_stream; ///< 日志流对象
221
222 static bool s_enableEcho; ///< 是否启用日志回显
223 static int s_logLevel; ///< 当前日志级别
224 static LogCallback gs_logCallback; ///< 日志回调函数指针
225};
226
227SNSEND
228
229#ifdef _WIN32
230#define FUNCNAME __FUNCTION__
231#else
232#define FUNCNAME __PRETTY_FUNCTION__
233#endif //_WIN32
234
235/**
236 * @def SLOG
237 * @brief 流式输出日志宏
238 * @param tag 日志标签
239 * @param level 日志级别
240 */
241#define SLOG(tag, level) SNS::Log(tag, level, __FILE__, FUNCNAME, __LINE__, RetAddr()).stream()
242
243/**
244 * @def SLOG_FMT
245 * @brief 格式化输出日志宏
246 * @param tag 日志标签
247 * @param level 日志级别
248 * @param logformat 格式字符串
249 * @param ... 可变参数列表
250 */
251#define SLOG_FMT(tag, level, logformat, ...) SLOG(tag, level).writeFormat(logformat, ##__VA_ARGS__)
252
253// 流式输出日志,当kLogTag有效时使用,否则编译失败,kLogTag可以是当前定义的宏,也可以是当前对象的成员变量。
254#define SLOGD() SLOG(kLogTag, SNS::LOG_LEVEL_DEBUG)
255#define SLOGI() SLOG(kLogTag, SNS::LOG_LEVEL_INFO)
256#define SLOGW() SLOG(kLogTag, SNS::LOG_LEVEL_WARN)
257#define SLOGE() SLOG(kLogTag, SNS::LOG_LEVEL_ERROR)
258#define SLOGF() SLOG(kLogTag, SNS::LOG_LEVEL_FATAL)
259
260// 流式输出日志,每条日志手动指定tag
261#define SLOGD2(tag) SLOG(tag, SNS::LOG_LEVEL_DEBUG)
262#define SLOGI2(tag) SLOG(tag, SNS::LOG_LEVEL_INFO)
263#define SLOGW2(tag) SLOG(tag, SNS::LOG_LEVEL_WARN)
264#define SLOGE2(tag) SLOG(tag, SNS::LOG_LEVEL_ERROR)
265#define SLOGF2(tag) SLOG(tag, SNS::LOG_LEVEL_FATAL)
266
267// SOUI4内部使用的日志输出,自动将TAG定义为soui4
268#define kSoui4Tag "soui4"
269#define SSLOGD() SLOG(kSoui4Tag, SNS::LOG_LEVEL_DEBUG)
270#define SSLOGI() SLOG(kSoui4Tag, SNS::LOG_LEVEL_INFO)
271#define SSLOGW() SLOG(kSoui4Tag, SNS::LOG_LEVEL_WARN)
272#define SSLOGE() SLOG(kSoui4Tag, SNS::LOG_LEVEL_ERROR)
273#define SSLOGF() SLOG(kSoui4Tag, SNS::LOG_LEVEL_FATAL)
274
275// 格式化输出日志,当kLogTag有效时使用,否则编译失败,kLogTag可以是当前定义的宏,也可以是当前对象的成员变量。
276#define SLOGFMTD(logformat, ...) SLOG_FMT(kLogTag, SNS::LOG_LEVEL_DEBUG, logformat, ##__VA_ARGS__)
277#define SLOGFMTI(logformat, ...) SLOG_FMT(kLogTag, SNS::LOG_LEVEL_INFO, logformat, ##__VA_ARGS__)
278#define SLOGFMTW(logformat, ...) SLOG_FMT(kLogTag, SNS::LOG_LEVEL_WARN, logformat, ##__VA_ARGS__)
279#define SLOGFMTE(logformat, ...) SLOG_FMT(kLogTag, SNS::LOG_LEVEL_ERROR, logformat, ##__VA_ARGS__)
280#define SLOGFMTF(logformat, ...) SLOG_FMT(kLogTag, SNS::LOG_LEVEL_FATAL, logformat, ##__VA_ARGS__)
281
282// 格式化输出日志,每条日志手动指定tag
283#define SLOGFMTD2(tag, logformat, ...) SLOG_FMT(tag, SNS::LOG_LEVEL_DEBUG, logformat, ##__VA_ARGS__)
284#define SLOGFMTI2(tag, logformat, ...) SLOG_FMT(tag, SNS::LOG_LEVEL_INFO, logformat, ##__VA_ARGS__)
285#define SLOGFMTW2(tag, logformat, ...) SLOG_FMT(tag, SNS::LOG_LEVEL_WARN, logformat, ##__VA_ARGS__)
286#define SLOGFMTE2(tag, logformat, ...) SLOG_FMT(tag, SNS::LOG_LEVEL_ERROR, logformat, ##__VA_ARGS__)
287#define SLOGFMTF2(tag, logformat, ...) SLOG_FMT(tag, SNS::LOG_LEVEL_FATAL, logformat, ##__VA_ARGS__)
288
289#define SSLOGFMTD(logformat, ...) SLOG_FMT(kSoui4Tag, SNS::LOG_LEVEL_DEBUG, logformat, ##__VA_ARGS__)
290#define SSLOGFMTI(logformat, ...) SLOG_FMT(kSoui4Tag, SNS::LOG_LEVEL_INFO, logformat, ##__VA_ARGS__)
291#define SSLOGFMTW(logformat, ...) SLOG_FMT(kSoui4Tag, SNS::LOG_LEVEL_WARN, logformat, ##__VA_ARGS__)
292#define SSLOGFMTE(logformat, ...) SLOG_FMT(kSoui4Tag, SNS::LOG_LEVEL_ERROR, logformat, ##__VA_ARGS__)
293#define SSLOGFMTF(logformat, ...) SLOG_FMT(kSoui4Tag, SNS::LOG_LEVEL_FATAL, logformat, ##__VA_ARGS__)
294
295#endif // __SLOG__H__
日志记录类
Definition slog.h:151
Log(const char *tag, int level, const char *filename, const char *funcname, int lineIndex, void *pAddr)
构造函数
Definition slog.cpp:46
@ MAX_TAGLEN
最大标签长度
Definition slog.h:155
@ MAX_LOGLEN
最大日志长度
Definition slog.h:156
二进制日志数据类
Definition slog.h:27
SLogBinary(const char *buf, int len)
构造函数
Definition slog.h:34
int _len
二进制数据长度
Definition slog.h:41
const char * _buf
二进制数据缓冲区
Definition slog.h:40
日志流类,用于格式化日志输出
Definition slog.h:48
SLogStream(char *buf, int len)
构造函数
Definition slog.cpp:154
SLogStream & operator<<(const void *t)
重载运算符<<,用于输出各种类型的数据
Definition slog.cpp:328
SLogStream & writeFormat(const char *format,...)
格式化输出日志
Definition slog.cpp:217