Zephyr API Documentation  3.6.0
A Scalable Open Source RTOS
3.6.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
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
42#define LOG_ERR(...) Z_LOG(LOG_LEVEL_ERR, __VA_ARGS__)
43
53#define LOG_WRN(...) Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__)
54
63#define LOG_INF(...) Z_LOG(LOG_LEVEL_INF, __VA_ARGS__)
64
73#define LOG_DBG(...) Z_LOG(LOG_LEVEL_DBG, __VA_ARGS__)
74
84#define LOG_PRINTK(...) Z_LOG_PRINTK(0, __VA_ARGS__)
85
94#define LOG_RAW(...) Z_LOG_PRINTK(1, __VA_ARGS__)
95
108#define LOG_INST_ERR(_log_inst, ...) \
109 Z_LOG_INSTANCE(LOG_LEVEL_ERR, _log_inst, __VA_ARGS__)
110
124#define LOG_INST_WRN(_log_inst, ...) \
125 Z_LOG_INSTANCE(LOG_LEVEL_WRN, _log_inst, __VA_ARGS__)
126
139#define LOG_INST_INF(_log_inst, ...) \
140 Z_LOG_INSTANCE(LOG_LEVEL_INF, _log_inst, __VA_ARGS__)
141
154#define LOG_INST_DBG(_log_inst, ...) \
155 Z_LOG_INSTANCE(LOG_LEVEL_DBG, _log_inst, __VA_ARGS__)
156
167#define LOG_HEXDUMP_ERR(_data, _length, _str) \
168 Z_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, _str)
169
180#define LOG_HEXDUMP_WRN(_data, _length, _str) \
181 Z_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, _str)
182
192#define LOG_HEXDUMP_INF(_data, _length, _str) \
193 Z_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, _str)
194
204#define LOG_HEXDUMP_DBG(_data, _length, _str) \
205 Z_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, _str)
206
221#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
222 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
223
236#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
237 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
238
250#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
251 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
252
264#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
265 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
266
279void z_log_vprintk(const char *fmt, va_list ap);
280
281#ifdef __cplusplus
282}
283#define LOG_IN_CPLUSPLUS 1
284#endif
285/* Macro expects that optionally on second argument local log level is provided.
286 * If provided it is returned, otherwise default log level is returned or
287 * LOG_LEVEL, if it was locally defined.
288 */
289#if !defined(CONFIG_LOG)
290#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
291#else
292#define _LOG_LEVEL_RESOLVE(...) \
293 Z_LOG_EVAL(COND_CODE_0(LOG_LEVEL, (1), (LOG_LEVEL)), \
294 (GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
295 (GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
296#endif
297
298/* Return first argument */
299#define _LOG_ARG1(arg1, ...) arg1
300
301#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
302 IF_ENABLED(CONFIG_LOG_FMT_SECTION, ( \
303 static const char UTIL_CAT(_name, _str)[] \
304 __in_section(_log_strings, static, _CONCAT(_name, _)) __used __noasan = \
305 STRINGIFY(_name);)) \
306 IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
307 const STRUCT_SECTION_ITERABLE_ALTERNATE(log_const, \
308 log_source_const_data, \
309 Z_LOG_ITEM_CONST_DATA(_name)) = \
310 { \
311 .name = COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
312 (UTIL_CAT(_name, _str)), (STRINGIFY(_name))), \
313 .level = _level \
314 }
315
316#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
317 STRUCT_SECTION_ITERABLE_ALTERNATE(log_dynamic, log_source_dynamic_data, \
318 LOG_ITEM_DYNAMIC_DATA(_name))
319
320#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
321 IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
322 (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
323
324#define _LOG_MODULE_DATA_CREATE(_name, _level) \
325 _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
326 _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
327
328/* Determine if data for the module shall be created. It is created if logging
329 * is enabled, override level is set or module specific level is set (not off).
330 */
331#define Z_DO_LOG_MODULE_REGISTER(...) \
332 COND_CODE_1(CONFIG_LOG, \
333 (Z_LOG_EVAL(CONFIG_LOG_OVERRIDE_LEVEL, \
334 (1), \
335 (Z_LOG_EVAL(_LOG_LEVEL_RESOLVE(__VA_ARGS__), (1), (0))) \
336 )), (0))
337
369#define LOG_MODULE_REGISTER(...) \
370 COND_CODE_1( \
371 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__), \
372 (_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
373 _LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
374 () \
375 ) \
376 LOG_MODULE_DECLARE(__VA_ARGS__)
377
404#define LOG_MODULE_DECLARE(...) \
405 extern const struct log_source_const_data \
406 Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)); \
407 extern struct log_source_dynamic_data \
408 LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
409 \
410 static const struct log_source_const_data * \
411 __log_current_const_data __unused = \
412 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) ? \
413 &Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
414 NULL; \
415 \
416 static struct log_source_dynamic_data * \
417 __log_current_dynamic_data __unused = \
418 (Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) && \
419 IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
420 &LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
421 NULL; \
422 \
423 static const uint32_t __log_level __unused = \
424 _LOG_LEVEL_RESOLVE(__VA_ARGS__)
425
433#define LOG_LEVEL_SET(level) static const uint32_t __log_level __unused = \
434 Z_LOG_RESOLVED_LEVEL(level, 0)
435
436#ifdef CONFIG_LOG_CUSTOM_HEADER
437/* This include must always be at the end of log.h */
438#include <zephyr_custom_log.h>
439#endif
440
441/*
442 * Eclipse CDT or JetBrains Clion parser is sometimes confused by logging API
443 * code and freezes the whole IDE. Following lines hides LOG_x macros from them.
444 */
445#if defined(__CDT_PARSER__) || defined(__JETBRAINS_IDE__)
446#undef LOG_ERR
447#undef LOG_WRN
448#undef LOG_INF
449#undef LOG_DBG
450
451#undef LOG_HEXDUMP_ERR
452#undef LOG_HEXDUMP_WRN
453#undef LOG_HEXDUMP_INF
454#undef LOG_HEXDUMP_DBG
455
456#define LOG_ERR(...) (void) 0
457#define LOG_WRN(...) (void) 0
458#define LOG_DBG(...) (void) 0
459#define LOG_INF(...) (void) 0
460
461#define LOG_HEXDUMP_ERR(...) (void) 0
462#define LOG_HEXDUMP_WRN(...) (void) 0
463#define LOG_HEXDUMP_DBG(...) (void) 0
464#define LOG_HEXDUMP_INF(...) (void) 0
465#endif
466
471#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_H_ */