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>
49#define WLOG_LEVEL_INHERIT 0xFFFF
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
108 typedef struct s_wLog wLog;
110#define WLOG_PACKET_INBOUND 1
111#define WLOG_PACKET_OUTBOUND 2
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,
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,
161 WINPR_API BOOL WLog_PrintMessage(wLog* log, DWORD type, DWORD level,
size_t line,
162 const
char* file, const
char* function, ...);
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);
180 WINPR_API wLog* WLog_GetRoot(
void);
183 WINPR_API wLog* WLog_Get(LPCSTR name);
186 WINPR_API DWORD WLog_GetLogLevel(wLog* log);
189 WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
201 WINPR_API BOOL WLog_SetContext(wLog* log, const
char* (*fkt)(
void*),
void* context);
216 WINPR_API BOOL WLog_SetGlobalContext(const
char* globalprefix);
218#define WLog_Print_unchecked(_log, _log_level, ...) \
221 WLog_PrintTextMessage(_log, _log_level, __LINE__, __FILE__, __func__, __VA_ARGS__); \
224#define WLog_Print(_log, _log_level, ...) \
227 if (WLog_IsLevelActive(_log, _log_level)) \
229 WLog_Print_unchecked(_log, _log_level, __VA_ARGS__); \
233#define WLog_Print_tag(_tag, _log_level, ...) \
236 static wLog* _log_cached_ptr = nullptr; \
237 if (!_log_cached_ptr) \
238 _log_cached_ptr = WLog_Get(_tag); \
239 WLog_Print(_log_cached_ptr, _log_level, __VA_ARGS__); \
242#define WLog_PrintVA_unchecked(_log, _log_level, _fmt, _args) \
245 WLog_PrintTextMessageVA(_log, _log_level, __LINE__, __FILE__, __func__, _fmt, _args); \
248#define WLog_PrintVA(_log, _log_level, _fmt, _args) \
251 if (WLog_IsLevelActive(_log, _log_level)) \
253 WLog_PrintVA_unchecked(_log, _log_level, _fmt, _args); \
257#define WLog_Data(_log, _log_level, ...) \
260 if (WLog_IsLevelActive(_log, _log_level)) \
262 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
267#define WLog_Image(_log, _log_level, ...) \
270 if (WLog_IsLevelActive(_log, _log_level)) \
272 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
277#define WLog_Packet(_log, _log_level, ...) \
280 if (WLog_IsLevelActive(_log, _log_level)) \
282 WLog_PrintMessage(_log, WLOG_MESSAGE_PACKET, _log_level, __LINE__, __FILE__, __func__, \
287 WINPR_ATTR_FORMAT_ARG(6, 7)
288 static inline
void WLog_Print_dbg_tag(const
char* WINPR_RESTRICT tag, DWORD log_level,
289 size_t line, const
char* file, const
char* fkt,
290 WINPR_FORMAT_ARG const
char* fmt, ...)
292 static wLog* log_cached_ptr =
nullptr;
294 log_cached_ptr = WLog_Get(tag);
296 if (WLog_IsLevelActive(log_cached_ptr, log_level))
298 va_list ap = WINPR_C_ARRAY_INIT;
300 WLog_PrintTextMessageVA(log_cached_ptr, log_level, line, file, fkt, fmt, ap);
305#define WLog_LVL(tag, lvl, ...) \
306 WLog_Print_dbg_tag(tag, lvl, __LINE__, __FILE__, __func__, __VA_ARGS__)
307#define WLog_VRB(tag, ...) \
308 WLog_Print_dbg_tag(tag, WLOG_TRACE, __LINE__, __FILE__, __func__, __VA_ARGS__)
309#define WLog_DBG(tag, ...) \
310 WLog_Print_dbg_tag(tag, WLOG_DEBUG, __LINE__, __FILE__, __func__, __VA_ARGS__)
311#define WLog_INFO(tag, ...) \
312 WLog_Print_dbg_tag(tag, WLOG_INFO, __LINE__, __FILE__, __func__, __VA_ARGS__)
313#define WLog_WARN(tag, ...) \
314 WLog_Print_dbg_tag(tag, WLOG_WARN, __LINE__, __FILE__, __func__, __VA_ARGS__)
315#define WLog_ERR(tag, ...) \
316 WLog_Print_dbg_tag(tag, WLOG_ERROR, __LINE__, __FILE__, __func__, __VA_ARGS__)
317#define WLog_FATAL(tag, ...) \
318 WLog_Print_dbg_tag(tag, WLOG_FATAL, __LINE__, __FILE__, __func__, __VA_ARGS__)
321 WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
324 WINPR_API BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level);
327 WINPR_API BOOL WLog_AddStringLogFilters(LPCSTR filter);
330 WINPR_API BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType);
333 WINPR_API wLogAppender* WLog_GetLogAppender(wLog* log);
336 WINPR_API BOOL WLog_OpenAppender(wLog* log);
339 WINPR_API BOOL WLog_CloseAppender(wLog* log);
342 WINPR_API BOOL WLog_ConfigureAppender(wLogAppender* appender,
const char* setting,
void* value);
345 WINPR_API wLogLayout* WLog_GetLogLayout(wLog* log);
348 WINPR_API BOOL WLog_Layout_SetPrefixFormat(wLog* log, wLogLayout* layout,
const char* format);
350#if defined(WITH_WINPR_DEPRECATED)
352 WINPR_DEPRECATED(WINPR_ATTR_NODISCARD WINPR_API BOOL WLog_Init(
void));
355 WINPR_DEPRECATED(WINPR_ATTR_NODISCARD WINPR_API BOOL WLog_Uninit(
void));
358 typedef BOOL (*wLogCallbackMessage_t)(
const wLogMessage* msg);
359 typedef BOOL (*wLogCallbackData_t)(
const wLogMessage* msg);
360 typedef BOOL (*wLogCallbackImage_t)(
const wLogMessage* msg);
361 typedef BOOL (*wLogCallbackPackage_t)(
const wLogMessage* msg);
365 WINPR_ATTR_NODISCARD wLogCallbackData_t data;
366 WINPR_ATTR_NODISCARD wLogCallbackImage_t image;
367 WINPR_ATTR_NODISCARD wLogCallbackMessage_t message;
368 WINPR_ATTR_NODISCARD wLogCallbackPackage_t package;