FreeRDP
Loading...
Searching...
No Matches
include/winpr/wlog.h
1
23#ifndef WINPR_LOG_H
24#define WINPR_LOG_H
25
26#ifdef __cplusplus
27extern "C"
28{
29#endif
30
31#include <stdarg.h>
32
33#include <winpr/platform.h>
34#include <winpr/wtypes.h>
35#include <winpr/winpr.h>
36#include <winpr/synch.h>
37#include <winpr/thread.h>
38
42#define WLOG_TRACE 0
43#define WLOG_DEBUG 1
44#define WLOG_INFO 2
45#define WLOG_WARN 3
46#define WLOG_ERROR 4
47#define WLOG_FATAL 5
48#define WLOG_OFF 6
49#define WLOG_LEVEL_INHERIT 0xFFFF
50
54#define WLOG_MESSAGE_TEXT 0
55#define WLOG_MESSAGE_DATA 1
56#define WLOG_MESSAGE_IMAGE 2
57#define WLOG_MESSAGE_PACKET 3
65#define WLOG_APPENDER_CONSOLE 0
66#define WLOG_APPENDER_FILE 1
67#define WLOG_APPENDER_BINARY 2
68#define WLOG_APPENDER_CALLBACK 3
69#define WLOG_APPENDER_SYSLOG 4
70#define WLOG_APPENDER_JOURNALD 5
71#define WLOG_APPENDER_UDP 6
72
73 typedef struct
74 {
75 DWORD Type;
76
77 DWORD Level;
78
79 LPSTR PrefixString;
80
81 LPCSTR FormatString;
82 LPCSTR TextString;
83
84 size_t LineNumber; /* __LINE__ */
85 LPCSTR FileName; /* __FILE__ */
86 LPCSTR FunctionName; /* __func__ */
87
88 /* Data Message */
89
90 void* Data;
91 size_t Length;
92
93 /* Image Message */
94
95 void* ImageData;
96 size_t ImageWidth;
97 size_t ImageHeight;
98 size_t ImageBpp;
99
100 /* Packet Message */
101
102 void* PacketData;
103 size_t PacketLength;
104 DWORD PacketFlags;
105 } wLogMessage;
106 typedef struct s_wLogLayout wLogLayout;
107 typedef struct s_wLogAppender wLogAppender;
108 typedef struct s_wLog wLog;
109
110#define WLOG_PACKET_INBOUND 1
111#define WLOG_PACKET_OUTBOUND 2
112
126 WINPR_ATTR_FORMAT_ARG(6, 7)
127 WINPR_API BOOL WLog_PrintTextMessage(wLog* log, DWORD level, size_t line, const char* file,
128 const char* function, WINPR_FORMAT_ARG const char* fmt,
129 ...);
130
144 WINPR_ATTR_FORMAT_ARG(6, 0)
145 WINPR_API BOOL WLog_PrintTextMessageVA(wLog* log, DWORD level, size_t line, const char* file,
146 const char* function, WINPR_FORMAT_ARG const char* fmt,
147 va_list args);
148
161 WINPR_API BOOL WLog_PrintMessage(wLog* log, DWORD type, DWORD level, size_t line,
162 const char* file, const char* function, ...);
163
176 WINPR_API BOOL WLog_PrintMessageVA(wLog* log, DWORD type, DWORD level, size_t line,
177 const char* file, const char* function, va_list args);
178
179 WINPR_ATTR_NODISCARD
180 WINPR_API wLog* WLog_GetRoot(void);
181
182 WINPR_ATTR_NODISCARD
183 WINPR_API wLog* WLog_Get(LPCSTR name);
184
190 WINPR_API void WLog_Discard(wLog* log);
191
200 WINPR_ATTR_MALLOC(WLog_Discard, 1)
201 WINPR_API wLog* WLog_Create(LPCSTR name, wLog* root);
202
203 WINPR_ATTR_NODISCARD
204 WINPR_API DWORD WLog_GetLogLevel(wLog* log);
205
206 WINPR_ATTR_NODISCARD
207 WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
208
223 WINPR_API BOOL WLog_SetContext(wLog* log, const char* (*fkt)(void*), void* context);
224
238 WINPR_API BOOL WLog_SetGlobalContext(const char* globalprefix);
239
240#define WLog_Print_unchecked(_log, _log_level, ...) \
241 do \
242 { \
243 WLog_PrintTextMessage(_log, _log_level, __LINE__, __FILE__, __func__, __VA_ARGS__); \
244 } while (0)
245
246#define WLog_Print(_log, _log_level, ...) \
247 do \
248 { \
249 if (WLog_IsLevelActive(_log, _log_level)) \
250 { \
251 WLog_Print_unchecked(_log, _log_level, __VA_ARGS__); \
252 } \
253 } while (0)
254
255#define WLog_Print_tag(_tag, _log_level, ...) \
256 do \
257 { \
258 static wLog* _log_cached_ptr = nullptr; \
259 if (!_log_cached_ptr) \
260 _log_cached_ptr = WLog_Get(_tag); \
261 WLog_Print(_log_cached_ptr, _log_level, __VA_ARGS__); \
262 } while (0)
263
264#define WLog_PrintVA_unchecked(_log, _log_level, _fmt, _args) \
265 do \
266 { \
267 WLog_PrintTextMessageVA(_log, _log_level, __LINE__, __FILE__, __func__, _fmt, _args); \
268 } while (0)
269
270#define WLog_PrintVA(_log, _log_level, _fmt, _args) \
271 do \
272 { \
273 if (WLog_IsLevelActive(_log, _log_level)) \
274 { \
275 WLog_PrintVA_unchecked(_log, _log_level, _fmt, _args); \
276 } \
277 } while (0)
278
279#define WLog_Data(_log, _log_level, ...) \
280 do \
281 { \
282 if (WLog_IsLevelActive(_log, _log_level)) \
283 { \
284 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
285 __VA_ARGS__); \
286 } \
287 } while (0)
288
289#define WLog_Image(_log, _log_level, ...) \
290 do \
291 { \
292 if (WLog_IsLevelActive(_log, _log_level)) \
293 { \
294 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
295 __VA_ARGS__); \
296 } \
297 } while (0)
298
299#define WLog_Packet(_log, _log_level, ...) \
300 do \
301 { \
302 if (WLog_IsLevelActive(_log, _log_level)) \
303 { \
304 WLog_PrintMessage(_log, WLOG_MESSAGE_PACKET, _log_level, __LINE__, __FILE__, __func__, \
305 __VA_ARGS__); \
306 } \
307 } while (0)
308
309 WINPR_ATTR_FORMAT_ARG(6, 7)
310 static inline void WLog_Print_dbg_tag(const char* WINPR_RESTRICT tag, DWORD log_level,
311 size_t line, const char* file, const char* fkt,
312 WINPR_FORMAT_ARG const char* fmt, ...)
313 {
314 static wLog* log_cached_ptr = nullptr;
315 if (!log_cached_ptr)
316 log_cached_ptr = WLog_Get(tag);
317
318 if (WLog_IsLevelActive(log_cached_ptr, log_level))
319 {
320 va_list ap = WINPR_C_ARRAY_INIT;
321 va_start(ap, fmt);
322 WLog_PrintTextMessageVA(log_cached_ptr, log_level, line, file, fkt, fmt, ap);
323 va_end(ap);
324 }
325 }
326
327#define WLog_LVL(tag, lvl, ...) \
328 WLog_Print_dbg_tag(tag, lvl, __LINE__, __FILE__, __func__, __VA_ARGS__)
329#define WLog_VRB(tag, ...) \
330 WLog_Print_dbg_tag(tag, WLOG_TRACE, __LINE__, __FILE__, __func__, __VA_ARGS__)
331#define WLog_DBG(tag, ...) \
332 WLog_Print_dbg_tag(tag, WLOG_DEBUG, __LINE__, __FILE__, __func__, __VA_ARGS__)
333#define WLog_INFO(tag, ...) \
334 WLog_Print_dbg_tag(tag, WLOG_INFO, __LINE__, __FILE__, __func__, __VA_ARGS__)
335#define WLog_WARN(tag, ...) \
336 WLog_Print_dbg_tag(tag, WLOG_WARN, __LINE__, __FILE__, __func__, __VA_ARGS__)
337#define WLog_ERR(tag, ...) \
338 WLog_Print_dbg_tag(tag, WLOG_ERROR, __LINE__, __FILE__, __func__, __VA_ARGS__)
339#define WLog_FATAL(tag, ...) \
340 WLog_Print_dbg_tag(tag, WLOG_FATAL, __LINE__, __FILE__, __func__, __VA_ARGS__)
341
342 WINPR_ATTR_NODISCARD
343 WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
344
345 WINPR_ATTR_NODISCARD
346 WINPR_API BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level);
347
348 WINPR_ATTR_NODISCARD
349 WINPR_API BOOL WLog_AddStringLogFilters(LPCSTR filter);
350
351 WINPR_ATTR_NODISCARD
352 WINPR_API BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType);
353
354 WINPR_ATTR_NODISCARD
355 WINPR_API wLogAppender* WLog_GetLogAppender(wLog* log);
356
357 WINPR_ATTR_NODISCARD
358 WINPR_API BOOL WLog_OpenAppender(wLog* log);
359
360 WINPR_ATTR_NODISCARD
361 WINPR_API BOOL WLog_CloseAppender(wLog* log);
362
363 WINPR_ATTR_NODISCARD
364 WINPR_API BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value);
365
366 WINPR_ATTR_NODISCARD
367 WINPR_API wLogLayout* WLog_GetLogLayout(wLog* log);
368
369 WINPR_ATTR_NODISCARD
370 WINPR_API BOOL WLog_Layout_SetPrefixFormat(wLog* log, wLogLayout* layout, const char* format);
371
372#if defined(WITH_WINPR_DEPRECATED)
374 WINPR_DEPRECATED(WINPR_ATTR_NODISCARD WINPR_API BOOL WLog_Init(void));
375
377 WINPR_DEPRECATED(WINPR_ATTR_NODISCARD WINPR_API BOOL WLog_Uninit(void));
378#endif
379
380 typedef BOOL (*wLogCallbackMessage_t)(const wLogMessage* msg);
381 typedef BOOL (*wLogCallbackData_t)(const wLogMessage* msg);
382 typedef BOOL (*wLogCallbackImage_t)(const wLogMessage* msg);
383 typedef BOOL (*wLogCallbackPackage_t)(const wLogMessage* msg);
384
385 typedef struct
386 {
387 WINPR_ATTR_NODISCARD wLogCallbackData_t data;
388 WINPR_ATTR_NODISCARD wLogCallbackImage_t image;
389 WINPR_ATTR_NODISCARD wLogCallbackMessage_t message;
390 WINPR_ATTR_NODISCARD wLogCallbackPackage_t package;
392
393#ifdef __cplusplus
394}
395#endif
396
397#endif /* WINPR_WLOG_H */