Skip to content

Commit ce3f40a

Browse files
committed
fix: 🐛 log组件更新,详见描述
1. 取消上一次日志等级的记录,减少混淆,对应的log_printf/log_write API将会直接以最高等级输出,建议使用带_lv版本 2. 增加日志等级滚动设置及当前等级信息获取(字符串) 3. 修复之前log_printf带了自定义前缀填充内容导致后续序列化错误问题
1 parent aafadcc commit ce3f40a

2 files changed

Lines changed: 100 additions & 62 deletions

File tree

core/fc_log.c

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,49 @@ int fc_log_fwrite(fc_log_t *log, fc_log_level_t level, const void *buff, int len
408408
return 0;
409409
}
410410

411+
/**
412+
* @brief 等级滚动,返回改变后的等级字符串
413+
*
414+
* @param log
415+
* @return const char*
416+
*/
417+
size_t fc_log_level_roll(fc_log_t *log)
418+
{
419+
fc_assert(log != NULL);
420+
log->level = (fc_log_level_t)(log->level == FC_LOG_LEVEL_NONE ? FC_LOG_LEVEL_ALL : log->level - 1);
421+
return log->level;
422+
}
423+
424+
/**
425+
* @brief 获取等级字符串
426+
*
427+
* @param log
428+
* @return const char*
429+
*/
430+
const char *fc_log_level_name(fc_log_t *log)
431+
{
432+
fc_assert(log != NULL);
433+
switch (log->level)
434+
{
435+
case FC_LOG_LEVEL_ALL:
436+
return "all";
437+
case FC_LOG_LEVEL_ERROR:
438+
return "error";
439+
case FC_LOG_LEVEL_WARNING:
440+
return "warning";
441+
case FC_LOG_LEVEL_INFO:
442+
return "info";
443+
case FC_LOG_LEVEL_DEBUG:
444+
return "debug";
445+
case FC_LOG_LEVEL_VERBOSE:
446+
return "verbose";
447+
case FC_LOG_LEVEL_NONE:
448+
return "none";
449+
default:
450+
return "unknown";
451+
}
452+
}
453+
411454
/**
412455
* @brief 缓冲区输出
413456
*
@@ -472,8 +515,7 @@ fc_log_t default_log = {
472515
.file_user = {0}, // 临时对象中才会用到这个内存,其他都不用
473516
.f = {0},
474517
.level = FC_LOG_LEVEL_ALL,
475-
.last_level = FC_LOG_LEVEL_NONE, // 不限制,使用write的时候会继承这个等级
476-
.merge = false, // 默认不需要推迟输出
518+
.merge = false, // 默认不需要推迟输出
477519
};
478520

479521
// fc_log_t const *scope_log_ptr = NULL; // 设置为空指针!!!

core/fc_log.h

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,8 @@ struct _fc_log_t
203203
fc_log_alloc_t alloc;
204204
fc_log_write_t write;
205205

206-
fc_log_file_user_t file_user; // 缓冲输出的临时对象中才会使用
207-
FC_FILE f; // 输出对象,同样只在临时对象中才会使用
208-
fc_log_level_t last_level; // 记录上次临时log对象输出等级
206+
fc_log_file_user_t file_user; // 缓冲输出的临时对象中才会使用
207+
FC_FILE f; // 输出对象,同样只在临时对象中才会使用
209208

210209
fc_log_level_t level;
211210
bool merge; /**< 是否合并日志一并输出 */
@@ -227,7 +226,10 @@ extern "C"
227226

228227
// clang-format on
229228

230-
void fc_log_fflush(fc_log_t *log); // 输出缓冲区
229+
extern size_t fc_log_level_roll(fc_log_t *log); // 等级单次滚动(循环),返回改变后的等级
230+
extern const char *fc_log_level_name(fc_log_t *log); // 获取等级字符串
231+
232+
extern void fc_log_fflush(fc_log_t *log); // 输出缓冲区
231233
// extern size_t fc_log_lose(fc_log_t *log, int len); // 获取丢失日志长度
232234

233235
// 提供一份默认的弱函数log写丢失数据钩子,可以在外面重写
@@ -284,9 +286,10 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
284286

285287
//+********************************* 以下部分允许重入 **********************************/
286288
#undef fc_log_level
289+
#undef fc_log_lv_roll
290+
#undef fc_log_lv_name
287291

288292
#undef FC_LOG_MERGE
289-
#undef fc_log_level_record
290293
#undef fc_log_format
291294

292295
#undef fc_log_error
@@ -305,13 +308,19 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
305308

306309
//+********************************* 宏API **********************************/
307310

308-
// 切换log等级,使用宏API,无需显示指定对象名称,设置外部对象,临时对象继承等级不做控制避免歧义
311+
// 设置log等级,使用宏API,无需显示指定对象名称,设置外部对象,临时对象继承等级不做控制避免歧义
309312
#define fc_log_level(_level) \
310313
do \
311314
{ \
312315
fc_log_set_level((fc_log_t *)(&FC_LOG_OBJ), _level); \
313316
} while (0)
314317

318+
#define fc_log_lv_roll() \
319+
fc_log_level_roll((fc_log_t *)(&FC_LOG_OBJ))
320+
321+
#define fc_log_lv_name() \
322+
fc_log_level_name((fc_log_t *)(&FC_LOG_OBJ))
323+
315324
#if FC_LOG_ENABLE
316325

317326
// 统一实现:C和C++模式都不接受参数,避免兼容性问题
@@ -322,117 +331,104 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
322331
scope_log_ptr->merge = true, \
323332
fc_log_fflush(scope_log_ptr))
324333

325-
#define fc_log_level_record(_level) \
326-
do \
327-
{ \
328-
if (scope_log_ptr) \
329-
{ \
330-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
331-
if (SAFE_NAME(log_temp_ptr)->merge) \
332-
SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
333-
} \
334-
} while (0);
335-
336334
// 把fc_log_level_record在format中展开,减少一次do...while(0)的开销
337-
#define fc_log_format(text, _level, fmt, ...) \
338-
do \
339-
{ \
340-
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, text "" fmt "" FC_LOG_END, FC_LOG_PREFIX_CONTENT, ##__VA_ARGS__); \
341-
if (scope_log_ptr) \
342-
{ \
343-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
344-
if (SAFE_NAME(log_temp_ptr)->merge) \
345-
SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
346-
} \
335+
#define fc_log_format(text, _level, fmt, ...) \
336+
do \
337+
{ \
338+
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), \
339+
_level, \
340+
text "" fmt "" FC_LOG_END, \
341+
FC_LOG_PREFIX_CONTENT, \
342+
##__VA_ARGS__); \
347343
} while (0)
348344

349345
//+********************************* 期望使用 **********************************/
350346
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_ERROR
351347
#define fc_log_error(fmt, ...) \
352348
fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
353349
#else
354-
#define fc_log_error(fmt, ...) \
355-
fc_log_level_record(FC_LOG_LEVEL_ERROR)
350+
#define fc_log_error(fmt, ...) ((void)(0))
356351
#endif
357352

358353
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_WARNING
359354
#define fc_log_warning(fmt, ...) \
360355
fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
361356
#else
362-
#define fc_log_warning(fmt, ...) \
363-
fc_log_level_record(FC_LOG_LEVEL_WARNING)
357+
#define fc_log_warning(fmt, ...) ((void)(0))
364358
#endif
365359

366360
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_INFO
367361
#define fc_log_info(fmt, ...) \
368362
fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
369363
#else
370-
#define fc_log_info(fmt, ...) \
371-
fc_log_level_record(FC_LOG_LEVEL_INFO)
364+
#define fc_log_info(fmt, ...) ((void)(0))
372365
#endif
373366

374367
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_DEBUG
375368
#define fc_log_debug(fmt, ...) \
376369
fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
377370
#else
378-
#define fc_log_debug(fmt, ...) \
379-
fc_log_level_record(FC_LOG_LEVEL_DEBUG)
371+
#define fc_log_debug(fmt, ...) ((void)(0))
380372
#endif
381373

382374
#if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_VERBOSE
383375
#define fc_log_verbose(fmt, ...) \
384376
fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE, fmt, ##__VA_ARGS__)
385377
#else
386-
#define fc_log_verbose(fmt, ...) \
387-
fc_log_level_record(FC_LOG_LEVEL_VERBOSE)
378+
#define fc_log_verbose(fmt, ...) ((void)(0))
388379
#endif
389380

390-
#define fc_log_printf(fmt, ...) \
391-
do \
392-
{ \
393-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ); \
394-
if (SAFE_NAME(log_temp_ptr)->last_level <= FC_LOG_FILE_LEVEL) \
395-
fc_log_format("", SAFE_NAME(log_temp_ptr)->last_level, fmt, ##__VA_ARGS__); \
396-
} while (0)
397-
398-
#define fc_log_printf_lv(_level, fmt, ...) \
399-
do \
400-
{ \
401-
if (_level <= FC_LOG_FILE_LEVEL) \
402-
fc_log_format("", _level, fmt, ##__VA_ARGS__); \
403-
} while (0)
404-
405381
#define fc_log_assert(expr, ...) \
406382
if (!(expr)) \
407383
{ \
408384
fc_log_error("\"" #expr "\" assert failed at file: %s, line: %d\r\n", __FILE__, __LINE__); \
409385
__VA_ARGS__; \
410386
}
411387

388+
#define fc_log_printf(fmt, ...) \
389+
do \
390+
{ \
391+
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), FC_LOG_LEVEL_NONE, \
392+
"" fmt "" FC_LOG_END, \
393+
##__VA_ARGS__); \
394+
} while (0)
395+
396+
#define fc_log_printf_lv(_level, fmt, ...) \
397+
do \
398+
{ \
399+
if (_level <= FC_LOG_FILE_LEVEL) /* 开优化这里可以编译期处理 */ \
400+
{ \
401+
fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), \
402+
_level, \
403+
"" fmt "" FC_LOG_END, \
404+
##__VA_ARGS__); \
405+
} \
406+
} while (0)
407+
412408
/**
413409
* @brief fc_log_write如果是全局的则强制以最高等级输出,如果是fc_log_merge作用域内,则上一条log什么等级,接下来的write就以什么等级输出
414410
*
415411
*/
416-
#define fc_log_write(buf, len) \
417-
do \
418-
{ \
419-
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ); \
420-
fc_log_fwrite(SAFE_NAME(log_temp_ptr), SAFE_NAME(log_temp_ptr)->last_level, buf, len); \
412+
#define fc_log_write(buf, len) \
413+
do \
414+
{ \
415+
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), \
416+
FC_LOG_LEVEL_NONE, \
417+
buf, \
418+
len); \
421419
} while (0)
422420

423421
#define fc_log_write_lv(_level, buf, len) \
424422
do \
425423
{ \
426-
if (_level <= FC_LOG_FILE_LEVEL) \
424+
if (_level <= FC_LOG_FILE_LEVEL) /* 开优化这里可以编译期处理 */ \
427425
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len); \
428426
} while (0)
429427

430428
#else
431429
#define FC_LOG_MERGE // 空定义即可
432430

433431
// clang-format off
434-
435-
#define fc_log_level_record(_level) ((void)0)
436432
#define fc_log_format(text, level, fmt, ...) ((void)0)
437433
#define fc_log_error(fmt, ...) ((void)0)
438434
#define fc_log_warning(fmt, ...) ((void)0)

0 commit comments

Comments
 (0)