14#define LOGMOD_API static
16#define LOGMOD_API extern
32#if defined(__MINGW32__) \
33 || (defined(__GNUC__) && __GNUC__ > 4 ? true : __GNUC_PATCHLEVEL__ >= 4) \
34 || defined(__USE_MINGW_ANSI_STDIO)
35#define LOGMOD_PRINTF_LIKE(a, b) __attribute__((format(gnu_printf, a, b)))
37#define LOGMOD_PRINTF_LIKE(a, b)
45#ifndef LOGMOD_FALLBACK_APPLICATION_ID
46#define LOGMOD_FALLBACK_APPLICATION_ID "APPLICATION"
54#ifndef LOGMOD_FALLBACK_CONTEXT_ID
55#define LOGMOD_FALLBACK_CONTEXT_ID "GLOBAL"
122#define LOGMOD_LABEL_COLOR(_style, _visibility, _color) \
123 LOGMOD_STYLE_##_style, LOGMOD_VISIBILITY_##_visibility, \
124 LOGMOD_COLOR_##_color
169#define LOGMOD_STYLE_REGULAR "0"
170#define LOGMOD_STYLE_BOLD "1"
171#define LOGMOD_STYLE_UNDERLINE "4"
172#define LOGMOD_STYLE_STRIKETHROUGH "9"
177#define LOGMOD_VISIBILITY_FOREGROUND "3"
178#define LOGMOD_VISIBILITY_BACKGROUND "4"
179#define LOGMOD_VISIBILITY_INTENSITY "9"
180#define LOGMOD_VISIBILITY_BACKGROUND_INTENSITY \
186#define LOGMOD_COLOR_BLACK "0"
187#define LOGMOD_COLOR_RED "1"
188#define LOGMOD_COLOR_GREEN "2"
189#define LOGMOD_COLOR_YELLOW "3"
190#define LOGMOD_COLOR_BLUE "4"
191#define LOGMOD_COLOR_MAGENTA "5"
192#define LOGMOD_COLOR_CYAN "6"
193#define LOGMOD_COLOR_WHITE "7"
203#define __LOGMOD_LOGGER_ATTRS(_qualifier) \
204 const char *context_id; \
205 _qualifier struct logmod_options options; \
206 const long *counter; \
207 _qualifier logmod_callback callback; \
209 const struct logmod_label *_qualifier custom_labels; \
210 _qualifier size_t num_custom_labels; \
211 _qualifier int disabled
233#undef __LOGMOD_LOGGER_ATTRS
261 const char *
const application_id,
300 const char *
const context_id);
324 const size_t num_custom_labels,
346 struct logmod_logger *logger,
int show_app_id,
int show_context_id);
436 const char *
const label);
454#define logmod_nlog(_level, _logger, _parenthesized_params, num_params) \
455 _logmod_log(_logger, __LINE__, __FILE__, LOGMOD_LEVEL_##_level, \
456 LOGMOD_SPREAD_TUPLE_##num_params _parenthesized_params)
458#if __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
469#define _logmod_log_permissive(_level, _logger, _line, _file, _fmt, ...) \
470 _logmod_log(_logger, _line, _file, _level, _fmt "%s", __VA_ARGS__)
480#define logmod_log(_level, _logger, ...) \
481 _logmod_log_permissive(LOGMOD_LEVEL_##_level, _logger, __LINE__, \
482 __FILE__, __VA_ARGS__, "")
487#define logmod_log logmod_nlog
503 const char *
const filename,
504 const unsigned level,
516#define LOGMOD_ENCODE(_style, _visibility, _color, buf) \
517 "\x1b[" _style ";" _visibility _color "m" buf "\x1b[0m"
527#define LOGMOD_ENCODE_STATIC(_style, _visibility, _color, buf) \
528 LOGMOD_ENCODE(LOGMOD_STYLE_##_style, LOGMOD_VISIBILITY_##_visibility, \
529 LOGMOD_COLOR_##_color, buf)
541#define LOGMOD_ENCODE_TOGGLE(_toggle, _style, _visibility, _color, buf) \
542 ((_toggle) ? LOGMOD_ENCODE_STATIC(_style, _visibility, _color, buf) : buf)
555#define LOGMOD_ENCODE_LOGGER(_logger, _style, _visibility, _color, buf) \
556 LOGMOD_ENCODE_TOGGLE((_logger)->options.color, _style, _visibility, \
560#define LMS LOGMOD_ENCODE_STATIC
562#define LMT LOGMOD_ENCODE_TOGGLE
564#define LML LOGMOD_ENCODE_LOGGER
566#define LME LOGMOD_ENCODE
568#define LOGMOD_SPREAD_TUPLE_0(_fmt) _fmt
569#define LOGMOD_SPREAD_TUPLE_1(_fmt, _1) _fmt, _1
570#define LOGMOD_SPREAD_TUPLE_2(_fmt, _1, _2) _fmt, _1, _2
571#define LOGMOD_SPREAD_TUPLE_3(_fmt, _1, _2, _3) _fmt, _1, _2, _3
572#define LOGMOD_SPREAD_TUPLE_4(_fmt, _1, _2, _3, _4) _fmt, _2, _3, _4
573#define LOGMOD_SPREAD_TUPLE_5(_fmt, _1, _2, _3, _4, _5) \
574 _fmt, _1, _2, _3, _4, _5
575#define LOGMOD_SPREAD_TUPLE_6(_fmt, _1, _2, _3, _4, _5, _6) \
576 _fmt, _1, _2, _3, _4, _6
577#define LOGMOD_SPREAD_TUPLE_7(_fmt, _1, _2, _3, _4, _5, _6, _7) \
578 _fmt, _1, _2, _3, _4, _5, _6, _7
579#define LOGMOD_SPREAD_TUPLE_8(_fmt, _1, _2, _3, _4, _5, _6, _7, _8) \
580 _fmt, _1, _2, _3, _4, _5, _6, _7, _8
581#define LOGMOD_SPREAD_TUPLE_9(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9) \
582 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9
583#define LOGMOD_SPREAD_TUPLE_10(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
584 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10
585#define LOGMOD_SPREAD_TUPLE_11(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
587 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11
588#define LOGMOD_SPREAD_TUPLE_12(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
590 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12
591#define LOGMOD_SPREAD_TUPLE_13(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
593 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13
594#define LOGMOD_SPREAD_TUPLE_14(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
595 _11, _12, _13, _14) \
596 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14
597#define LOGMOD_SPREAD_TUPLE_15(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
598 _11, _12, _13, _14, _15) \
599 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15
600#define LOGMOD_SPREAD_TUPLE_16(_fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
601 _11, _12, _13, _14, _15, _16) \
602 _fmt, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16
631#define LOGMOD_FROM_LOGGER(_ctx) \
632 ((struct logmod *)((char *)(_ctx)->counter \
633 - offsetof(struct logmod, counter)))
635#define _LOGMOD_EXPECT(_cond, _error, _return) \
638 switch ((_error)) { \
639 case LOGMOD_BAD_PARAMETER: \
640 logmod_nlog(ERROR, NULL, ("Bad parameter: %s", #_cond), 1); \
643 logmod_nlog(ERROR, NULL, \
644 ("System error (check errno): %s", #_cond), 1); \
647 logmod_nlog(ERROR, NULL, ("Unknown error: %s", #_cond), 1); \
660#define LOGMOD_EXPECT(_cond, _error) _LOGMOD_EXPECT(_cond, _error, _error)
671 const char *
const application_id,
681 memset(table, 0, length *
sizeof *table);
684 *mut_real_length = length;
714 *mut_default_options = options;
832 const unsigned level)
839 return &default_labels[level];
847 (
"Invalid log level %u for logger %s", level,
850 return &unknown_label;
855 const char *
const label)
861 if (strcmp(label, default_labels[i].
name) == 0) {
905 memset(mut_logger, 0,
sizeof *mut_logger);
927 LMT(color, BOLD, FOREGROUND, WHITE,
"%-3ld "),
935 LMT(color, UNDERLINE, FOREGROUND, WHITE,
"%02d:%02d:%02d"),
936 info->
time.tm_hour, info->
time.tm_min, info->
time.tm_sec)
944 LMT(color, BOLD, FOREGROUND, BLACK,
"%s"),
954 LMT(color, BOLD, FOREGROUND, WHITE,
"%s"),
964 LME(
"%s",
"%s",
"%s",
"%s")
" " LMS(
965 REGULAR, FOREGROUND, YELLOW,
966 "%s")
LMS(BOLD, FOREGROUND, WHITE,
":")
967 LMS(REGULAR, FOREGROUND, WHITE,
"%d")
": ",
986static struct logmod g_logmod;
1001static struct logmod g_logmod = {
1004 sizeof(g_loggers) /
sizeof *g_loggers,
1005 sizeof(g_loggers) /
sizeof *g_loggers,
1013 const unsigned line,
1015 const unsigned level)
1018 const time_t time_raw = time(NULL);
1020 unsigned *mut_line = (
unsigned *)&info.
line;
1021 const char **mut_filename = (
const char **)&info.
filename;
1022 unsigned *mut_level = (
unsigned *)&info.
level;
1025 struct tm *mut_time = (
struct tm *)&info.
time;
1027 *mut_filename = filename;
1031 *mut_time = *localtime(&time_raw);
1038 const unsigned line,
1039 const char *
const filename,
1040 const unsigned level,
1053 va_start(args, fmt);
1054 if ((code = logger->
callback(logger, &info, fmt, args))
1063 va_start(args, fmt);
1064 if ((code = _logmod_print(
1074 va_start(args, fmt);
1075 code = _logmod_print(logger, &info, fmt, args, 0,
#define _LOGMOD_EXPECT(_cond, _error, _return)
Definition: logmod.h:635
logmod_err logmod_logger_set_id_visibility(struct logmod_logger *logger, int show_app_id, int show_context_id)
Set visibility of application ID and context ID in log messages.
Definition: logmod.h:729
logmod_err logmod_logger_set_counter(struct logmod_logger *logger, int show_counter)
Set counter display for a logger.
Definition: logmod.h:822
void(* logmod_lock)(const struct logmod_logger *logger, int should_lock)
Lock function type for thread safety.
Definition: logmod.h:148
logmod_err logmod_logger_set_color(struct logmod_logger *logger, int color)
Set color mode for a logger.
Definition: logmod.h:786
#define LOGMOD_LABEL_COLOR(_style, _visibility, _color)
Helper macro to define label color, style, and visibility at once.
Definition: logmod.h:122
#define logmod_nlog(_level, _logger, _parenthesized_params, num_params)
Log a message (C89 compatible version)
Definition: logmod.h:454
logmod_err logmod_logger_set_time(struct logmod_logger *logger, int show_time)
Set time display for a logger.
Definition: logmod.h:813
logmod_err logmod_set_lock(struct logmod *logmod, logmod_lock lock)
Set the lock function for thread safety.
Definition: logmod.h:701
long logmod_logger_get_counter(const struct logmod_logger *logger)
Get the global message counter for a logger.
Definition: logmod.h:874
#define __LOGMOD_LOGGER_ATTRS(_qualifier)
Internal macro for defining logger attributes.
Definition: logmod.h:203
logmod_err
Error codes returned by LogMod functions.
Definition: logmod.h:79
@ LOGMOD_OK
Definition: logmod.h:82
@ LOGMOD_OK_CONTINUE
Definition: logmod.h:83
@ LOGMOD_ERRNO
Definition: logmod.h:80
@ LOGMOD_BAD_PARAMETER
Definition: logmod.h:81
@ LOGMOD_OK_SKIPPED
Definition: logmod.h:84
logmod_err logmod_cleanup(struct logmod *logmod)
Clean up the logging context.
Definition: logmod.h:690
logmod_err _logmod_log(const struct logmod_logger *logger, const unsigned line, const char *const filename, const unsigned level, const char *fmt,...)
Internal logging implementation function.
Definition: logmod.h:1037
logmod_err(* logmod_callback)(const struct logmod_logger *logger, const struct logmod_info *info, const char *fmt, va_list args)
Callback function type for custom log handling.
Definition: logmod.h:161
logmod_err logmod_set_options(struct logmod *logmod, struct logmod_options options)
Set default options for all new loggers.
Definition: logmod.h:709
#define LOGMOD_FALLBACK_APPLICATION_ID
Default application ID for the fallback logger.
Definition: logmod.h:46
#define LOGMOD_FROM_LOGGER(_ctx)
Get logmod from any logmod_logger.
Definition: logmod.h:631
logmod_err logmod_logger_set_logfile(struct logmod_logger *logger, FILE *logfile)
Set logfile for a logger.
Definition: logmod.h:804
#define LOGMOD_EXPECT(_cond, _error)
Check if a condition is met and log an error message if not.
Definition: logmod.h:660
logmod_levels
Log levels supported by LogMod.
Definition: logmod.h:64
@ LOGMOD_LEVEL_WARN
Definition: logmod.h:68
@ LOGMOD_LEVEL_INFO
Definition: logmod.h:67
@ LOGMOD_LEVEL_ERROR
Definition: logmod.h:69
@ __LOGMOD_LEVEL_MAX
Definition: logmod.h:71
@ LOGMOD_LEVEL_DEBUG
Definition: logmod.h:66
@ LOGMOD_LEVEL_FATAL
Definition: logmod.h:70
@ LOGMOD_LEVEL_TRACE
Definition: logmod.h:65
@ LOGMOD_LEVEL_CUSTOM
Definition: logmod.h:73
const struct logmod_label * logmod_logger_get_label(const struct logmod_logger *logger, const unsigned level)
Get the label for a specific log level.
Definition: logmod.h:831
#define LMT
Shorthand for LOGMOD_ENCODE_TOGGLE.
Definition: logmod.h:562
logmod_err logmod_toggle_logger(struct logmod *logmod, const char *const context_id)
Toggle a specific logger from logging (default is true)
Definition: logmod.h:719
logmod_err logmod_logger_set_callback(struct logmod_logger *logger, const struct logmod_label *const custom_labels, const size_t num_custom_labels, logmod_callback callback)
Set callback function and custom labels for a logger.
Definition: logmod.h:750
logmod_err logmod_logger_set_data(struct logmod_logger *logger, void *user_data)
Set user data for a logger.
Definition: logmod.h:741
logmod_err logmod_logger_set_quiet(struct logmod_logger *logger, int quiet)
Set quiet mode for a logger.
Definition: logmod.h:777
#define LMS
Shorthand for LOGMOD_ENCODE_STATIC.
Definition: logmod.h:560
#define LME
Shorthand for LOGMOD_ENCODE.
Definition: logmod.h:566
logmod_err logmod_logger_set_level(struct logmod_logger *logger, unsigned level)
Set minimum log level for a logger.
Definition: logmod.h:795
#define LOGMOD_FALLBACK_CONTEXT_ID
Default context ID for the fallback logger.
Definition: logmod.h:55
struct logmod_logger * logmod_get_logger(struct logmod *logmod, const char *const context_id)
Get or create a logger by context ID.
Definition: logmod.h:886
#define LOGMOD_API
Define symbol visibility for LogMod API.
Definition: logmod.h:16
logmod_err logmod_logger_set_options(struct logmod_logger *logger, struct logmod_options options)
Set all options for a logger at once.
Definition: logmod.h:767
#define __BLANK
Definition: logmod.h:213
logmod_err logmod_init(struct logmod *logmod, const char *const application_id, struct logmod_logger table[], unsigned length)
Initialize the logging context.
Definition: logmod.h:670
long logmod_logger_get_level(const struct logmod_logger *logger, const char *const label)
Get the level value for a label name.
Definition: logmod.h:854
#define LOGMOD_PRINTF_LIKE(a, b)
Format string checking attribute for printf-like functions.
Definition: logmod.h:37
Information about a log entry.
Definition: logmod.h:129
const struct logmod_label *const label
Definition: logmod.h:133
const char *const filename
Definition: logmod.h:131
const unsigned level
Definition: logmod.h:132
const unsigned line
Definition: logmod.h:130
const struct tm time
Definition: logmod.h:134
Label properties for a log level.
Definition: logmod.h:107
const char *const name
Definition: logmod.h:108
const int output
Definition: logmod.h:112
const char *const color
Definition: logmod.h:111
const char *const style
Definition: logmod.h:109
const char *const visibility
Definition: logmod.h:110
Immutable logger structure.
Definition: logmod.h:229
const size_t num_custom_labels
Definition: logmod.h:230
const logmod_callback callback
Definition: logmod.h:230
const char * context_id
Definition: logmod.h:230
const struct logmod_options options
Definition: logmod.h:230
const struct logmod_label *const custom_labels
Definition: logmod.h:230
const int disabled
Definition: logmod.h:230
Mutable version of the logger structure.
Definition: logmod.h:219
int disabled
Definition: logmod.h:220
void * user_data
Definition: logmod.h:220
size_t num_custom_labels
Definition: logmod.h:220
struct logmod_options options
Definition: logmod.h:220
logmod_callback callback
Definition: logmod.h:220
const struct logmod_label * custom_labels
Definition: logmod.h:220
const char * context_id
Definition: logmod.h:220
Configuration options for a logger.
Definition: logmod.h:91
int hide_context_id
Definition: logmod.h:95
unsigned level
Definition: logmod.h:97
int hide_counter
Definition: logmod.h:99
FILE * logfile
Definition: logmod.h:92
int show_application_id
Definition: logmod.h:96
int quiet
Definition: logmod.h:93
int suppress_time
Definition: logmod.h:98
int color
Definition: logmod.h:94
Main logging context structure.
Definition: logmod.h:240
const struct logmod_options default_options
Definition: logmod.h:246
const size_t real_length
Definition: logmod.h:244
const struct logmod_logger * loggers
Definition: logmod.h:242
const char * application_id
Definition: logmod.h:241
const size_t length
Definition: logmod.h:243
logmod_lock lock
Definition: logmod.h:248
long counter
Definition: logmod.h:245