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/wtypes.h>
34#include <winpr/winpr.h>
35#include <winpr/synch.h>
36#include <winpr/thread.h>
37
41#define WLOG_TRACE 0
42#define WLOG_DEBUG 1
43#define WLOG_INFO 2
44#define WLOG_WARN 3
45#define WLOG_ERROR 4
46#define WLOG_FATAL 5
47#define WLOG_OFF 6
48#define WLOG_LEVEL_INHERIT 0xFFFF
49
53#define WLOG_MESSAGE_TEXT 0
54#define WLOG_MESSAGE_DATA 1
55#define WLOG_MESSAGE_IMAGE 2
56#define WLOG_MESSAGE_PACKET 3
57
61#define WLOG_APPENDER_CONSOLE 0
62#define WLOG_APPENDER_FILE 1
63#define WLOG_APPENDER_BINARY 2
64#define WLOG_APPENDER_CALLBACK 3
65#define WLOG_APPENDER_SYSLOG 4
66#define WLOG_APPENDER_JOURNALD 5
67#define WLOG_APPENDER_UDP 6
68
69 typedef struct
70 {
71 DWORD Type;
72
73 DWORD Level;
74
75 LPSTR PrefixString;
76
77 LPCSTR FormatString;
78 LPCSTR TextString;
79
80 size_t LineNumber; /* __LINE__ */
81 LPCSTR FileName; /* __FILE__ */
82 LPCSTR FunctionName; /* __func__ */
83
84 /* Data Message */
85
86 void* Data;
87 size_t Length;
88
89 /* Image Message */
90
91 void* ImageData;
92 size_t ImageWidth;
93 size_t ImageHeight;
94 size_t ImageBpp;
95
96 /* Packet Message */
97
98 void* PacketData;
99 size_t PacketLength;
100 DWORD PacketFlags;
101 } wLogMessage;
102 typedef struct s_wLogLayout wLogLayout;
103 typedef struct s_wLogAppender wLogAppender;
104 typedef struct s_wLog wLog;
105
106#define WLOG_PACKET_INBOUND 1
107#define WLOG_PACKET_OUTBOUND 2
108
109 WINPR_API BOOL WLog_PrintMessage(wLog* log, DWORD type, DWORD level, size_t line,
110 const char* file, const char* function, ...);
111 WINPR_API BOOL WLog_PrintMessageVA(wLog* log, DWORD type, DWORD level, size_t line,
112 const char* file, const char* function, va_list args);
113
114 WINPR_API wLog* WLog_GetRoot(void);
115 WINPR_API wLog* WLog_Get(LPCSTR name);
116 WINPR_API DWORD WLog_GetLogLevel(wLog* log);
117 WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
118
129 WINPR_API BOOL WLog_SetContext(wLog* log, const char* (*fkt)(void*), void* context);
130
131#define WLog_Print_unchecked(_log, _log_level, ...) \
132 do \
133 { \
134 WLog_PrintMessage(_log, WLOG_MESSAGE_TEXT, _log_level, __LINE__, __FILE__, __func__, \
135 __VA_ARGS__); \
136 } while (0)
137
138#define WLog_Print(_log, _log_level, ...) \
139 do \
140 { \
141 if (WLog_IsLevelActive(_log, _log_level)) \
142 { \
143 WLog_Print_unchecked(_log, _log_level, __VA_ARGS__); \
144 } \
145 } while (0)
146
147#define WLog_Print_tag(_tag, _log_level, ...) \
148 do \
149 { \
150 static wLog* _log_cached_ptr = NULL; \
151 if (!_log_cached_ptr) \
152 _log_cached_ptr = WLog_Get(_tag); \
153 WLog_Print(_log_cached_ptr, _log_level, __VA_ARGS__); \
154 } while (0)
155
156#define WLog_PrintVA_unchecked(_log, _log_level, _args) \
157 do \
158 { \
159 WLog_PrintMessageVA(_log, WLOG_MESSAGE_TEXT, _log_level, __LINE__, __FILE__, __func__, \
160 _args); \
161 } while (0)
162
163#define WLog_PrintVA(_log, _log_level, _args) \
164 do \
165 { \
166 if (WLog_IsLevelActive(_log, _log_level)) \
167 { \
168 WLog_PrintVA_unchecked(_log, _log_level, _args); \
169 } \
170 } while (0)
171
172#define WLog_Data(_log, _log_level, ...) \
173 do \
174 { \
175 if (WLog_IsLevelActive(_log, _log_level)) \
176 { \
177 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
178 __VA_ARGS__); \
179 } \
180 } while (0)
181
182#define WLog_Image(_log, _log_level, ...) \
183 do \
184 { \
185 if (WLog_IsLevelActive(_log, _log_level)) \
186 { \
187 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
188 __VA_ARGS__); \
189 } \
190 } while (0)
191
192#define WLog_Packet(_log, _log_level, ...) \
193 do \
194 { \
195 if (WLog_IsLevelActive(_log, _log_level)) \
196 { \
197 WLog_PrintMessage(_log, WLOG_MESSAGE_PACKET, _log_level, __LINE__, __FILE__, __func__, \
198 __VA_ARGS__); \
199 } \
200 } while (0)
201
202 static inline void WLog_Print_dbg_tag(const char* WINPR_RESTRICT tag, DWORD log_level,
203 size_t line, const char* file, const char* fkt, ...)
204 {
205 static wLog* log_cached_ptr = NULL;
206 if (!log_cached_ptr)
207 log_cached_ptr = WLog_Get(tag);
208
209 if (WLog_IsLevelActive(log_cached_ptr, log_level))
210 {
211 va_list ap;
212 va_start(ap, fkt);
213 WLog_PrintMessageVA(log_cached_ptr, WLOG_MESSAGE_TEXT, log_level, line, file, fkt, ap);
214 va_end(ap);
215 }
216 }
217
218#define WLog_LVL(tag, lvl, ...) \
219 WLog_Print_dbg_tag(tag, lvl, __LINE__, __FILE__, __func__, __VA_ARGS__)
220#define WLog_VRB(tag, ...) \
221 WLog_Print_dbg_tag(tag, WLOG_TRACE, __LINE__, __FILE__, __func__, __VA_ARGS__)
222#define WLog_DBG(tag, ...) \
223 WLog_Print_dbg_tag(tag, WLOG_DEBUG, __LINE__, __FILE__, __func__, __VA_ARGS__)
224#define WLog_INFO(tag, ...) \
225 WLog_Print_dbg_tag(tag, WLOG_INFO, __LINE__, __FILE__, __func__, __VA_ARGS__)
226#define WLog_WARN(tag, ...) \
227 WLog_Print_dbg_tag(tag, WLOG_WARN, __LINE__, __FILE__, __func__, __VA_ARGS__)
228#define WLog_ERR(tag, ...) \
229 WLog_Print_dbg_tag(tag, WLOG_ERROR, __LINE__, __FILE__, __func__, __VA_ARGS__)
230#define WLog_FATAL(tag, ...) \
231 WLog_Print_dbg_tag(tag, WLOG_FATAL, __LINE__, __FILE__, __func__, __VA_ARGS__)
232
233 WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
234 WINPR_API BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level);
235 WINPR_API BOOL WLog_AddStringLogFilters(LPCSTR filter);
236
237 WINPR_API BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType);
238 WINPR_API wLogAppender* WLog_GetLogAppender(wLog* log);
239 WINPR_API BOOL WLog_OpenAppender(wLog* log);
240 WINPR_API BOOL WLog_CloseAppender(wLog* log);
241 WINPR_API BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value);
242
243 WINPR_API wLogLayout* WLog_GetLogLayout(wLog* log);
244 WINPR_API BOOL WLog_Layout_SetPrefixFormat(wLog* log, wLogLayout* layout, const char* format);
245
246#if defined(WITH_WINPR_DEPRECATED)
248 WINPR_DEPRECATED(WINPR_API BOOL WLog_Init(void));
250 WINPR_DEPRECATED(WINPR_API BOOL WLog_Uninit(void));
251#endif
252
253 typedef BOOL (*wLogCallbackMessage_t)(const wLogMessage* msg);
254 typedef BOOL (*wLogCallbackData_t)(const wLogMessage* msg);
255 typedef BOOL (*wLogCallbackImage_t)(const wLogMessage* msg);
256 typedef BOOL (*wLogCallbackPackage_t)(const wLogMessage* msg);
257
258 typedef struct
259 {
260 wLogCallbackData_t data;
261 wLogCallbackImage_t image;
262 wLogCallbackMessage_t message;
263 wLogCallbackPackage_t package;
265
266#ifdef __cplusplus
267}
268#endif
269
270#endif /* WINPR_WLOG_H */