2323 #include "fc_pool.h"
2424 #include "fc_stdio.h"
2525
26- #ifndef FC_LOG_NOPREFIX_API
27- #define FC_LOG_NOPREFIX_API 1 /**< 提供不带(fc_)前缀的log宏API */
28- #endif
29-
3026 #ifndef FC_LOG_ENABLE
3127 #define FC_LOG_ENABLE 1 /**< 使能log */
3228 #endif
3329
30+ // clang-format off
31+
32+ #undef FC_LOG_LEVEL_NONE
33+ #undef FC_LOG_LEVEL_ERROR
34+ #undef FC_LOG_LEVEL_WARNING
35+ #undef FC_LOG_LEVEL_INFO
36+ #undef FC_LOG_LEVEL_DEBUG
37+ #undef FC_LOG_LEVEL_VERBOSE
38+ #undef FC_LOG_LEVEL_ALL
39+
40+ #define FC_LOG_LEVEL_NONE 0 /**< 屏蔽所有/无视等级 */
41+ #define FC_LOG_LEVEL_ERROR 1 /**< 错误 */
42+ #define FC_LOG_LEVEL_WARNING 2 /**< 警告 */
43+ #define FC_LOG_LEVEL_INFO 3 /**< 消息 */
44+ #define FC_LOG_LEVEL_DEBUG 4 /**< 调试 */
45+ #define FC_LOG_LEVEL_VERBOSE 5 /**< 冗余 */
46+ #define FC_LOG_LEVEL_ALL 6 /**< 所有日志 */
47+
48+ // clang-format on
49+
50+ #ifndef FC_LOG_FILE_LEVEL
51+ #define FC_LOG_FILE_LEVEL FC_LOG_LEVEL_ALL /**< 所在文件允许输出log等级 */
52+ #endif
53+
54+ #ifndef FC_LOG_NOPREFIX_API
55+ #define FC_LOG_NOPREFIX_API 1 /**< 提供不带(fc_)前缀的log宏API */
56+ #endif
57+
3458 #ifndef FC_LOG_LINE_SIZE
3559 #define FC_LOG_LINE_SIZE 128 /**< log行缓冲大小 */
3660 #endif
129153 #define FC_VERBOSE_TEXT FC_LOG_VERBOSE_HEAD FC_LOG_PREFIX_FMT FC_LOG_FMT_END
130154 #endif
131155
132- typedef enum
133- {
134- FC_LOG_NONE = 0 , /**< 屏蔽所有/无视等级 */
135- FC_LOG_ERROR = 1 , /**< 错误 */
136- FC_LOG_WRANING = 2 , /**< 警告 */
137- FC_LOG_INFO = 3 , /**< 消息 */
138- FC_LOG_DEBUG = 4 , /**< 调试 */
139- FC_LOG_VERBOSE = 5 , /**< 冗余 */
140- FC_LOG_ALL = 6 , /**< 所有日志 */
141- } fc_log_level_t ;
142-
143156// clang-format on
144157
145158// 存在多次获取,但是释放仅释放一次
@@ -151,6 +164,7 @@ typedef enum
151164} fc_log_alloc_type_t ;
152165
153166//+********************************* 面向对象 **********************************/
167+ typedef uint8_t fc_log_level_t ; // log等级类型
154168typedef struct _fc_log_t fc_log_t ;
155169typedef struct _fc_log_mem_t fc_log_mem_t ;
156170typedef struct _fc_log_file_user_t fc_log_file_user_t ; // 传递给write函数的用户数据
@@ -230,7 +244,7 @@ extern fc_log_t default_log; // 默认log对象
230244 #define FC_LOG_OBJ (default_log)
231245 #endif
232246
233- extern fc_log_t const * scope_log_ptr ; // 设置为空指针 !!!
247+ static fc_log_t const * const scope_log_ptr = NULL ; // 强制空指针 !!!,强烈建议O1及以上优化可以省非常多空间
234248
235249 #ifndef FC_LOG_LOSE_HOOK
236250 /* #define FC_LOG_LOSE_HOOK(exp, log, len) (void)(0) */
@@ -303,36 +317,43 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
303317 #define fc_log_merge_0 () \
304318 fc_log_merge_1({ (void)0; })
305319
320+ // 根据参数展开为0/1/2个参数的版本,超过2将报错,可以用复合语句{exp1;exp2...expN}算一个参数
306321 #define fc_log_merge (...) \
307322 FC_CONNECT2(fc_log_merge_, __PLOOC_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
308323
309- #define fc_log_format (text , _level , fmt , ...) \
310- do \
311- { \
312- 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__); \
324+ #define fc_log_format (text , _level , fmt , ...) \
325+ do \
326+ { \
327+ if (_level <= FC_LOG_FILE_LEVEL) \
328+ 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__); \
329+ if (scope_log_ptr) \
330+ { \
331+ fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
332+ SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
333+ } \
313334 } while (0 )
314335
315- //+********************************* 期望使用 **********************************/
336+ //+********************************* 期望使用 **********************************/
316337 #define fc_log_error (fmt , ...) \
317- fc_log_format(FC_ERROR_TEXT, FC_LOG_ERROR , fmt, ##__VA_ARGS__)
338+ fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR , fmt, ##__VA_ARGS__)
318339
319340 #define fc_log_warning (fmt , ...) \
320- fc_log_format(FC_WARNING_TEXT, FC_LOG_WRANING , fmt, ##__VA_ARGS__)
341+ fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING , fmt, ##__VA_ARGS__)
321342
322343 #define fc_log_info (fmt , ...) \
323- fc_log_format(FC_INFO_TEXT, FC_LOG_INFO , fmt, ##__VA_ARGS__)
344+ fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO , fmt, ##__VA_ARGS__)
324345
325346 #define fc_log_debug (fmt , ...) \
326- fc_log_format(FC_DEBUG_TEXT, FC_LOG_DEBUG , fmt, ##__VA_ARGS__)
347+ fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG , fmt, ##__VA_ARGS__)
327348
328349 #define fc_log_verbose (fmt , ...) \
329- fc_log_format(FC_VERBOSE_TEXT, FC_LOG_VERBOSE , fmt, ##__VA_ARGS__)
350+ fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE , fmt, ##__VA_ARGS__)
330351
331352 #define fc_log_printf (fmt , ...) \
332- fc_log_format("", FC_LOG_NONE , fmt, ##__VA_ARGS__)
353+ fc_log_format("", (scope_log_ptr ? scope_log_ptr->last_level : FC_LOG_LEVEL_NONE) , fmt, ##__VA_ARGS__);
333354
334355 #define fc_log_printf_lv (_level , fmt , ...) \
335- fc_log_format("", _level, fmt, ##__VA_ARGS__)
356+ fc_log_format("", _level, fmt, ##__VA_ARGS__);
336357
337358 #define fc_log_assert (expr , ...) \
338359 if (!(expr)) \
@@ -352,10 +373,11 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
352373 fc_log_fwrite(SAFE_NAME(log_temp_ptr), SAFE_NAME(log_temp_ptr)->last_level, buf, len); \
353374 } while (0)
354375
355- #define fc_log_write_lv (_level , buf , len ) \
356- do \
357- { \
358- fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len); \
376+ #define fc_log_write_lv (_level , buf , len ) \
377+ do \
378+ { \
379+ if (_level <= FC_LOG_FILE_LEVEL) \
380+ fc_log_fwrite((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, buf, len); \
359381 } while (0)
360382
361383#else
@@ -420,3 +442,4 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
420442
421443// 除了 FC_LOG_FMT_END 定义结尾外,还可以使用如下宏在每句log后面添加特定内容如换行
422444// #define user_printf(fmt, ...) fc_log_printf(fmt "\r\n", ##__VA_ARGS__)
445+ // #define info_printf(fmt, ...) fc_log_info(fmt "\r\n", ##__VA_ARGS__)
0 commit comments