Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_log.h
Go to the documentation of this file.
1
14#ifndef VL_LOG_H
15#define VL_LOG_H
16
17#include "vl_memory.h"
18#include "vl_numtypes.h"
19#include "vl_stream.h"
20
84typedef struct vl_logger_ vl_logger;
85
101typedef struct vl_log_sink_vtbl_
102{
110 void (*write)(void* sink_data, const char* msg, vl_memsize_t len);
111
117 void (*flush)(void* sink_data);
118
126 void (*destroy)(void* sink_data);
128
147typedef struct vl_log_sink_
148{
155
163
171typedef struct vl_log_config_
172{
187
216VL_API vl_logger* vlLoggerNew(const vl_log_config* config);
217
240VL_API void vlLoggerDelete(vl_logger* logger);
241
259VL_API vl_bool_t vlLoggerAddSink(vl_logger* logger, vl_log_sink sink);
260
286VL_API void vlLoggerMessage(vl_logger* logger, const char* msg);
287
300VL_API void vlLoggerMessageF(vl_logger* logger, const char* msgFormat, ...);
301
317VL_API void vlLoggerFlush(vl_logger* logger);
318
328VL_API vl_log_sink vlLogSinkStdout(void);
329
345
346/* ---------------- Global convenience API ---------------- */
347
366VL_API void vlLogInit(const vl_log_config* config);
367
375VL_API void vlLogFlush(void);
376
386VL_API void vlLogShutdown(void);
387
397VL_API void vlLogMessage(const char* msg);
398
408VL_API void vlLogMessageF(const char* msgFormat, ...);
409
419VL_API void vlLogError(const char* msg);
420
429VL_API void vlLogErrorF(const char* msgFormat, ...);
430
441
447VL_API vl_bool_t vlLogAddStdoutSink(void);
448
457
458/* ---------------- Debug compile control ----------------
459 *
460 * The logger provides macros for debug-only logs that compile out completely
461 * when disabled.
462 *
463 * - Define `VL_ENABLE_DEBUG_LOG` to 1 to force-enable debug logging macros.
464 * - Define `VL_ENABLE_DEBUG_LOG` to 0 to force-disable debug logging macros.
465 * - If not defined, the default is: enabled when !NDEBUG.
466 *
467 * Important: To avoid cross-compiler issues with empty variadic macro arguments
468 * in C11, debug and release logging macros are provided as two forms:
469 * - `*_MSG0(msg)` : message-only (no variadic arguments)
470 * - `*_MSGF(fmt, ...)` : formatted
471 */
472
473#ifndef VL_ENABLE_DEBUG_LOG
474#if !defined(NDEBUG)
475#define VL_ENABLE_DEBUG_LOG 1
476#else
477#define VL_ENABLE_DEBUG_LOG 0
478#endif
479#endif
480
481#if VL_ENABLE_DEBUG_LOG
482
483#include "vl_ansi_term.h"
484
489#define VL_LOGD_MSG0(msg) \
490 vlLogMessageF(VL_ANSI_FG_MAGENTA "[DBG | %s @ line %d] " VL_ANSI_RESET "%s", __FILE__, __LINE__, msg)
491
496#define VL_LOGD_MSGF(fmt, ...) \
497 vlLogMessageF(VL_ANSI_FG_MAGENTA "[DBG | %s @ line %d] " VL_ANSI_RESET fmt, __FILE__, __LINE__, __VA_ARGS__)
498
503#define VL_LOGD_ERR0(msg) \
504 vlLogErrorF(VL_ANSI_FG_YELLOW "[DBG | %s @ line %d] " VL_ANSI_RESET "%s", __FILE__, __LINE__, msg)
505
510#define VL_LOGD_ERRF(fmt, ...) \
511 vlLogErrorF(VL_ANSI_FG_YELLOW "[DBG | %s @ line %d] " VL_ANSI_RESET fmt, __FILE__, __LINE__, __VA_ARGS__)
512#else
513#define VL_LOGD_MSG0(msg) ((void)0)
514#define VL_LOGD_MSGF(fmt, ...) ((void)0)
515#define VL_LOGD_ERR0(msg) ((void)0)
516#define VL_LOGD_ERRF(fmt, ...) ((void)0)
517#endif
518
523#define VL_LOG_MSG0(msg) vlLogMessage(msg)
524
529#define VL_LOG_MSGF(fmt, ...) vlLogMessageF((fmt), __VA_ARGS__)
530
535#define VL_LOG_ERR0(msg) vlLogError(msg)
536
541#define VL_LOG_ERRF(fmt, ...) vlLogErrorF((fmt), __VA_ARGS__)
542
543#endif // VL_LOG_H
Virtual function table for a log sink.
Definition vl_log.h:102
Opaque logger instance type.
Definition vl_log.c:28
VL_API void vlLogFlush(void)
Flush the global logger.
Definition vl_log.c:457
VL_API void vlLoggerMessage(vl_logger *logger, const char *msg)
Write a preformatted message through a specific logger.
Definition vl_log.c:331
VL_API vl_log_sink vlLogSinkStream(vl_stream *stream)
Create a sink that writes to an existing vl_stream.
Definition vl_log.c:422
void * sink_data
Sink implementation state.
Definition vl_log.h:161
const vl_log_sink_vtbl * vtbl
Sink callback table.
Definition vl_log.h:154
VL_API void vlLoggerDelete(vl_logger *logger)
Destroy a logger instance and release all associated resources.
Definition vl_log.c:272
VL_API void vlLoggerMessageF(vl_logger *logger, const char *msgFormat,...)
Write a formatted message through a specific logger.
Definition vl_log.c:350
VL_API void vlLogMessageF(const char *msgFormat,...)
Write a formatted message through the global logger.
Definition vl_log.c:487
VL_API vl_bool_t vlLogAddStdoutSink(void)
Convenience helper that attaches a stdout sink to the global logger.
Definition vl_log.c:476
VL_API void vlLogInit(const vl_log_config *config)
Initialize the global logger.
Definition vl_log.c:447
VL_API vl_bool_t vlLogAddStreamSink(vl_stream *stream)
Convenience helper that attaches a vl_stream sink to the global logger.
Definition vl_log.c:478
vl_bool_t async
Enable asynchronous logging.
Definition vl_log.h:185
VL_API void vlLogError(const char *msg)
Write an error message through the global logger.
Definition vl_log.c:507
VL_API void vlLogShutdown(void)
Shut down and destroy the global logger.
Definition vl_log.c:459
VL_API vl_logger * vlLoggerNew(const vl_log_config *config)
Create a new logger instance.
Definition vl_log.c:246
VL_API void vlLogErrorF(const char *msgFormat,...)
Write a formatted error message through the global logger.
Definition vl_log.c:509
VL_API vl_bool_t vlLogAddSink(vl_log_sink sink)
Attach a sink to the global logger.
Definition vl_log.c:467
VL_API void vlLoggerFlush(vl_logger *logger)
Flush pending messages for a specific logger.
Definition vl_log.c:368
VL_API void vlLogMessage(const char *msg)
Write a preformatted message through the global logger.
Definition vl_log.c:480
VL_API vl_log_sink vlLogSinkStdout(void)
Create a sink that writes to standard output.
Definition vl_log.c:405
VL_API vl_bool_t vlLoggerAddSink(vl_logger *logger, vl_log_sink sink)
Attach a sink to a logger instance.
Definition vl_log.c:309
Configuration used when creating a logger.
Definition vl_log.h:172
Public descriptor for attaching an output sink to a logger.
Definition vl_log.h:148
VL_BOOL_T vl_bool_t
Definition vl_numtypes.h:191
Generic, thread-safe byte stream abstraction.
Definition vl_stream.h:77