Zephyr Project API  3.1.0
A Scalable Open Source RTOS
log.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_H_
8#define ZEPHYR_INCLUDE_LOGGING_LOG_H_
9
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
40#define LOG_ERR(...) Z_LOG(LOG_LEVEL_ERR, __VA_ARGS__)
41
51#define LOG_WRN(...) Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__)
52
61#define LOG_INF(...) Z_LOG(LOG_LEVEL_INF, __VA_ARGS__)
62
71#define LOG_DBG(...) Z_LOG(LOG_LEVEL_DBG, __VA_ARGS__)
72
82#define LOG_PRINTK(...) Z_LOG_PRINTK(__VA_ARGS__)
83
96#define LOG_INST_ERR(_log_inst, ...) \
97 Z_LOG_INSTANCE(LOG_LEVEL_ERR, _log_inst, __VA_ARGS__)
98
112#define LOG_INST_WRN(_log_inst, ...) \
113 Z_LOG_INSTANCE(LOG_LEVEL_WRN, _log_inst, __VA_ARGS__)
114
127#define LOG_INST_INF(_log_inst, ...) \
128 Z_LOG_INSTANCE(LOG_LEVEL_INF, _log_inst, __VA_ARGS__)
129
142#define LOG_INST_DBG(_log_inst, ...) \
143 Z_LOG_INSTANCE(LOG_LEVEL_DBG, _log_inst, __VA_ARGS__)
144
155#define LOG_HEXDUMP_ERR(_data, _length, _str) \
156 Z_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, _str)
157
168#define LOG_HEXDUMP_WRN(_data, _length, _str) \
169 Z_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, _str)
170
180#define LOG_HEXDUMP_INF(_data, _length, _str) \
181 Z_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, _str)
182
192#define LOG_HEXDUMP_DBG(_data, _length, _str) \
193 Z_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, _str)
194
209#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
210 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
211
224#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
225 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
226
238#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
239 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
240
252#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
253 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
254
268void z_log_vprintk(const char *fmt, va_list ap);
269
287char *z_log_strdup(const char *str);
288static inline char *log_strdup(const char *str)
289{
290 if (IS_ENABLED(CONFIG_LOG_MODE_MINIMAL) ||
291 IS_ENABLED(CONFIG_LOG_FRONTEND) ||
292 IS_ENABLED(CONFIG_LOG2)) {
293 return (char *)str;
294 }
295
296 return z_log_strdup(str);
297}
298
299#ifdef __cplusplus
300}
301#define LOG_IN_CPLUSPLUS 1
302#endif
303/* Macro expects that optionally on second argument local log level is provided.
304 * If provided it is returned, otherwise default log level is returned or
305 * LOG_LEVEL, if it was locally defined.
306 */
307#if !defined(CONFIG_LOG)
308#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
309#else
310#define _LOG_LEVEL_RESOLVE(...) \
311 Z_LOG_EVAL(LOG_LEVEL, \
312 (GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
313 (GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
314#endif
315
316/* Return first argument */
317#define _LOG_ARG1(arg1, ...) arg1
318
319#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
320 IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
321 const struct log_source_const_data Z_LOG_ITEM_CONST_DATA(_name) \
322 __attribute__ ((section("." STRINGIFY(Z_LOG_ITEM_CONST_DATA(_name))))) \
323 __attribute__((used)) = { \
324 .name = STRINGIFY(_name), \
325 .level = _level \
326 }
327
328#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
329 struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(_name) \
330 __attribute__ ((section("." STRINGIFY( \
331 LOG_ITEM_DYNAMIC_DATA(_name)))) \
332 ) \
333 __attribute__((used))
334
335#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
336 IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
337 (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
338
339#define _LOG_MODULE_DATA_CREATE(_name, _level) \
340 _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
341 _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
342
343/* Determine if data for the module shall be created. It is created if logging
344 * is enabled, override level is set or module specific level is set (not off).
345 */
346#define Z_DO_LOG_MODULE_REGISTER(...) \
347 Z_LOG_EVAL(CONFIG_LOG_OVERRIDE_LEVEL, \
348 (1), \
349 (Z_LOG_EVAL(_LOG_LEVEL_RESOLVE(__VA_ARGS__), (1), (0))) \
350 )
351
383#define LOG_MODULE_REGISTER(...) \
384 COND_CODE_1( \
385 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__), \
386 (_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
387 _LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
388 () \
389 ) \
390 LOG_MODULE_DECLARE(__VA_ARGS__)
391
418#define LOG_MODULE_DECLARE(...) \
419 extern const struct log_source_const_data \
420 Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)); \
421 extern struct log_source_dynamic_data \
422 LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
423 \
424 static const struct log_source_const_data * \
425 __log_current_const_data __unused = \
426 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) ? \
427 &Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
428 NULL; \
429 \
430 static struct log_source_dynamic_data * \
431 __log_current_dynamic_data __unused = \
432 (Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) && \
433 IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
434 &LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
435 NULL; \
436 \
437 static const uint32_t __log_level __unused = \
438 _LOG_LEVEL_RESOLVE(__VA_ARGS__)
439
447#define LOG_LEVEL_SET(level) static const uint32_t __log_level __unused = \
448 Z_LOG_RESOLVED_LEVEL(level, 0)
449
450/*
451 * Eclipse CDT parser is sometimes confused by logging API code and freezes the
452 * whole IDE. Following lines hides LOG_x macros from CDT.
453 */
454#if defined(__CDT_PARSER__)
455#undef LOG_ERR
456#undef LOG_WRN
457#undef LOG_INF
458#undef LOG_DBG
459
460#undef LOG_HEXDUMP_ERR
461#undef LOG_HEXDUMP_WRN
462#undef LOG_HEXDUMP_INF
463#undef LOG_HEXDUMP_DBG
464
465#define LOG_ERR(...) (void) 0
466#define LOG_WRN(...) (void) 0
467#define LOG_DBG(...) (void) 0
468#define LOG_INF(...) (void) 0
469
470#define LOG_HEXDUMP_ERR(...) (void) 0
471#define LOG_HEXDUMP_WRN(...) (void) 0
472#define LOG_HEXDUMP_DBG(...) (void) 0
473#define LOG_HEXDUMP_INF(...) (void) 0
474#endif
475
480#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_H_ */
static char * log_strdup(const char *str)
Definition: log.h:288
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition: util_macro.h:101