Skip to content

Commit 3c63d05

Browse files
nordic-krchnashif
authored andcommitted
logging: Add metadata to hexdump
Extended hexdump API with a raw string attached to the data. Signed-off-by: Krzysztof Chruscinski <[email protected]>
1 parent f8a8bdf commit 3c63d05

File tree

9 files changed

+145
-148
lines changed

9 files changed

+145
-148
lines changed

include/logging/log.h

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -136,45 +136,49 @@ extern "C" {
136136
* @details It's meant to report severe errors, such as those from which it's
137137
* not possible to recover.
138138
*
139-
* @param data Pointer to the data to be logged.
140-
* @param length Length of data (in bytes).
139+
* @param _data Pointer to the data to be logged.
140+
* @param _length Length of data (in bytes).
141+
* @param _str Persistent, raw string.
141142
*/
142-
#define LOG_HEXDUMP_ERR(data, length) \
143-
_LOG_HEXDUMP(LOG_LEVEL_ERR, data, length)
143+
#define LOG_HEXDUMP_ERR(_data, _length, _str) \
144+
_LOG_HEXDUMP(LOG_LEVEL_ERR, _data, _length, _str)
144145

145146
/**
146147
* @brief Writes a WARNING level message to the log.
147148
*
148149
* @details It's meant to register messages related to unusual situations that
149150
* are not necessarily errors.
150151
*
151-
* @param data Pointer to the data to be logged.
152-
* @param length Length of data (in bytes).
152+
* @param _data Pointer to the data to be logged.
153+
* @param _length Length of data (in bytes).
154+
* @param _str Persistent, raw string.
153155
*/
154-
#define LOG_HEXDUMP_WRN(data, length) \
155-
_LOG_HEXDUMP(LOG_LEVEL_WRN, data, length)
156+
#define LOG_HEXDUMP_WRN(_data, _length, _str) \
157+
_LOG_HEXDUMP(LOG_LEVEL_WRN, _data, _length, _str)
156158

157159
/**
158160
* @brief Writes an INFO level message to the log.
159161
*
160162
* @details It's meant to write generic user oriented messages.
161163
*
162-
* @param data Pointer to the data to be logged.
163-
* @param length Length of data (in bytes).
164+
* @param _data Pointer to the data to be logged.
165+
* @param _length Length of data (in bytes).
166+
* @param _str Persistent, raw string.
164167
*/
165-
#define LOG_HEXDUMP_INF(data, length) \
166-
_LOG_HEXDUMP(LOG_LEVEL_INF, data, length)
168+
#define LOG_HEXDUMP_INF(_data, _length, _str) \
169+
_LOG_HEXDUMP(LOG_LEVEL_INF, _data, _length, _str)
167170

168171
/**
169172
* @brief Writes a DEBUG level message to the log.
170173
*
171174
* @details It's meant to write developer oriented information.
172175
*
173-
* @param data Pointer to the data to be logged.
174-
* @param length Length of data (in bytes).
176+
* @param _data Pointer to the data to be logged.
177+
* @param _length Length of data (in bytes).
178+
* @param _str Persistent, raw string.
175179
*/
176-
#define LOG_HEXDUMP_DBG(data, length) \
177-
_LOG_HEXDUMP(LOG_LEVEL_DBG, data, length)
180+
#define LOG_HEXDUMP_DBG(_data, _length, _str) \
181+
_LOG_HEXDUMP(LOG_LEVEL_DBG, _data, _length, _str)
178182

179183
/**
180184
* @brief Writes an ERROR hexdump message associated with the instance to the
@@ -186,11 +190,12 @@ extern "C" {
186190
* severe errors, such as those from which it's not possible to recover.
187191
*
188192
* @param _log_inst Pointer to the log structure associated with the instance.
189-
* @param data Pointer to the data to be logged.
190-
* @param length Length of data (in bytes).
193+
* @param _data Pointer to the data to be logged.
194+
* @param _length Length of data (in bytes).
195+
* @param _str Persistent, raw string.
191196
*/
192-
#define LOG_INST_HEXDUMP_ERR(_log_inst, data, length) \
193-
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, data, length)
197+
#define LOG_INST_HEXDUMP_ERR(_log_inst, _data, _length, _str) \
198+
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_ERR, _log_inst, _data, _length, _str)
194199

195200
/**
196201
* @brief Writes a WARNING level hexdump message associated with the instance to
@@ -200,11 +205,12 @@ extern "C" {
200205
* are not necessarily errors.
201206
*
202207
* @param _log_inst Pointer to the log structure associated with the instance.
203-
* @param data Pointer to the data to be logged.
204-
* @param length Length of data (in bytes).
208+
* @param _data Pointer to the data to be logged.
209+
* @param _length Length of data (in bytes).
210+
* @param _str Persistent, raw string.
205211
*/
206-
#define LOG_INST_HEXDUMP_WRN(_log_inst, data, length) \
207-
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, data, length)
212+
#define LOG_INST_HEXDUMP_WRN(_log_inst, _data, _length, _str) \
213+
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_WRN, _log_inst, _data, _length, _str)
208214

209215
/**
210216
* @brief Writes an INFO level hexdump message associated with the instance to
@@ -213,11 +219,12 @@ extern "C" {
213219
* @details It's meant to write generic user oriented messages.
214220
*
215221
* @param _log_inst Pointer to the log structure associated with the instance.
216-
* @param data Pointer to the data to be logged.
217-
* @param length Length of data (in bytes).
222+
* @param _data Pointer to the data to be logged.
223+
* @param _length Length of data (in bytes).
224+
* @param _str Persistent, raw string.
218225
*/
219-
#define LOG_INST_HEXDUMP_INF(_log_inst, data, length) \
220-
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, data, length)
226+
#define LOG_INST_HEXDUMP_INF(_log_inst, _data, _length, _str) \
227+
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_INF, _log_inst, _data, _length, _str)
221228

222229
/**
223230
* @brief Writes a DEBUG level hexdump message associated with the instance to
@@ -226,11 +233,12 @@ extern "C" {
226233
* @details It's meant to write developer oriented information.
227234
*
228235
* @param _log_inst Pointer to the log structure associated with the instance.
229-
* @param _data Pointer to the data to be logged.
230-
* @param _length Length of data (in bytes).
236+
* @param _data Pointer to the data to be logged.
237+
* @param _length Length of data (in bytes).
238+
* @param _str Persistent, raw string.
231239
*/
232-
#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length) \
233-
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length)
240+
#define LOG_INST_HEXDUMP_DBG(_log_inst, _data, _length, _str) \
241+
_LOG_HEXDUMP_INSTANCE(LOG_LEVEL_DBG, _log_inst, _data, _length, _str)
234242

235243
/**
236244
* @brief Writes an formatted string to the log.

include/logging/log_core.h

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -226,33 +226,34 @@ extern "C" {
226226
/******************************************************************************/
227227
/****************** Macros for hexdump logging ********************************/
228228
/******************************************************************************/
229-
#define __LOG_HEXDUMP(_level, _id, _filter, _data, _length) \
230-
do { \
231-
if (_LOG_CONST_LEVEL_CHECK(_level) && \
232-
(_level <= LOG_RUNTIME_FILTER(_filter))) { \
233-
struct log_msg_ids src_level = { \
234-
.level = _level, \
235-
.source_id = _id, \
236-
.domain_id = CONFIG_LOG_DOMAIN_ID \
237-
}; \
238-
log_hexdump(_data, _length, src_level); \
239-
} \
229+
#define __LOG_HEXDUMP(_level, _id, _filter, _data, _length, _str) \
230+
do { \
231+
if (_LOG_CONST_LEVEL_CHECK(_level) && \
232+
(_level <= LOG_RUNTIME_FILTER(_filter))) { \
233+
struct log_msg_ids src_level = { \
234+
.level = _level, \
235+
.source_id = _id, \
236+
.domain_id = CONFIG_LOG_DOMAIN_ID \
237+
}; \
238+
log_hexdump(_str, _data, _length, src_level); \
239+
} \
240240
} while (0)
241241

242-
#define _LOG_HEXDUMP(_level, _data, _length) \
242+
#define _LOG_HEXDUMP(_level, _data, _length, _str) \
243243
__LOG_HEXDUMP(_level, \
244244
LOG_CURRENT_MODULE_ID(), \
245245
LOG_CURRENT_DYNAMIC_DATA_ADDR(), \
246-
_data, _length)
247-
248-
#define _LOG_HEXDUMP_INSTANCE(_level, _inst, _data, _length) \
249-
__LOG_HEXDUMP(_level, \
250-
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
251-
LOG_DYNAMIC_ID_GET(_inst) : \
252-
LOG_CONST_ID_GET(_inst), \
253-
_inst, \
254-
_data, \
255-
_length)
246+
_data, _length, _str)
247+
248+
#define _LOG_HEXDUMP_INSTANCE(_level, _inst, _data, _length, _str) \
249+
__LOG_HEXDUMP(_level, \
250+
IS_ENABLED(CONFIG_LOG_RUNTIME_FILTERING) ? \
251+
LOG_DYNAMIC_ID_GET(_inst) : \
252+
LOG_CONST_ID_GET(_inst), \
253+
_inst, \
254+
_data, \
255+
_length, \
256+
_str)
256257

257258
/******************************************************************************/
258259
/****************** Filtering macros ******************************************/
@@ -444,11 +445,13 @@ void log_n(const char *str,
444445

445446
/** @brief Hexdump log.
446447
*
448+
* @param str String.
447449
* @param data Data.
448450
* @param length Data length.
449451
* @param src_level Log identification.
450452
*/
451-
void log_hexdump(const u8_t *data,
453+
void log_hexdump(const char *str,
454+
const u8_t *data,
452455
u32_t length,
453456
struct log_msg_ids src_level);
454457

include/logging/log_msg.h

Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ struct log_msg_ids {
7474
u16_t source_id : 10; /*!< Source ID. */
7575
};
7676

77-
BUILD_ASSERT_MSG((sizeof(struct log_msg_ids) == sizeof(u16_t)), \
78-
"Structure must fit in 2 bytes");
77+
BUILD_ASSERT_MSG((sizeof(struct log_msg_ids) == sizeof(u16_t)),
78+
"Structure must fit in 2 bytes");
7979

8080
/** Part of log message header common to standard and hexdump log message. */
8181
struct log_msg_generic_hdr {
8282
COMMON_PARAM_HDR();
8383
u16_t reserved : 14;
8484
};
8585

86-
BUILD_ASSERT_MSG((sizeof(struct log_msg_generic_hdr) == sizeof(u16_t)), \
87-
"Structure must fit in 2 bytes");
86+
BUILD_ASSERT_MSG((sizeof(struct log_msg_generic_hdr) == sizeof(u16_t)),
87+
"Structure must fit in 2 bytes");
8888

8989
/** Part of log message header specific to standard log message. */
9090
struct log_msg_std_hdr {
@@ -93,8 +93,8 @@ struct log_msg_std_hdr {
9393
u16_t nargs : 4;
9494
};
9595

96-
BUILD_ASSERT_MSG((sizeof(struct log_msg_std_hdr) == sizeof(u16_t)), \
97-
"Structure must fit in 2 bytes");
96+
BUILD_ASSERT_MSG((sizeof(struct log_msg_std_hdr) == sizeof(u16_t)),
97+
"Structure must fit in 2 bytes");
9898

9999
/** Part of log message header specific to hexdump log message. */
100100
struct log_msg_hexdump_hdr {
@@ -103,8 +103,8 @@ struct log_msg_hexdump_hdr {
103103
u16_t length : LOG_MSG_HEXDUMP_LENGTH_BITS;
104104
};
105105

106-
BUILD_ASSERT_MSG((sizeof(struct log_msg_hexdump_hdr) == sizeof(u16_t)), \
107-
"Structure must fit in 2 bytes");
106+
BUILD_ASSERT_MSG((sizeof(struct log_msg_hexdump_hdr) == sizeof(u16_t)),
107+
"Structure must fit in 2 bytes");
108108

109109
/** Log message header structure */
110110
struct log_msg_hdr {
@@ -119,33 +119,17 @@ struct log_msg_hdr {
119119
u32_t timestamp; /*!< Timestamp. */
120120
};
121121

122-
/** @brief Data part of head of standard log message. */
123-
struct log_msg_std_head_data {
124-
const char *str;
125-
u32_t args[LOG_MSG_NARGS_SINGLE_CHUNK];
126-
};
127-
128-
/** @brief Data part of head of extended standard log message.
129-
*
130-
* @details When message is extended, head of the message contains also a
131-
* pointer to the next chunk thus data part is reduced.
132-
*/
133-
struct log_msg_std_ext_head_data {
134-
const char *str;
135-
u32_t args[LOG_MSG_NARGS_HEAD_CHUNK];
136-
};
137-
138122
/** @brief Data part of log message. */
139123
union log_msg_head_data {
140-
struct log_msg_std_head_data std;
124+
u32_t args[LOG_MSG_NARGS_SINGLE_CHUNK];
141125
u8_t bytes[LOG_MSG_HEXDUMP_BYTES_SINGLE_CHUNK];
142126
};
143127

144128
/** @brief Data part of extended log message. */
145129
struct log_msg_ext_head_data {
146130
struct log_msg_cont *next;
147131
union log_msg_ext_head_data_data {
148-
struct log_msg_std_ext_head_data std;
132+
u32_t args[LOG_MSG_NARGS_HEAD_CHUNK];
149133
u8_t bytes[LOG_MSG_HEXDUMP_BYTES_HEAD_CHUNK];
150134
} data;
151135
};
@@ -154,24 +138,24 @@ struct log_msg_ext_head_data {
154138
struct log_msg {
155139
struct log_msg *next; /*!< Used by logger core list.*/
156140
struct log_msg_hdr hdr; /*!< Message header. */
157-
141+
const char *str;
158142
union log_msg_data {
159-
union log_msg_head_data data;
143+
union log_msg_head_data single;
160144
struct log_msg_ext_head_data ext;
161-
} data; /*!< Message data. */
145+
} payload; /*!< Message data. */
162146
};
163147

164-
BUILD_ASSERT_MSG((sizeof(union log_msg_head_data) == \
165-
sizeof(struct log_msg_ext_head_data)), \
166-
"Structure must be same size");
148+
BUILD_ASSERT_MSG((sizeof(union log_msg_head_data) ==
149+
sizeof(struct log_msg_ext_head_data)),
150+
"Structure must be same size");
167151

168152
/** @brief Chunks following message head when message is extended. */
169153
struct log_msg_cont {
170154
struct log_msg_cont *next; /*!< Pointer to the next chunk. */
171155
union log_msg_cont_data {
172156
u32_t args[ARGS_CONT_MSG];
173157
u8_t bytes[HEXDUMP_BYTES_CONT_MSG];
174-
} data;
158+
} payload;
175159
};
176160

177161
/** @brief Log message */
@@ -307,12 +291,15 @@ const char *log_msg_str_get(struct log_msg *msg);
307291
*
308292
* @note Allocation and partial filling is combined for performance reasons.
309293
*
294+
* @param str String.
310295
* @param data Data.
311296
* @param length Data length.
312297
*
313298
* @return Pointer to allocated head of the message or NULL
314299
*/
315-
struct log_msg *log_msg_hexdump_create(const u8_t *data, u32_t length);
300+
struct log_msg *log_msg_hexdump_create(const char *str,
301+
const u8_t *data,
302+
u32_t length);
316303

317304
/** @brief Put data into hexdump log message.
318305
*
@@ -393,7 +380,7 @@ static inline struct log_msg *_log_msg_ext_std_alloc(void)
393380
}
394381

395382
msg->hdr.params.generic.ext = 1;
396-
msg->data.ext.next = cont;
383+
msg->payload.ext.next = cont;
397384
cont->next = NULL;
398385
}
399386

@@ -413,7 +400,7 @@ static inline struct log_msg *log_msg_create_0(const char *str)
413400
struct log_msg *msg = _log_msg_std_alloc();
414401

415402
if (msg != NULL) {
416-
msg->data.data.std.str = str;
403+
msg->str = str;
417404
}
418405

419406
return msg;
@@ -438,9 +425,9 @@ static inline struct log_msg *log_msg_create_1(const char *str,
438425
struct log_msg *msg = _log_msg_std_alloc();
439426

440427
if (msg != NULL) {
428+
msg->str = str;
441429
msg->hdr.params.std.nargs = 1;
442-
msg->data.data.std.str = str;
443-
msg->data.data.std.args[0] = arg1;
430+
msg->payload.single.args[0] = arg1;
444431
}
445432

446433
return msg;
@@ -467,10 +454,10 @@ static inline struct log_msg *log_msg_create_2(const char *str,
467454
struct log_msg *msg = _log_msg_std_alloc();
468455

469456
if (msg != NULL) {
457+
msg->str = str;
470458
msg->hdr.params.std.nargs = 2;
471-
msg->data.data.std.str = str;
472-
msg->data.data.std.args[0] = arg1;
473-
msg->data.data.std.args[1] = arg2;
459+
msg->payload.single.args[0] = arg1;
460+
msg->payload.single.args[1] = arg2;
474461
}
475462

476463
return msg;
@@ -499,11 +486,11 @@ static inline struct log_msg *log_msg_create_3(const char *str,
499486
struct log_msg *msg = _log_msg_std_alloc();
500487

501488
if (msg != NULL) {
489+
msg->str = str;
502490
msg->hdr.params.std.nargs = 3;
503-
msg->data.data.std.str = str;
504-
msg->data.data.std.args[0] = arg1;
505-
msg->data.data.std.args[1] = arg2;
506-
msg->data.data.std.args[2] = arg3;
491+
msg->payload.single.args[0] = arg1;
492+
msg->payload.single.args[1] = arg2;
493+
msg->payload.single.args[2] = arg3;
507494
}
508495

509496
return msg;

0 commit comments

Comments
 (0)