Skip to content

Commit ff7c1f6

Browse files
committed
feat: ✨ log组件merge输出的时候write输出为上一次的输出等级
1 parent 204922f commit ff7c1f6

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

core/fc_log.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ fc_weak void fc_log_fprintf(fc_log_t *log, fc_log_level_t level, const char *fmt
119119
fc_assert(log != NULL);
120120
fc_assert(log->alloc != NULL);
121121

122+
if (log->merge)
123+
{
124+
log->last_level = level; // 记录临时等级
125+
}
126+
122127
if (log->level >= level)
123128
{
124129
FC_FILE temp_f = {0};
@@ -243,6 +248,11 @@ int fc_log_fwrite(fc_log_t *log, fc_log_level_t level, const void *buff, int len
243248
{
244249
fc_assert(log != NULL);
245250

251+
if (log->merge)
252+
{
253+
log->last_level = level; // 记录临时等级
254+
}
255+
246256
if (log->level >= level)
247257
{
248258
FC_FILE temp_f = {0};
@@ -362,11 +372,14 @@ fc_weak size_t fc_log_write_lose_hook(fc_log_t *log, int len)
362372

363373
// 默认实例化对象
364374
fc_log_t default_log = {
365-
.level = FC_LOG_ALL,
375+
.lose_count = 0,
366376
.write = log_write_default,
367377
.alloc = log_alloc_default,
368378
.file_user = {0}, // 临时对象中才会用到这个内存,其他都不用
369-
.merge = false, // 默认不需要推迟输出
379+
.f = {0},
380+
.level = FC_LOG_ALL,
381+
.last_level = FC_LOG_NONE, // 不限制
382+
.merge = false, // 默认不需要推迟输出
370383
};
371384

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

core/fc_log.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,15 @@ struct _fc_log_file_user_t
177177

178178
struct _fc_log_t
179179
{
180+
size_t lose_count; // 丢失计数,可能存在多线程竞争问题,仅供参考
181+
180182
fc_log_alloc_t alloc;
181183
fc_log_write_t write;
182184

183185
fc_log_file_user_t file_user; // 缓冲输出的临时对象中才会使用
184186
FC_FILE f; // 输出对象,同样只在临时对象中才会使用
185187

186-
size_t lose_count; // 丢失计数,可能存在多线程竞争问题,仅供参考
187-
188+
fc_log_level_t last_level; // 记录log输出等级
188189
fc_log_level_t level;
189190
bool merge; /**< 是否合并日志一并输出 */
190191

@@ -260,6 +261,10 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
260261
//+********************************* 以下部分允许重入 **********************************/
261262
#undef fc_log_level
262263

264+
#undef fc_log_merge_2
265+
#undef fc_log_merge_1
266+
#undef fc_log_merge_0
267+
263268
#undef fc_log_merge
264269
#undef fc_log_format
265270

@@ -288,15 +293,12 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
288293

289294
#if FC_LOG_ENABLE
290295

291-
#undef fc_log_merge_2
292-
#define fc_log_merge_2(inter_expr, leave_expr) \
293-
fc_using(fc_log_t SAFE_NAME(log_obj) = FC_LOG_OBJ, *scope_log_ptr = &SAFE_NAME(log_obj), { SAFE_NAME(log_obj).merge = true; inter_expr; }, { fc_log_fflush(&SAFE_NAME(log_obj)); leave_expr; })
296+
#define fc_log_merge_2(enter_expr, leave_expr) \
297+
fc_using(fc_log_t SAFE_NAME(log_obj) = FC_LOG_OBJ, *scope_log_ptr = &SAFE_NAME(log_obj), { SAFE_NAME(log_obj).merge = true; enter_expr; }, {leave_expr; fc_log_fflush(&SAFE_NAME(log_obj)); })
294298

295-
#undef fc_log_merge_1
296-
#define fc_log_merge_1(inter_expr) \
297-
fc_log_merge_2(inter_expr, { (void)0; })
299+
#define fc_log_merge_1(enter_expr) \
300+
fc_log_merge_2(enter_expr, { (void)0; })
298301

299-
#undef fc_log_merge_0
300302
#define fc_log_merge_0() \
301303
fc_log_merge_1({ (void)0; })
302304

@@ -338,13 +340,27 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
338340
__VA_ARGS__; \
339341
}
340342

341-
#define fc_log_write(buf, len) \
342-
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), FC_LOG_NONE, buf, len)
343+
/**
344+
* @brief fc_log_write如果是全局的则强制以最高等级输出,如果是fc_log_merge作用域内,则上一条log什么等级,接下来的write就以什么等级输出
345+
*
346+
*/
347+
#define fc_log_write(buf, len) \
348+
do \
349+
{ \
350+
fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ); \
351+
fc_log_fwrite(SAFE_NAME(log_temp_ptr), SAFE_NAME(log_temp_ptr)->last_level, buf, len); \
352+
} while (0)
343353

344-
#define fc_log_write_lv(_level, buf, len) \
345-
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len)
354+
#define fc_log_write_lv(_level, buf, len) \
355+
do \
356+
{ \
357+
fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len); \
358+
} while (0)
346359

347360
#else
361+
#define fc_log_merge_2(enter_expr, leave_expr)
362+
#define fc_log_merge_1(enter_expr)
363+
#define fc_log_merge_0()
348364

349365
#define fc_log_merge(...) // 空定义即可
350366

0 commit comments

Comments
 (0)