Zephyr Project API
4.1.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
10
#include <
zephyr/logging/log_instance.h
>
11
#include <
zephyr/logging/log_core.h
>
12
#include <
zephyr/sys/iterable_sections.h
>
13
14
#if CONFIG_USERSPACE && CONFIG_LOG_ALWAYS_RUNTIME
15
#include <
zephyr/app_memory/app_memdomain.h
>
16
#endif
17
18
#ifdef __cplusplus
19
extern
"C"
{
20
#endif
21
48
#define LOG_ERR(...) Z_LOG(LOG_LEVEL_ERR, __VA_ARGS__)
49
59
#define LOG_WRN(...) Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__)
60
69
#define LOG_INF(...) Z_LOG(LOG_LEVEL_INF, __VA_ARGS__)
70
79
#define LOG_DBG(...) Z_LOG(LOG_LEVEL_DBG, __VA_ARGS__)
80
90
#define LOG_WRN_ONCE(...) \
91
do { \
92
static uint8_t __warned; \
93
if (unlikely(__warned == 0)) { \
94
Z_LOG(LOG_LEVEL_WRN, __VA_ARGS__); \
95
__warned = 1; \
96
} \
97
} while (0)
98
108
#define LOG_PRINTK(...) Z_LOG_PRINTK(0, __VA_ARGS__)
109
118
#define LOG_RAW(...) Z_LOG_PRINTK(1, __VA_ARGS__)
119
132
#define LOG_INST_ERR(_log_inst, ...) \
133
Z_LOG_INSTANCE(LOG_LEVEL_ERR, _log_inst, __VA_ARGS__)
134
148
#define LOG_INST_WRN(_log_inst, ...) \
149
Z_LOG_INSTANCE(LOG_LEVEL_WRN, _log_inst, __VA_ARGS__)
150
163
#define LOG_INST_INF(_log_inst, ...) \
164
Z_LOG_INSTANCE(LOG_LEVEL_INF, _log_inst, __VA_ARGS__)
165
178
#define LOG_INST_DBG(_log_inst, ...) \
179
Z_LOG_INSTANCE(LOG_LEVEL_DBG, _log_inst, __VA_ARGS__)
180
191
#define LOG_HEXDUMP_ERR(_data, _length, _str) \
192
Z_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, (_str))
193
204
#define LOG_HEXDUMP_WRN(_data, _length, _str) \
205
Z_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, (_str))
206
216
#define LOG_HEXDUMP_INF(_data, _length, _str) \
217
Z_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, (_str))
218
228
#define LOG_HEXDUMP_DBG(_data, _length, _str) \
229
Z_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, (_str))
230
245
#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
246
Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
247
260
#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
261
Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
262
274
#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
275
Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
276
288
#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
289
Z_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
290
303
void
z_log_vprintk(
const
char
*fmt, va_list ap);
304
305
#ifdef __cplusplus
306
}
307
#define LOG_IN_CPLUSPLUS 1
308
#endif
309
/* Macro expects that optionally on second argument local log level is provided.
310
* If provided it is returned, otherwise default log level is returned or
311
* LOG_LEVEL, if it was locally defined.
312
*/
313
#if !defined(CONFIG_LOG)
314
#define _LOG_LEVEL_RESOLVE(...) LOG_LEVEL_NONE
315
#else
316
#define _LOG_LEVEL_RESOLVE(...) \
317
Z_LOG_EVAL(COND_CODE_0(LOG_LEVEL, (1), (LOG_LEVEL)), \
318
(GET_ARG_N(2, __VA_ARGS__, LOG_LEVEL)), \
319
(GET_ARG_N(2, __VA_ARGS__, CONFIG_LOG_DEFAULT_LEVEL)))
320
#endif
321
322
/* Return first argument */
323
#define _LOG_ARG1(arg1, ...) arg1
324
325
#define _LOG_MODULE_CONST_DATA_CREATE(_name, _level) \
326
IF_ENABLED(CONFIG_LOG_FMT_SECTION, ( \
327
static const char UTIL_CAT(_name, _str)[] \
328
__in_section(_log_strings, static, _CONCAT(_name, _)) __used __noasan = \
329
STRINGIFY(_name);)) \
330
IF_ENABLED(LOG_IN_CPLUSPLUS, (extern)) \
331
const STRUCT_SECTION_ITERABLE_ALTERNATE(log_const, \
332
log_source_const_data, \
333
Z_LOG_ITEM_CONST_DATA(_name)) = \
334
{ \
335
.name = COND_CODE_1(CONFIG_LOG_FMT_SECTION, \
336
(UTIL_CAT(_name, _str)), (STRINGIFY(_name))), \
337
.level = (_level) \
338
}
339
340
#define _LOG_MODULE_DYNAMIC_DATA_CREATE(_name) \
341
STRUCT_SECTION_ITERABLE_ALTERNATE(log_dynamic, log_source_dynamic_data, \
342
LOG_ITEM_DYNAMIC_DATA(_name))
343
344
#define _LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name) \
345
IF_ENABLED(CONFIG_LOG_RUNTIME_FILTERING, \
346
(_LOG_MODULE_DYNAMIC_DATA_CREATE(_name);))
347
348
#define _LOG_MODULE_DATA_CREATE(_name, _level) \
349
_LOG_MODULE_CONST_DATA_CREATE(_name, _level); \
350
_LOG_MODULE_DYNAMIC_DATA_COND_CREATE(_name)
351
352
/* Determine if data for the module shall be created. It is created if logging
353
* is enabled, override level is set or module specific level is set (not off).
354
*/
355
#define Z_DO_LOG_MODULE_REGISTER(...) \
356
COND_CODE_1(CONFIG_LOG, \
357
(Z_LOG_EVAL(CONFIG_LOG_OVERRIDE_LEVEL, \
358
(1), \
359
(Z_LOG_EVAL(_LOG_LEVEL_RESOLVE(__VA_ARGS__), (1), (0))) \
360
)), (0))
361
362
/* Determine if the data of the log module shall be in the partition
363
* 'k_log_partition' to allow a user mode thread access to this data.
364
*/
365
#if CONFIG_USERSPACE && CONFIG_LOG_ALWAYS_RUNTIME
366
extern
struct
k_mem_partition
k_log_partition;
367
#define Z_LOG_MODULE_PARTITION(_k_app_mem) _k_app_mem(k_log_partition)
368
#else
369
#define Z_LOG_MODULE_PARTITION(_k_app_mem)
370
#endif
371
403
#define LOG_MODULE_REGISTER(...) \
404
COND_CODE_1( \
405
Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__), \
406
(_LOG_MODULE_DATA_CREATE(GET_ARG_N(1, __VA_ARGS__), \
407
_LOG_LEVEL_RESOLVE(__VA_ARGS__))),\
408
() \
409
) \
410
LOG_MODULE_DECLARE(__VA_ARGS__)
411
438
#define LOG_MODULE_DECLARE(...) \
439
extern const struct log_source_const_data \
440
Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)); \
441
extern struct log_source_dynamic_data \
442
LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)); \
443
\
444
Z_LOG_MODULE_PARTITION(K_APP_DMEM) \
445
static const struct log_source_const_data * \
446
__log_current_const_data __unused = \
447
Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) ? \
448
&Z_LOG_ITEM_CONST_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
449
NULL; \
450
\
451
Z_LOG_MODULE_PARTITION(K_APP_DMEM) \
452
static struct log_source_dynamic_data * \
453
__log_current_dynamic_data __unused = \
454
(Z_DO_LOG_MODULE_REGISTER(__VA_ARGS__) && \
455
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING)) ? \
456
&LOG_ITEM_DYNAMIC_DATA(GET_ARG_N(1, __VA_ARGS__)) : \
457
NULL; \
458
\
459
Z_LOG_MODULE_PARTITION(K_APP_BMEM) \
460
static const uint32_t __log_level __unused = \
461
_LOG_LEVEL_RESOLVE(__VA_ARGS__)
462
470
#define LOG_LEVEL_SET(level) static const uint32_t __log_level __unused = \
471
Z_LOG_RESOLVED_LEVEL(level, 0)
472
473
#ifdef CONFIG_LOG_CUSTOM_HEADER
474
/* This include must always be at the end of log.h */
475
#include <zephyr_custom_log.h>
476
#endif
477
478
/*
479
* Eclipse CDT or JetBrains Clion parser is sometimes confused by logging API
480
* code and freezes the whole IDE. Following lines hides LOG_x macros from them.
481
*/
482
#if defined(__CDT_PARSER__) || defined(__JETBRAINS_IDE__)
483
#undef LOG_ERR
484
#undef LOG_WRN
485
#undef LOG_INF
486
#undef LOG_DBG
487
488
#undef LOG_HEXDUMP_ERR
489
#undef LOG_HEXDUMP_WRN
490
#undef LOG_HEXDUMP_INF
491
#undef LOG_HEXDUMP_DBG
492
493
#define LOG_ERR(...) (void) 0
494
#define LOG_WRN(...) (void) 0
495
#define LOG_DBG(...) (void) 0
496
#define LOG_INF(...) (void) 0
497
498
#define LOG_HEXDUMP_ERR(...) (void) 0
499
#define LOG_HEXDUMP_WRN(...) (void) 0
500
#define LOG_HEXDUMP_DBG(...) (void) 0
501
#define LOG_HEXDUMP_INF(...) (void) 0
502
#endif
503
508
#endif
/* ZEPHYR_INCLUDE_LOGGING_LOG_H_ */
app_memdomain.h
log_core.h
log_instance.h
k_mem_partition
Memory Partition.
Definition
mem_domain.h:55
iterable_sections.h
include
zephyr
logging
log.h
Generated on Sun May 4 2025 13:59:46 for Zephyr Project API by
1.9.8