19#define PL_CSI_START "\033["
20#define PL_CSI_END "\033[0m"
22#if XF_LOG_CTYPE_IS_ENABLE
25#define isdigit(c) ((c) >= '0' && (c) <= '9')
28#if XF_LOG_STRLEN_IS_ENABLE
30#define xf_log_strlen(s) strlen(s)
33#if XF_LOG_VSNPRINTF_IS_ENABLE
35#define xf_log_vsprintf(buffer, maxlen, fmt, args) vsnprintf(buffer, maxlen, fmt, args)
54#if XF_LOG_FILTER_IS_ENABLE
72#if XF_LOG_FILTER_IS_ENABLE
83static size_t xf_log_color_format(
int log_obj_id, uint8_t level,
const char *tag,
const char *file, uint32_t line,
84 const char *func,
const char *fmt, va_list va);
98#if XF_LOG_COLORS_IS_ENABLE
128#if XF_LOG_FILTER_IS_ENABLE
144#if XF_LOG_FILTER_IS_ENABLE
203size_t xf_log(uint8_t level,
const char *tag,
const char *file, uint32_t line,
const char *func,
const char *fmt, ...)
213#if XF_LOG_FILTER_IS_ENABLE
218 if (filter.
level < level) {
220 }
else if (filter.
tag != NULL && filter.
tag == tag) {
222 }
else if (filter.
file != NULL && filter.
file == file) {
226 }
else if (filter.
b_or_w == 1) {
227 if (filter.
level < level) {
229 }
else if (filter.
tag != NULL && filter.
tag != tag) {
231 }
else if (filter.
file != NULL && filter.
file != file) {
248 va_start(args, format);
264 for (
int i = 0; i < index; i++) {
271 const char *p = format;
274 size_t total_length = 0;
275 size_t index = 0, used_index = 0;
281 const char *
start = p;
282 while (*p !=
'%' && *p !=
'\0') {
285 total_length += p -
start;
289 char *format_start = format_flag;
298 log_out(
"%", 1, arg);
300 }
else if (*p ==
's') {
302 va_copy(args_copy, va);
304 const char *
start = va_arg(args_copy,
const char *);
320 *format_start++ = *p++;
331 *format_start++ = *p++;
334 while (isdigit((
int)(*p))) {
336 *format_start++ = *p++;
344 *format_start++ = *p++;
349 *format_start++ = *p++;
352 while (isdigit((
int)(*p))) {
354 *format_start++ = *p++;
367 *format_start++ = *p++;
373 *format_start++ = *p++;
407 *format_start++ = *p++;
415 *format_start =
'\0';
417 va_copy(args_copy, va);
423 log_out(format_buffer, formatted_len, arg);
424 total_length += formatted_len;
426 int total_written = 0;
427 while (total_written < formatted_len) {
428 int remaining = formatted_len - total_written;
430 va_copy(args_copy, va);
432 xf_log_vsprintf(format_buffer, chunk_size + 1, format_flag, args_copy);
434 log_out(format_buffer, chunk_size, arg);
435 total_written += chunk_size;
437 total_length += total_written;
449 va_start(va, format);
456static size_t xf_log_color_format(
int log_obj_id, uint8_t level,
const char *tag,
const char *file, uint32_t line,
457 const char *func,
const char *fmt, va_list va)
463#if XF_LOG_COLORS_IS_ENABLE
464#if XF_LOG_FILTER_IS_ENABLE
472#if XF_LOG_FILTER_IS_ENABLE
485 if (level <=
s_log_obj[log_obj_id].info_level) {
493#if XF_LOG_COLORS_IS_ENABLE
494#if XF_LOG_FILTER_IS_ENABLE
502#if XF_LOG_FILTER_IS_ENABLE
void xf_log_set_filter_enable(int log_obj_id)
启用过滤器
void xf_log_set_time_func(xf_log_time_func_t log_time_func)
设置log的时间戳打印函数
void xf_log_set_filter_disable(int log_obj_id)
禁用过滤器
size_t xf_log(uint8_t level, const char *tag, const char *file, uint32_t line, const char *func, const char *fmt,...)
log打印函数
void xf_log_set_filter_file(int log_obj_id, const char *file)
设置过滤器的文件过滤
void xf_log_set_info_level(int log_obj_id, uint8_t level)
显示文件函数等信息的最小等级
void xf_log_set_filter_is_whitelist(int log_obj_id)
设置过滤器为白名单(仅其内容将被暴露)
void xf_log_set_filter_level(int log_obj_id, uint8_t level)
设置过滤器的等级过滤
void xf_log_set_filter_colorful_disable(int log_obj_id)
关闭彩色显示
void xf_log_set_filter_tag(int log_obj_id, const char *tag)
设置过滤器的标签过滤
void xf_log_set_filter_colorful_enable(int log_obj_id)
开启彩色显示
void xf_log_set_filter_is_blacklist(int log_obj_id)
设置过滤器为黑名单(其内容将被过滤)
#define XF_LOG_LVL_VERBOSE
static block_link_t start
闲内存块链表的起点和终点。 用户在注册的时候末尾 next_free_block 为 (void*) 0,block_size 为 0
void(* xf_log_out_t)(const char *str, size_t len, void *arg)
log 输出后端原型。
uint32_t(* xf_log_time_func_t)(void)
log 时间戳原型。
enum _xf_log_color_t xf_log_color_t
static const char s_lvl_to_prompt[]
static size_t xf_log_vprintf(xf_log_out_t log_out, void *arg, const char *format, va_list va)
#define xf_log_vsprintf(buffer, maxlen, fmt, args)
int xf_log_register_obj(xf_log_out_t out_func, void *user_args)
注册log后端是输出到哪里,其最大值受到 XF_LOG_OBJ_MAX 的限制
struct _xf_log_obj_t xf_log_obj_t
static void find_args_from_index(va_list *va, size_t index)
static size_t xf_log_printf_out(xf_log_out_t log_out, void *arg, const char *format,...)
static xf_log_obj_t s_log_obj[XF_LOG_OBJ_NUM]
static const uint8_t s_lvl_to_color[]
static size_t xf_log_color_format(int log_obj_id, uint8_t level, const char *tag, const char *file, uint32_t line, const char *func, const char *fmt, va_list va)
static xf_log_time_func_t s_log_time_func
struct _xf_log_filter_t xf_log_filter_t
#define XF_FORMAT_BUFFER_SIZE
#define XF_FORMAT_FLAG_SIZE
#define xf_log_printf(format,...)