13#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_H_
14#define ZEPHYR_INCLUDE_LOGGING_LOG_H_
22#if defined(CONFIG_USERSPACE) && defined(CONFIG_LOG_ALWAYS_RUNTIME)
26#ifdef CONFIG_LOG_RATELIMIT
65#define LOG_ERR(...) Z_LOG(LOG_LEVEL_ERR, __VA_ARGS__)
76#define LOG_WRN(...) Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__)
86#define LOG_INF(...) Z_LOG(LOG_LEVEL_INF, __VA_ARGS__)
96#define LOG_DBG(...) Z_LOG(LOG_LEVEL_DBG, __VA_ARGS__)
107#define LOG_WRN_ONCE(...) \
109 static atomic_t __warned; \
110 if (unlikely(atomic_cas(&__warned, 0, 1))) { \
111 Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__); \
137#ifdef CONFIG_LOG_RATELIMIT
138#define LOG_RATELIMIT_INTERVAL_MS CONFIG_LOG_RATELIMIT_INTERVAL_MS
140#define LOG_RATELIMIT_INTERVAL_MS 0
155#define _LOG_RATELIMIT_CORE(_level, _rate_ms, ...) \
157 static atomic_t __last_log_time; \
158 static atomic_t __skipped_count; \
159 uint32_t __now = k_uptime_get_32(); \
160 uint32_t __last = atomic_get(&__last_log_time); \
161 uint32_t __diff = __now - __last; \
162 if (unlikely(__diff >= (_rate_ms))) { \
163 if (atomic_cas(&__last_log_time, __last, __now)) { \
164 uint32_t __skipped = atomic_clear(&__skipped_count); \
165 if (__skipped > 0) { \
166 Z_LOG(_level, "Skipped %d messages", __skipped); \
168 Z_LOG(_level, __VA_ARGS__); \
170 atomic_inc(&__skipped_count); \
173 atomic_inc(&__skipped_count); \
188#define _LOG_RATELIMIT_LVL(_level, _rate_ms, ...) \
190 if (IS_ENABLED(CONFIG_LOG_RATELIMIT)) { \
191 _LOG_RATELIMIT_CORE(_level, _rate_ms, __VA_ARGS__); \
192 } else if (IS_ENABLED(CONFIG_LOG_RATELIMIT_FALLBACK_DROP)) { \
195 Z_LOG(_level, __VA_ARGS__); \
209#define LOG_WRN_RATELIMIT(...) \
210 _LOG_RATELIMIT_LVL(LOG_LEVEL_WRN, LOG_RATELIMIT_INTERVAL_MS, __VA_ARGS__)
223#define LOG_ERR_RATELIMIT(...) \
224 _LOG_RATELIMIT_LVL(LOG_LEVEL_ERR, LOG_RATELIMIT_INTERVAL_MS, __VA_ARGS__)
236#define LOG_INF_RATELIMIT(...) \
237 _LOG_RATELIMIT_LVL(LOG_LEVEL_INF, LOG_RATELIMIT_INTERVAL_MS, __VA_ARGS__)
249#define LOG_DBG_RATELIMIT(...) \
250 _LOG_RATELIMIT_LVL(LOG_LEVEL_DBG, LOG_RATELIMIT_INTERVAL_MS, __VA_ARGS__)
266#define _LOG_HEXDUMP_RATELIMIT_CORE(_level, _rate_ms, _data, _length, _str) \
268 static atomic_t __last_log_time; \
269 static atomic_t __skipped_count; \
270 uint32_t __now = k_uptime_get_32(); \
271 uint32_t __last = atomic_get(&__last_log_time); \
272 uint32_t __diff = __now - __last; \
273 if (unlikely(__diff >= (_rate_ms))) { \
274 if (atomic_cas(&__last_log_time, __last, __now)) { \
275 uint32_t __skipped = atomic_clear(&__skipped_count); \
276 if (__skipped > 0) { \
277 Z_LOG(_level, "Skipped %d hexdump messages", __skipped); \
279 Z_LOG_HEXDUMP(_level, _data, _length, _str); \
281 atomic_inc(&__skipped_count); \
284 atomic_inc(&__skipped_count); \
301#define _LOG_HEXDUMP_RATELIMIT_LVL(_level, _rate_ms, _data, _length, _str) \
303 if (IS_ENABLED(CONFIG_LOG_RATELIMIT)) { \
304 _LOG_HEXDUMP_RATELIMIT_CORE(_level, _rate_ms, _data, _length, _str); \
305 } else if (IS_ENABLED(CONFIG_LOG_RATELIMIT_FALLBACK_DROP)) { \
308 Z_LOG_HEXDUMP(_level, _data, _length, _str); \
324#define LOG_HEXDUMP_ERR_RATELIMIT(_data, _length, _str) \
325 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_ERR, LOG_RATELIMIT_INTERVAL_MS, _data, _length, _str)
339#define LOG_HEXDUMP_WRN_RATELIMIT(_data, _length, _str) \
340 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_WRN, LOG_RATELIMIT_INTERVAL_MS, _data, _length, _str)
353#define LOG_HEXDUMP_INF_RATELIMIT(_data, _length, _str) \
354 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_INF, LOG_RATELIMIT_INTERVAL_MS, _data, _length, _str)
367#define LOG_HEXDUMP_DBG_RATELIMIT(_data, _length, _str) \
368 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_DBG, LOG_RATELIMIT_INTERVAL_MS, _data, _length, _str)
381#define LOG_ERR_RATELIMIT_RATE(_rate_ms, ...) \
382 _LOG_RATELIMIT_LVL(LOG_LEVEL_ERR, _rate_ms, __VA_ARGS__)
395#define LOG_WRN_RATELIMIT_RATE(_rate_ms, ...) \
396 _LOG_RATELIMIT_LVL(LOG_LEVEL_WRN, _rate_ms, __VA_ARGS__)
409#define LOG_INF_RATELIMIT_RATE(_rate_ms, ...) \
410 _LOG_RATELIMIT_LVL(LOG_LEVEL_INF, _rate_ms, __VA_ARGS__)
423#define LOG_DBG_RATELIMIT_RATE(_rate_ms, ...) \
424 _LOG_RATELIMIT_LVL(LOG_LEVEL_DBG, _rate_ms, __VA_ARGS__)
438#define LOG_HEXDUMP_ERR_RATELIMIT_RATE(_rate_ms, _data, _length, _str) \
439 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_ERR, _rate_ms, _data, _length, _str)
453#define LOG_HEXDUMP_WRN_RATELIMIT_RATE(_rate_ms, _data, _length, _str) \
454 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_WRN, _rate_ms, _data, _length, _str)
468#define LOG_HEXDUMP_INF_RATELIMIT_RATE(_rate_ms, _data, _length, _str) \
469 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_INF, _rate_ms, _data, _length, _str)
483#define LOG_HEXDUMP_DBG_RATELIMIT_RATE(_rate_ms, _data, _length, _str) \
484 _LOG_HEXDUMP_RATELIMIT_LVL(LOG_LEVEL_DBG, _rate_ms, _data, _length, _str)
502#define LOG_PRINTK(...) Z_LOG_PRINTK(0, __VA_ARGS__)
512#define LOG_RAW(...) Z_LOG_PRINTK(1, __VA_ARGS__)
533#define LOG_INST_ERR(_log_inst, ...) Z_LOG_INSTANCE(LOG_LEVEL_ERR, _log_inst, __VA_ARGS__)
548#define LOG_INST_WRN(_log_inst, ...) Z_LOG_INSTANCE(LOG_LEVEL_WRN, _log_inst, __VA_ARGS__)
562#define LOG_INST_INF(_log_inst, ...) Z_LOG_INSTANCE(LOG_LEVEL_INF, _log_inst, __VA_ARGS__)
576#define LOG_INST_DBG(_log_inst, ...) Z_LOG_INSTANCE(LOG_LEVEL_DBG, _log_inst, __VA_ARGS__)
595#define LOG_HEXDUMP_ERR(_data, _length, _str) Z_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, (_str))
607#define LOG_HEXDUMP_WRN(_data, _length, _str) Z_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, (_str))
618#define LOG_HEXDUMP_INF(_data, _length, _str) Z_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, (_str))
629#define LOG_HEXDUMP_DBG(_data, _length, _str) Z_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, (_str))
652#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
653 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
667#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
668 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
681#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
682 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
695#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
696 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
712void z_log_vprintk(
const char *fmt, va_list ap);
716#define LOG_IN_CPLUSPLUS 1
722#if !defined(CONFIG_LOG)
723#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
725#define _LOG_LEVEL_RESOLVE(...) \
726 Z_LOG_EVAL(COND_CODE_0(LOG_LEVEL, (1), (LOG_LEVEL)), \
727 (GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
728 (GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
732#define _LOG_ARG1(arg1, ...) arg1
734#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
735 IF_ENABLED(CONFIG_LOG_FMT_SECTION, ( \
736 static const char UTIL_CAT(_name, _str)[] \
737 __in_section(_log_strings, static, _CONCAT(_name, _)) __used __noasan = \
738 STRINGIFY(_name);)) \
739 IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
740 const STRUCT_SECTION_ITERABLE_ALTERNATE(log_const, log_source_const_data, \
741 Z_LOG_ITEM_CONST_DATA(_name)) = { \
742 .name = COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
743 (UTIL_CAT(_name, _str)), (STRINGIFY(_name))), .level = (_level)}
745#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
746 STRUCT_SECTION_ITERABLE_ALTERNATE(log_dynamic, log_source_dynamic_data, \
747 LOG_ITEM_DYNAMIC_DATA(_name))
749#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
750 IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
751 (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
753#define _LOG_MODULE_DATA_CREATE(_name, _level) \
754 _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
755 _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
760#define Z_DO_LOG_MODULE_REGISTER(...) \
761 COND_CODE_1(CONFIG_LOG, \
762 (Z_LOG_EVAL(CONFIG_LOG_OVERRIDE_LEVEL, \
764 (Z_LOG_EVAL(_LOG_LEVEL_RESOLVE(__VA_ARGS__), (1), (0))) \
770#if defined(CONFIG_USERSPACE) && defined(CONFIG_LOG_ALWAYS_RUNTIME)
772#define Z_LOG_MODULE_PARTITION(_k_app_mem) _k_app_mem(k_log_partition)
774#define Z_LOG_MODULE_PARTITION(_k_app_mem)
813#define LOG_MODULE_REGISTER(...) \
815 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__), \
816 (_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
817 _LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
820 LOG_MODULE_DECLARE(__VA_ARGS__)
848#define LOG_MODULE_DECLARE(...) \
849 extern const struct log_source_const_data Z_LOG_ITEM_CONST_DATA( \
850 GET_ARG_N(1, __VA_ARGS__)); \
851 extern struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
853 Z_LOG_MODULE_PARTITION(K_APP_DMEM) \
854 static const struct log_source_const_data *__log_current_const_data __unused = \
855 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) \
856 ? &Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) \
859 Z_LOG_MODULE_PARTITION(K_APP_DMEM) \
860 static struct log_source_dynamic_data *__log_current_dynamic_data __unused = \
861 (Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) && \
862 IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) \
863 ? &LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) \
866 Z_LOG_MODULE_PARTITION(K_APP_BMEM) \
867 static const uint32_t __log_level __unused = _LOG_LEVEL_RESOLVE(__VA_ARGS__)
876#define LOG_LEVEL_SET(level) \
877 static const uint32_t __log_level __unused = Z_LOG_RESOLVED_LEVEL(level, 0)
881#ifdef CONFIG_LOG_CUSTOM_HEADER
883#include <zephyr_custom_log.h>
890#if defined(__CDT_PARSER__) || defined(__JETBRAINS_IDE__)
896#undef LOG_HEXDUMP_ERR
897#undef LOG_HEXDUMP_WRN
898#undef LOG_HEXDUMP_INF
899#undef LOG_HEXDUMP_DBG
901#define LOG_ERR(...) (void)0
902#define LOG_WRN(...) (void)0
903#define LOG_DBG(...) (void)0
904#define LOG_INF(...) (void)0
906#define LOG_HEXDUMP_ERR(...) (void)0
907#define LOG_HEXDUMP_WRN(...) (void)0
908#define LOG_HEXDUMP_DBG(...) (void)0
909#define LOG_HEXDUMP_INF(...) (void)0
911#undef LOG_ERR_RATELIMIT
912#undef LOG_WRN_RATELIMIT
913#undef LOG_INF_RATELIMIT
914#undef LOG_DBG_RATELIMIT
916#undef LOG_ERR_RATELIMIT_RATE
917#undef LOG_WRN_RATELIMIT_RATE
918#undef LOG_INF_RATELIMIT_RATE
919#undef LOG_DBG_RATELIMIT_RATE
921#undef LOG_HEXDUMP_ERR_RATELIMIT
922#undef LOG_HEXDUMP_WRN_RATELIMIT
923#undef LOG_HEXDUMP_INF_RATELIMIT
924#undef LOG_HEXDUMP_DBG_RATELIMIT
926#undef LOG_HEXDUMP_ERR_RATELIMIT_RATE
927#undef LOG_HEXDUMP_WRN_RATELIMIT_RATE
928#undef LOG_HEXDUMP_INF_RATELIMIT_RATE
929#undef LOG_HEXDUMP_DBG_RATELIMIT_RATE
931#define LOG_ERR_RATELIMIT(...) (void)0
932#define LOG_WRN_RATELIMIT(...) (void)0
933#define LOG_INF_RATELIMIT(...) (void)0
934#define LOG_DBG_RATELIMIT(...) (void)0
936#define LOG_HEXDUMP_ERR_RATELIMIT(...) (void)0
937#define LOG_HEXDUMP_WRN_RATELIMIT(...) (void)0
938#define LOG_HEXDUMP_INF_RATELIMIT(...) (void)0
939#define LOG_HEXDUMP_DBG_RATELIMIT(...) (void)0
941#define LOG_ERR_RATELIMIT_RATE(...) (void)0
942#define LOG_WRN_RATELIMIT_RATE(...) (void)0
943#define LOG_INF_RATELIMIT_RATE(...) (void)0
944#define LOG_DBG_RATELIMIT_RATE(...) (void)0
946#define LOG_HEXDUMP_ERR_RATELIMIT_RATE(...) (void)0
947#define LOG_HEXDUMP_WRN_RATELIMIT_RATE(...) (void)0
948#define LOG_HEXDUMP_INF_RATELIMIT_RATE(...) (void)0
949#define LOG_HEXDUMP_DBG_RATELIMIT_RATE(...) (void)0
Header file for the logging core.
Header file for log instance registration.
Memory Partition.
Definition mem_domain.h:55
Header file for the Atomic operations API.
Iterable sections helpers.