Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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
11#include <logging/log_core.h>
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) || IS_ENABLED(CONFIG_LOG2)) {
291 return (char *)str;
292 }
293
294 return z_log_strdup(str);
295}
296
297#ifdef __cplusplus
298}
299#define LOG_IN_CPLUSPLUS 1
300#endif
301/* Macro expects that optionally on second argument local log level is provided.
302 * If provided it is returned, otherwise default log level is returned or
303 * LOG_LEVEL, if it was locally defined.
304 */
305#if !defined(CONFIG_LOG)
306#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
307#else
308#define _LOG_LEVEL_RESOLVE(...) \
309 Z_LOG_EVAL(LOG_LEVEL, \
310 (GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
311 (GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
312#endif
313
314/* Return first argument */
315#define _LOG_ARG1(arg1, ...) arg1
316
317#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
318 IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
319 const struct log_source_const_data Z_LOG_ITEM_CONST_DATA(_name) \
320 __attribute__ ((section("." STRINGIFY(Z_LOG_ITEM_CONST_DATA(_name))))) \
321 __attribute__((used)) = { \
322 .name = STRINGIFY(_name), \
323 .level = _level \
324 }
325
326#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
327 struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(_name) \
328 __attribute__ ((section("." STRINGIFY( \
329 LOG_ITEM_DYNAMIC_DATA(_name)))) \
330 ) \
331 __attribute__((used))
332
333#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
334 IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
335 (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
336
337#define _LOG_MODULE_DATA_CREATE(_name, _level) \
338 _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
339 _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
340
373#define LOG_MODULE_REGISTER(...) \
374 Z_LOG_EVAL( \
375 _LOG_LEVEL_RESOLVE(__VA_ARGS__), \
376 (_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
377 _LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
378 ()/*Empty*/ \
379 ) \
380 LOG_MODULE_DECLARE(__VA_ARGS__)
381
408#define LOG_MODULE_DECLARE(...) \
409 extern const struct log_source_const_data \
410 Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)); \
411 extern struct log_source_dynamic_data \
412 LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
413 \
414 static const struct log_source_const_data * \
415 __log_current_const_data __unused = \
416 _LOG_LEVEL_RESOLVE(__VA_ARGS__) ? \
417 &Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
418 NULL; \
419 \
420 static struct log_source_dynamic_data * \
421 __log_current_dynamic_data __unused = \
422 (_LOG_LEVEL_RESOLVE(__VA_ARGS__) && \
423 IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
424 &LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
425 NULL; \
426 \
427 static const uint32_t __log_level __unused = \
428 _LOG_LEVEL_RESOLVE(__VA_ARGS__)
429
437#define LOG_LEVEL_SET(level) static const uint32_t __log_level __unused = \
438 Z_LOG_RESOLVED_LEVEL(level, 0)
439
440/*
441 * Eclipse CDT parser is sometimes confused by logging API code and freezes the
442 * whole IDE. Following lines hides LOG_x macros from CDT.
443 */
444#if defined(__CDT_PARSER__)
445#undef LOG_ERR
446#undef LOG_WRN
447#undef LOG_INF
448#undef LOG_DBG
449
450#undef LOG_HEXDUMP_ERR
451#undef LOG_HEXDUMP_WRN
452#undef LOG_HEXDUMP_INF
453#undef LOG_HEXDUMP_DBG
454
455#define LOG_ERR(...) (void) 0
456#define LOG_WRN(...) (void) 0
457#define LOG_DBG(...) (void) 0
458#define LOG_INF(...) (void) 0
459
460#define LOG_HEXDUMP_ERR(...) (void) 0
461#define LOG_HEXDUMP_WRN(...) (void) 0
462#define LOG_HEXDUMP_DBG(...) (void) 0
463#define LOG_HEXDUMP_INF(...) (void) 0
464#endif
465
470#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