Zephyr Project API  3.3.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(0, __VA_ARGS__)
83
92#define LOG_RAW(...) Z_LOG_PRINTK(1, __VA_ARGS__)
93
106#define LOG_INST_ERR(_log_inst, ...) \
107 Z_LOG_INSTANCE(LOG_LEVEL_ERR, _log_inst, __VA_ARGS__)
108
122#define LOG_INST_WRN(_log_inst, ...) \
123 Z_LOG_INSTANCE(LOG_LEVEL_WRN, _log_inst, __VA_ARGS__)
124
137#define LOG_INST_INF(_log_inst, ...) \
138 Z_LOG_INSTANCE(LOG_LEVEL_INF, _log_inst, __VA_ARGS__)
139
152#define LOG_INST_DBG(_log_inst, ...) \
153 Z_LOG_INSTANCE(LOG_LEVEL_DBG, _log_inst, __VA_ARGS__)
154
165#define LOG_HEXDUMP_ERR(_data, _length, _str) \
166 Z_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, _str)
167
178#define LOG_HEXDUMP_WRN(_data, _length, _str) \
179 Z_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, _str)
180
190#define LOG_HEXDUMP_INF(_data, _length, _str) \
191 Z_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, _str)
192
202#define LOG_HEXDUMP_DBG(_data, _length, _str) \
203 Z_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, _str)
204
219#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
220 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
221
234#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
235 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
236
248#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
249 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
250
262#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
263 Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
264
277void z_log_vprintk(const char *fmt, va_list ap);
278
279#ifdef __cplusplus
280}
281#define LOG_IN_CPLUSPLUS 1
282#endif
283/* Macro expects that optionally on second argument local log level is provided.
284 * If provided it is returned, otherwise default log level is returned or
285 * LOG_LEVEL, if it was locally defined.
286 */
287#if !defined(CONFIG_LOG)
288#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
289#else
290#define _LOG_LEVEL_RESOLVE(...) \
291 Z_LOG_EVAL(LOG_LEVEL, \
292 (GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
293 (GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
294#endif
295
296/* Return first argument */
297#define _LOG_ARG1(arg1, ...) arg1
298
299#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
300 IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
301 const struct log_source_const_data Z_LOG_ITEM_CONST_DATA(_name) \
302 __attribute__ ((section("." STRINGIFY(Z_LOG_ITEM_CONST_DATA(_name))))) \
303 __attribute__((used)) = { \
304 .name = STRINGIFY(_name), \
305 .level = _level \
306 }
307
308#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
309 struct log_source_dynamic_data LOG_ITEM_DYNAMIC_DATA(_name) \
310 __attribute__ ((section("." STRINGIFY( \
311 LOG_ITEM_DYNAMIC_DATA(_name)))) \
312 ) \
313 __attribute__((used))
314
315#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
316 IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
317 (_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
318
319#define _LOG_MODULE_DATA_CREATE(_name, _level) \
320 _LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
321 _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
322
323/* Determine if data for the module shall be created. It is created if logging
324 * is enabled, override level is set or module specific level is set (not off).
325 */
326#define Z_DO_LOG_MODULE_REGISTER(...) \
327 Z_LOG_EVAL(CONFIG_LOG_OVERRIDE_LEVEL, \
328 (1), \
329 (Z_LOG_EVAL(_LOG_LEVEL_RESOLVE(__VA_ARGS__), (1), (0))) \
330 )
331
363#define LOG_MODULE_REGISTER(...) \
364 COND_CODE_1( \
365 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__), \
366 (_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
367 _LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
368 () \
369 ) \
370 LOG_MODULE_DECLARE(__VA_ARGS__)
371
398#define LOG_MODULE_DECLARE(...) \
399 extern const struct log_source_const_data \
400 Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)); \
401 extern struct log_source_dynamic_data \
402 LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
403 \
404 static const struct log_source_const_data * \
405 __log_current_const_data __unused = \
406 Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) ? \
407 &Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
408 NULL; \
409 \
410 static struct log_source_dynamic_data * \
411 __log_current_dynamic_data __unused = \
412 (Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) && \
413 IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
414 &LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
415 NULL; \
416 \
417 static const uint32_t __log_level __unused = \
418 _LOG_LEVEL_RESOLVE(__VA_ARGS__)
419
427#define LOG_LEVEL_SET(level) static const uint32_t __log_level __unused = \
428 Z_LOG_RESOLVED_LEVEL(level, 0)
429
430#ifdef CONFIG_LOG_CUSTOM_HEADER
431/* This include must always be at the end of log.h */
432#include <zephyr_custom_log.h>
433#endif
434
435/*
436 * Eclipse CDT or JetBrains Clion parser is sometimes confused by logging API
437 * code and freezes the whole IDE. Following lines hides LOG_x macros from them.
438 */
439#if defined(__CDT_PARSER__) || defined(__JETBRAINS_IDE__)
440#undef LOG_ERR
441#undef LOG_WRN
442#undef LOG_INF
443#undef LOG_DBG
444
445#undef LOG_HEXDUMP_ERR
446#undef LOG_HEXDUMP_WRN
447#undef LOG_HEXDUMP_INF
448#undef LOG_HEXDUMP_DBG
449
450#define LOG_ERR(...) (void) 0
451#define LOG_WRN(...) (void) 0
452#define LOG_DBG(...) (void) 0
453#define LOG_INF(...) (void) 0
454
455#define LOG_HEXDUMP_ERR(...) (void) 0
456#define LOG_HEXDUMP_WRN(...) (void) 0
457#define LOG_HEXDUMP_DBG(...) (void) 0
458#define LOG_HEXDUMP_INF(...) (void) 0
459#endif
460
465#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_H_ */