@@ -177,14 +177,15 @@ struct _fc_log_file_user_t
177177
178178struct _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