Skip to content

Commit f381ca8

Browse files
committed
logging: Adapt logger to support both versions
Adapted to be able to switch between v1 and v2. Signed-off-by: Krzysztof Chruscinski <[email protected]>
1 parent 07e0548 commit f381ca8

File tree

10 files changed

+341
-110
lines changed

10 files changed

+341
-110
lines changed

include/logging/log.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,12 @@ extern "C" {
252252
* @param fmt Formatted string to output.
253253
* @param ap Variable parameters.
254254
*/
255-
void log_printk(const char *fmt, va_list ap);
255+
void z_log_printk(const char *fmt, va_list ap);
256+
static inline void log_printk(const char *fmt, va_list ap)
257+
{
258+
z_log_printk(fmt, ap);
259+
}
256260

257-
#ifndef CONFIG_LOG_MINIMAL
258261
/** @brief Copy transient string to a buffer from internal, logger pool.
259262
*
260263
* Function should be used when transient string is intended to be logged.
@@ -272,14 +275,15 @@ void log_printk(const char *fmt, va_list ap);
272275
* a buffer from the pool (see CONFIG_LOG_STRDUP_MAX_STRING). In
273276
* some configurations, the original string pointer is returned.
274277
*/
275-
char *log_strdup(const char *str);
276-
#else
277-
278+
char *z_log_strdup(const char *str);
278279
static inline char *log_strdup(const char *str)
279280
{
280-
return (char *)str;
281+
if (IS_ENABLED(CONFIG_LOG_MINIMAL) || IS_ENABLED(CONFIG_LOG2)) {
282+
return (char *)str;
283+
}
284+
285+
return z_log_strdup(str);
281286
}
282-
#endif /* CONFIG_LOG_MINIMAL */
283287

284288
#ifdef __cplusplus
285289
}

include/logging/log_backend.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_
88

99
#include <logging/log_msg.h>
10+
#include <logging/log_msg2.h>
1011
#include <stdarg.h>
1112
#include <sys/__assert.h>
1213
#include <sys/util.h>
@@ -29,6 +30,9 @@ struct log_backend;
2930
* @brief Logger backend API.
3031
*/
3132
struct log_backend_api {
33+
void (*process)(const struct log_backend *const backend,
34+
union log_msg2_generic *msg);
35+
3236
void (*put)(const struct log_backend *const backend,
3337
struct log_msg *msg);
3438
void (*put_sync_string)(const struct log_backend *const backend,
@@ -102,6 +106,16 @@ static inline void log_backend_put(const struct log_backend *const backend,
102106
backend->api->put(backend, msg);
103107
}
104108

109+
static inline void log_backend_msg2_process(
110+
const struct log_backend *const backend,
111+
union log_msg2_generic *msg)
112+
{
113+
__ASSERT_NO_MSG(backend != NULL);
114+
__ASSERT_NO_MSG(msg != NULL);
115+
backend->api->process(backend, msg);
116+
}
117+
118+
105119
/**
106120
* @brief Synchronously process log message.
107121
*

include/logging/log_backend_std.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ extern "C" {
2121
* @{
2222
*/
2323

24+
static inline uint32_t log_backend_std_get_flags(void)
25+
{
26+
uint32_t flags = (LOG_OUTPUT_FLAG_LEVEL | LOG_OUTPUT_FLAG_TIMESTAMP);
27+
28+
if (IS_ENABLED(CONFIG_LOG_BACKEND_SHOW_COLOR)) {
29+
flags |= LOG_OUTPUT_FLAG_COLORS;
30+
}
31+
32+
if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) {
33+
flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP;
34+
}
35+
36+
return flags;
37+
}
38+
2439
/** @brief Put log message to a standard logger backend.
2540
*
2641
* @param output Log output instance.

include/logging/log_core.h

Lines changed: 97 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ extern "C" {
141141
(0)\
142142
)
143143

144+
144145
/**
145146
* @brief Macro for optional injection of function name as first argument of
146147
* formatted string. COND_CODE_0() macro is used to handle no arguments
@@ -151,14 +152,22 @@ extern "C" {
151152
* argument. In order to handle string with no arguments _LOG_Z_EVAL is
152153
* used.
153154
*/
154-
155-
#define Z_LOG_STR(...) "%s: " GET_ARG_N(1, __VA_ARGS__), \
155+
#define Z_LOG_STR2(...) "%s: " GET_ARG_N(1, __VA_ARGS__), \
156156
(const char *)__func__\
157157
COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__),\
158158
(),\
159159
(, GET_ARGS_LESS_N(1, __VA_ARGS__))\
160160
)
161161

162+
/**
163+
* @brief Handle optional injection of function name as the first argument.
164+
*
165+
* Additionally, macro is handling the empty message case.
166+
*/
167+
#define Z_LOG_STR(...) \
168+
COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
169+
("%s", (const char *)__func__), \
170+
(Z_LOG_STR2(__VA_ARGS__)))
162171

163172
/******************************************************************************/
164173
/****************** Internal macros for log frontend **************************/
@@ -259,6 +268,12 @@ void z_log_minimal_printk(const char *fmt, ...);
259268
##__VA_ARGS__); \
260269
} while (false)
261270

271+
#define Z_LOG_TO_VPRINTK(_level, fmt, valist) do { \
272+
z_log_minimal_printk("%c: ", z_log_minimal_level_to_char(_level)); \
273+
z_log_minimal_vprintk(fmt, valist); \
274+
z_log_minimal_printk("\n"); \
275+
} while (false)
276+
262277
static inline char z_log_minimal_level_to_char(int level)
263278
{
264279
switch (level) {
@@ -274,6 +289,9 @@ static inline char z_log_minimal_level_to_char(int level)
274289
return '?';
275290
}
276291
}
292+
293+
#define Z_LOG_INST(_inst) COND_CODE_1(CONFIG_LOG, (_inst), NULL)
294+
277295
/*****************************************************************************/
278296
/****************** Macros for standard logging ******************************/
279297
/*****************************************************************************/
@@ -292,8 +310,14 @@ static inline char z_log_minimal_level_to_char(int level)
292310
if (!LOG_CHECK_CTX_LVL_FILTER(is_user_context, _level, filters)) { \
293311
break; \
294312
} \
295-
\
296-
Z_LOG_INTERNAL(is_user_context, _level, _source, __VA_ARGS__);\
313+
if (IS_ENABLED(CONFIG_LOG2)) { \
314+
int _mode; \
315+
Z_LOG_MSG2_CREATE(!IS_ENABLED(CONFIG_USERSPACE), _mode, \
316+
CONFIG_LOG_DOMAIN_ID, _source, _level, NULL,\
317+
0, __VA_ARGS__); \
318+
} else { \
319+
Z_LOG_INTERNAL(is_user_context, _level, _source, __VA_ARGS__);\
320+
} \
297321
if (false) { \
298322
/* Arguments checker present but never evaluated.*/ \
299323
/* Placed here to ensure that __VA_ARGS__ are*/ \
@@ -309,7 +333,8 @@ static inline char z_log_minimal_level_to_char(int level)
309333
(void *)__log_current_const_data, \
310334
__VA_ARGS__)
311335

312-
#define Z_LOG_INSTANCE(_level, _inst, ...) Z_LOG2(_level, _inst, __VA_ARGS__)
336+
#define Z_LOG_INSTANCE(_level, _inst, ...) \
337+
Z_LOG2(_level, Z_LOG_INST(_inst), __VA_ARGS__)
313338

314339

315340
/*****************************************************************************/
@@ -333,8 +358,19 @@ static inline char z_log_minimal_level_to_char(int level)
333358
if (!LOG_CHECK_CTX_LVL_FILTER(is_user_context, _level, filters)) { \
334359
break; \
335360
} \
361+
if (IS_ENABLED(CONFIG_LOG2)) { \
362+
int mode; \
363+
Z_LOG_MSG2_CREATE(!IS_ENABLED(CONFIG_USERSPACE), mode, \
364+
CONFIG_LOG_DOMAIN_ID, _source, _level, \
365+
_data, _len, \
366+
COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
367+
(), \
368+
(COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \
369+
("%s", __VA_ARGS__), (__VA_ARGS__)))));\
370+
break; \
371+
} \
336372
uint16_t src_id = \
337-
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
373+
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
338374
LOG_DYNAMIC_ID_GET(_source) : LOG_CONST_ID_GET(_source);\
339375
struct log_msg_ids src_level = { \
340376
.level = _level, \
@@ -358,7 +394,7 @@ static inline char z_log_minimal_level_to_char(int level)
358394
_data, _length, __VA_ARGS__)
359395

360396
#define Z_LOG_HEXDUMP_INSTANCE(_level, _inst, _data, _length, _str) \
361-
Z_LOG_HEXDUMP2(_level, _inst, _data, _length, _str)
397+
Z_LOG_HEXDUMP2(_level, Z_LOG_INST(_inst), _data, _length, _str)
362398

363399
/*****************************************************************************/
364400
/****************** Filtering macros *****************************************/
@@ -619,6 +655,21 @@ void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata,
619655
void log_generic(struct log_msg_ids src_level, const char *fmt, va_list ap,
620656
enum log_strdup_action strdup_action);
621657

658+
/**
659+
* @brief Writes a generic log message to the logging v2.
660+
*
661+
* @note This function is intended to be used when porting other log systems.
662+
*
663+
* @param level Log level..
664+
* @param fmt String to format.
665+
* @param ap Poiner to arguments list.
666+
*/
667+
static inline void log2_generic(uint8_t level, const char *fmt, va_list ap)
668+
{
669+
z_log_msg2_runtime_vcreate(CONFIG_LOG_DOMAIN_ID, NULL, level,
670+
NULL, 0, fmt, ap);
671+
}
672+
622673
/**
623674
* @brief Returns number of arguments visible from format string.
624675
*
@@ -738,33 +789,45 @@ __syscall void z_log_hexdump_from_user(uint32_t src_level_val,
738789
/********* Speed optimized for up to three arguments number. ***************/
739790
/******************************************************************************/
740791
#define Z_LOG_VA(_level, _str, _valist, _argnum, _strdup_action)\
741-
__LOG_VA(_level, \
742-
(uint16_t)LOG_CURRENT_MODULE_ID(), \
743-
LOG_CURRENT_DYNAMIC_DATA_ADDR(), \
744-
_str, _valist, _argnum, _strdup_action)
745-
746-
#define __LOG_VA(_level, _id, _filter, _str, _valist, _argnum, _strdup_action) \
747-
do { \
748-
if (Z_LOG_CONST_LEVEL_CHECK(_level)) { \
749-
bool is_user_context = k_is_user_context(); \
750-
\
751-
if (IS_ENABLED(CONFIG_LOG_MINIMAL)) { \
752-
z_log_minimal_printk(_str, _valist); \
753-
} else if (LOG_CHECK_CTX_LVL_FILTER(is_user_context, \
754-
_level, _filter)) { \
755-
struct log_msg_ids src_level = { \
756-
.level = _level, \
757-
.domain_id = CONFIG_LOG_DOMAIN_ID, \
758-
.source_id = _id \
759-
}; \
760-
__LOG_INTERNAL_VA(is_user_context, \
761-
src_level, \
762-
_str, _valist, _argnum, \
763-
_strdup_action); \
764-
} else { \
765-
} \
766-
} \
767-
} while (false)
792+
__LOG_VA(_level, \
793+
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
794+
(void *)__log_current_dynamic_data : \
795+
(void *)__log_current_const_data, \
796+
_str, _valist, _argnum, _strdup_action)
797+
798+
#define __LOG_VA(_level, _source, _str, _valist, _argnum, _strdup_action) do { \
799+
if (!Z_LOG_CONST_LEVEL_CHECK(_level)) { \
800+
break; \
801+
} \
802+
if (IS_ENABLED(CONFIG_LOG_MINIMAL)) { \
803+
Z_LOG_TO_VPRINTK(_level, _str, _valist); \
804+
break; \
805+
} \
806+
\
807+
bool is_user_context = k_is_user_context(); \
808+
uint32_t filters = IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
809+
((struct log_source_dynamic_data *)(void *)(_source))->filters : 0;\
810+
if (!LOG_CHECK_CTX_LVL_FILTER(is_user_context, _level, filters)) { \
811+
break; \
812+
} \
813+
if (IS_ENABLED(CONFIG_LOG2)) { \
814+
z_log_msg2_runtime_vcreate(CONFIG_LOG_DOMAIN_ID, _source, \
815+
_level, NULL, 0, _str, _valist); \
816+
break; \
817+
} \
818+
uint16_t _id = \
819+
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
820+
LOG_DYNAMIC_ID_GET(_source) : LOG_CONST_ID_GET(_source);\
821+
struct log_msg_ids src_level = { \
822+
.level = _level, \
823+
.domain_id = CONFIG_LOG_DOMAIN_ID, \
824+
.source_id = _id \
825+
}; \
826+
__LOG_INTERNAL_VA(is_user_context, \
827+
src_level, \
828+
_str, _valist, _argnum, \
829+
_strdup_action); \
830+
} while (false)
768831

769832
/**
770833
* @brief Inline function to perform strdup, used in __LOG_INTERNAL_VA macro

include/sys/printk.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,21 @@ extern "C" {
4545
* @return N/A
4646
*/
4747
#ifdef CONFIG_PRINTK
48+
49+
#if defined(CONFIG_LOG_PRINTK) && defined(CONFIG_LOG2)
50+
#include <logging/log.h>
51+
#define printk(...) Z_LOG_PRINTK(__VA_ARGS__)
52+
static inline __printf_like(1, 0) void vprintk(const char *fmt, va_list ap)
53+
{
54+
z_log_msg2_runtime_vcreate(CONFIG_LOG_DOMAIN_ID, NULL,
55+
LOG_LEVEL_INTERNAL_RAW_STRING, NULL, 0,
56+
fmt, ap);
57+
}
58+
#else
4859
extern __printf_like(1, 2) void printk(const char *fmt, ...);
4960
extern __printf_like(1, 0) void vprintk(const char *fmt, va_list ap);
61+
#endif /* defined(CONFIG_LOG_PRINTK) && defined(CONFIG_LOG) */
62+
5063
#else
5164
static inline __printf_like(1, 2) void printk(const char *fmt, ...)
5265
{

lib/os/printk.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
#include <sys/cbprintf.h>
2323
#include <sys/types.h>
2424

25-
#ifdef CONFIG_PRINTK_SYNC
25+
#if defined(CONFIG_PRINTK_SYNC) && \
26+
!(defined(CONFIG_LOG_PRINTK) && defined(CONFIG_LOG2))
2627
static struct k_spinlock lock;
2728
#endif
2829

@@ -76,8 +77,8 @@ void *__printk_get_hook(void)
7677
}
7778
#endif /* CONFIG_PRINTK */
7879

79-
80-
#ifdef CONFIG_PRINTK
80+
#if defined(CONFIG_PRINTK) && \
81+
!(defined(CONFIG_LOG_PRINTK) && defined(CONFIG_LOG2))
8182
#ifdef CONFIG_USERSPACE
8283
struct buf_out_context {
8384
int count;
@@ -204,6 +205,7 @@ static inline void z_vrfy_k_str_out(char *c, size_t n)
204205
*
205206
* @return N/A
206207
*/
208+
207209
void printk(const char *fmt, ...)
208210
{
209211
va_list ap;
@@ -217,7 +219,9 @@ void printk(const char *fmt, ...)
217219
}
218220
va_end(ap);
219221
}
220-
#endif /* CONFIG_PRINTK */
222+
#endif /* defined(CONFIG_PRINTK) && \
223+
* !(defined(CONFIG_LOG_PRINTK) && defined(CONFIG_LOG2))
224+
*/
221225

222226
struct str_context {
223227
char *str;

samples/subsys/logging/logger/src/ext_log_system_adapter.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,22 @@ static const uint8_t log_level_lut[] = {
2424

2525
static void log_handler(enum ext_log_level level, const char *fmt, ...)
2626
{
27-
struct log_msg_ids src_level = {
28-
.level = log_level_lut[level],
29-
.domain_id = CONFIG_LOG_DOMAIN_ID,
30-
.source_id = LOG_CURRENT_MODULE_ID()
31-
};
3227

3328
va_list ap;
3429

3530
va_start(ap, fmt);
36-
log_generic(src_level, fmt, ap, LOG_STRDUP_CHECK_EXEC);
31+
if (IS_ENABLED(CONFIG_LOG2)) {
32+
log2_generic(log_level_lut[level], fmt, ap);
33+
} else {
34+
struct log_msg_ids src_level = {
35+
.level = log_level_lut[level],
36+
.domain_id = CONFIG_LOG_DOMAIN_ID,
37+
.source_id = LOG_CURRENT_MODULE_ID()
38+
};
39+
40+
log_generic(src_level, fmt, ap, LOG_STRDUP_CHECK_EXEC);
41+
}
42+
3743
va_end(ap);
3844
}
3945

0 commit comments

Comments
 (0)