Logging
include/log.h View source View on GitHubStructs
Section titled “Structs”Governs what to print
log_dump_options
Section titled “log_dump_options” struct log_dump_options (7 fields) source
log_handle
Section titled “log_handle” struct log_handle (4 fields) source
§
void (*print)(const struct log_site *site, const struct log_record *rec, void (*print)(const char *fmt, ...) cc_printf_like(1, 2)) §
enum log_handle_flags flags §
atomic_uint32_t seen_internal §
atomic_uint64_t last_ts_internal log_record
Section titled “log_record” struct log_record (16 fields) source
log_ring_slot
Section titled “log_ring_slot” struct log_ring_slot (3 fields) source
log_ringbuf
Section titled “log_ringbuf” struct log_ringbuf (3 fields) source
log_site_options
Section titled “log_site_options” struct log_site_options (6 fields) source
Ephemeral argument passed in creation
§
char *name §
enum log_site_flags flags §
size_t capacity §
size_t msg_max_len only if LOG_SITE_DUP_MESSAGES on, will truncate trailing characters if strlen of the input fmt str is too long
§
uint32_t enabled_mask §
struct log_dump_options dump_opts log_site
Section titled “log_site” struct log_site (10 fields) source
§
char *name §
struct log_ringbuf rb §
uint32_t enabled_mask Governs what actually goes in the site
§
size_t capacity §
refcount_t refcount Only relevant for dynamic log sites
§
size_t msg_max_len §
uint32_t dropped Accumulation of all missed logs
§
enum log_site_flags flags §
struct log_dump_options dump_opts If LOG_SITE_PRINT, use this
log_handle_flags
Section titled “log_handle_flags” enum log_handle_flags : uint32_t (7 variants) source
§
LOG_HANDLE_PRINT = 1 << 0 emit to console immediately
§
LOG_HANDLE_IMPORTANT = 1 << 1 never drop / elevated visibility
§
LOG_HANDLE_RATELIMIT = 1 << 2 suppress floods
§
LOG_HANDLE_ONCE = 1 << 3 print only first occurrence
§
LOG_HANDLE_PANIC = 1 << 4 fatal if level >= ERROR
§
LOG_HANDLE_NO_NEWLINE = 1 << 5 §
LOG_HANDLE_FLAGS_DEFAULT = 0 log_level
Section titled “log_level” enum log_level : uint8_t (5 variants) source
log_site_flags
Section titled “log_site_flags” enum log_site_flags : uint32_t (7 variants) source
§
LOG_SITE_PRINT = 1 << 0 print all logs in site
§
LOG_SITE_DROP_OLD = 1 << 1 overwrite oldest on overflow
§
LOG_SITE_NO_IRQ = 1 << 2 suppress in IRQ context
§
LOG_SITE_PANIC_VISIBLE = 1 << 3 §
LOG_SITE_NDJSON = 1 << 4 emit records directly to NDJSON wire
§
LOG_SITE_NONE = 0 §
LOG_SITE_DEFAULT = LOG_SITE_DROP_OLD log_record_flags
Section titled “log_record_flags” enum log_record_flags : uint16_t (2 variants) source
Functions
Section titled “Functions”log_level_color
Section titled “log_level_color”log_handle_should_print
Section titled “log_handle_should_print”bool log_handle_should_print(
const struct log_handle *h,
const struct log_site *s,
uint8_t level
) source log_site_enabled
Section titled “log_site_enabled”log_dump_site_with_opts
Section titled “log_dump_site_with_opts”void log_dump_site_with_opts(
struct log_site * *,
struct log_dump_options opts
) source log_dump_site
Section titled “log_dump_site”log_dump_site_default
Section titled “log_dump_site_default”log_dump_all
Section titled “log_dump_all”void log_dump_all(void) source log_dump_panic
Section titled “log_dump_panic”void log_dump_panic(void) source log_sites_init
Section titled “log_sites_init”void log_sites_init(void) source log_site_free
Section titled “log_site_free”log_site_create
Section titled “log_site_create”struct log_site * log_site_create(struct log_site_options opts) source log_handle_init
Section titled “log_handle_init”void log_handle_init(struct log_handle *h, enum log_handle_flags f) source log_site_getref
Section titled “log_site_getref”log_site_putref
Section titled “log_site_putref”log_site_message_count
Section titled “log_site_message_count”Macros
Section titled “Macros”LOG_NARGS
Section titled “LOG_NARGS”#define LOG_NARGS 10 source LOG_HANDLE_DEFAULT
Section titled “LOG_HANDLE_DEFAULT”#define LOG_HANDLE_DEFAULT source Expansion
#define LOG_HANDLE_DEFAULT \
(struct log_handle){.flags = LOG_HANDLE_FLAGS_DEFAULT, \
.seen_internal = 0, \
.last_ts_internal = 0} LOG_DUMP_DEFAULT
Section titled “LOG_DUMP_DEFAULT”#define LOG_DUMP_DEFAULT source Expansion
#define LOG_DUMP_DEFAULT \
(struct log_dump_options) { \
.min_level = LOG_TRACE, .show_cpu = true, .show_tid = true, \
.show_irql = true, .show_caller = true, .resolve_symbols = true, \
.clear_after_dump = false, \
} LOG_DUMP_CONSOLE
Section titled “LOG_DUMP_CONSOLE”#define LOG_DUMP_CONSOLE source Expansion
#define LOG_DUMP_CONSOLE \
(struct log_dump_options) { \
.min_level = LOG_TRACE, .show_cpu = false, .show_tid = false, \
.show_irql = false, .show_caller = false, .resolve_symbols = false, \
.clear_after_dump = false, \
} #define log(site, handle, lvl, fmt, ...) source Expansion
#define log(site, handle, lvl, fmt, ...) \
log_emit_full(site, handle, lvl, __func__, __FILE__, __LINE__, \
(uintptr_t) ci_return_address(0), PP_NARG(__VA_ARGS__), fmt, \
##__VA_ARGS__) log_global
Section titled “log_global”#define log_global(handle, lvl, fmt, ...) source Expansion
#define log_global(handle, lvl, fmt, ...) \
log_emit_full(LOG_SITE(global), handle, lvl, __func__, __FILE__, __LINE__, \
(uintptr_t) ci_return_address(0), PP_NARG(__VA_ARGS__), fmt, \
##__VA_ARGS__) log_msg
Section titled “log_msg”#define log_msg(lvl, fmt, ...) source Expansion
#define log_msg(lvl, fmt, ...) \
log_emit_full(LOG_SITE(global), LOG_HANDLE(global), lvl, __func__, \
__FILE__, __LINE__, (uintptr_t) ci_return_address(0), \
PP_NARG(__VA_ARGS__), fmt, ##__VA_ARGS__) log_once
Section titled “log_once”#define log_once(site, handle, lvl, fmt, ...) source log_global_once
Section titled “log_global_once”#define log_global_once(handle, lvl, fmt, ...) source Expansion
#define log_global_once(handle, lvl, fmt, ...) \
log_once(LOG_SITE(global), handle, lvl, fmt, ##__VA_ARGS__) log_msg_once
Section titled “log_msg_once”#define log_msg_once(lvl, fmt, ...) source Expansion
#define log_msg_once(lvl, fmt, ...) \
log_global_once(LOG_HANDLE(global), lvl, fmt, ##__VA_ARGS__) log_err_global
Section titled “log_err_global”#define log_err_global(handle, fmt, ...) source Expansion
#define log_err_global(handle, fmt, ...) \
log_global(handle, LOG_ERROR, fmt, ##__VA_ARGS__) log_warn_global
Section titled “log_warn_global”#define log_warn_global(handle, fmt, ...) source Expansion
#define log_warn_global(handle, fmt, ...) \
log_global(handle, LOG_WARN, fmt, ##__VA_ARGS__) log_info_global
Section titled “log_info_global”#define log_info_global(handle, fmt, ...) source Expansion
#define log_info_global(handle, fmt, ...) \
log_global(handle, LOG_INFO, fmt, ##__VA_ARGS__) log_debug_global
Section titled “log_debug_global”#define log_debug_global(handle, fmt, ...) source Expansion
#define log_debug_global(handle, fmt, ...) \
log_global(handle, LOG_DEBUG, fmt, ##__VA_ARGS__) log_trace_global
Section titled “log_trace_global”#define log_trace_global(handle, fmt, ...) source Expansion
#define log_trace_global(handle, fmt, ...) \
log_global(handle, LOG_TRACE, fmt, ##__VA_ARGS__) LOG_SITE_CAPACITY_DEFAULT
Section titled “LOG_SITE_CAPACITY_DEFAULT”#define LOG_SITE_CAPACITY_DEFAULT 128 source good enough for most purposes
LOG_SITE_EXTERN
Section titled “LOG_SITE_EXTERN”#define LOG_SITE_EXTERN(name) source Expansion
#define LOG_SITE_EXTERN(name) extern struct log_site __log_site_##name For static ones
LOG_SITE_LEVEL
Section titled “LOG_SITE_LEVEL”#define LOG_SITE_LEVEL(l) source Expansion
#define LOG_SITE_LEVEL(l) (1u << l) LOG_SITE_ALL
Section titled “LOG_SITE_ALL”#define LOG_SITE_ALL UINT32_MAX source LOG_SITE_DEFINE
Section titled “LOG_SITE_DEFINE”#define LOG_SITE_DEFINE(_name, ...) source Expansion
#define LOG_SITE_DEFINE(_name, ...) \
cc_wno_override_init_start LINKER_SECTION_ATTRIBUTE(log_sites) \
struct log_site __log_site_##_name = {.capacity = \
LOG_SITE_CAPACITY_DEFAULT, \
.enabled_mask = LOG_SITE_ALL, \
.dump_opts = LOG_DUMP_CONSOLE, \
.name = #_name, \
__VA_ARGS__}; \
cc_wno_override_init_end LOG_SITE
Section titled “LOG_SITE”LOG_HANDLE_SUBSYSTEM_NONE
Section titled “LOG_HANDLE_SUBSYSTEM_NONE”#define LOG_HANDLE_SUBSYSTEM_NONE NULL source LOG_HANDLE_EXTERN
Section titled “LOG_HANDLE_EXTERN”#define LOG_HANDLE_EXTERN(name) source Expansion
#define LOG_HANDLE_EXTERN(name) extern struct log_handle __log_handle_##name LOG_HANDLE_DEFINE
Section titled “LOG_HANDLE_DEFINE”#define LOG_HANDLE_DEFINE(_name, ...) source Expansion
#define LOG_HANDLE_DEFINE(_name, ...) \
cc_wno_override_init_start struct log_handle __log_handle_##_name = { \
.seen_internal = 0, .last_ts_internal = 0, __VA_ARGS__}; \
cc_wno_override_init_end _LOG_HANDLE_DEFINE_PRINT
Section titled “_LOG_HANDLE_DEFINE_PRINT”#define _LOG_HANDLE_DEFINE_PRINT(n, storage, ...) source Expansion
#define _LOG_HANDLE_DEFINE_PRINT(n, storage, ...) \
storage struct log_handle __log_handle_##n = {.flags = LOG_HANDLE_PRINT, \
.seen_internal = 0, \
.last_ts_internal = 0, \
__VA_ARGS__} LOG_HANDLE_DEFINE_PRINT
Section titled “LOG_HANDLE_DEFINE_PRINT”#define LOG_HANDLE_DEFINE_PRINT(n, ...) source Expansion
#define LOG_HANDLE_DEFINE_PRINT(n, ...) \
cc_wno_override_init_start _LOG_HANDLE_DEFINE_PRINT(n, , __VA_ARGS__); \
cc_wno_override_init_end LOG_HANDLE_DEFINE_PRINT_STATIC
Section titled “LOG_HANDLE_DEFINE_PRINT_STATIC”#define LOG_HANDLE_DEFINE_PRINT_STATIC(n, ...) source Expansion
#define LOG_HANDLE_DEFINE_PRINT_STATIC(n, ...) \
cc_wno_override_init_start _LOG_HANDLE_DEFINE_PRINT(n, static, \
__VA_ARGS__); \
cc_wno_override_init_end LOG_HANDLE
Section titled “LOG_HANDLE”#define LOG_HANDLE(name) source Expansion
#define LOG_HANDLE(name) &(__log_handle_##name)