关于使用C语言封装日志等级打印函数的记录

今天在写代码的时候,使用printf打印log信息,发现到处都是printf的输出,不方便查看log信息,想到以前项目中根据log等级来区分的方法,并打印代码所在行,函数,文件名。从网上又查找了其他的宏定义颜色的资料,将颜色用来区分log等级,在此记录下。

代码如下:

#define ESC_START     "\033["
#define ESC_END       "\033[0m"
#define COLOR_FATAL   "31;40;5m"
#define COLOR_ALERT   "31;40;1m"
#define COLOR_CRIT    "31;40;1m"
#define COLOR_ERROR   "31;40;1m"
#define COLOR_WARN    "33;40;1m"
#define COLOR_NOTICE  "34;40;1m"
#define COLOR_INFO    "32;40;1m"
#define COLOR_DEBUG   "36;40;1m"
#define COLOR_TRACE   "37;40;1m"

#define TRACE_INFO(format, args...) (printf( ESC_START COLOR_INFO "[INFO]-[%s]-[%s]-[%d]: \n" format ESC_END, __FILE__, __FUNCTION__ , __LINE__, ##args)) 
#define TRACE_DEBUG(format, args...) (printf( ESC_START COLOR_DEBUG "[DEBUG]-[%s]-[%s]-[%d]:\n" format ESC_END, __FILE__, __FUNCTION__ , __LINE__, ##args)) 
#define TRACE_WARN(format, args...) (printf( ESC_START COLOR_WARN "[WARN]-[%s]-[%s]-[%d]:\n" format ESC_END, __FILE__, __FUNCTION__ , __LINE__, ##args))
#define TRACE_ERROR(format, args...) (printf( ESC_START COLOR_ERROR "[ERROR]-[%s]-[%s]-[%d]:\n" format ESC_END, __FILE__, __FUNCTION__ , __LINE__, ##args))
使用举例:

    TRACE_INFO();
    TRACE_WARN("%d\n",10);
    TRACE_ERROR("%s\n","error");
    TRACE_DEBUG("Debug\n");

测试结果:

遗留问题:打印文件名的时候使用__FILE__,会将文件目录一起打印出来,目前还没找到方法只打印文件名,不打印文件目录。

遗留问题已经解决,参看:https://blog.csdn.net/cozhzh/article/details/88398830

C语言标准库中并没有直接提供`snprintf`的封装,因为`snprintf`本身就是C标准库提供的功能,它用于将格式化的字符串写入到内存缓冲区而不是特定的文件或其他输出流。不过,如果你想创建一个类似封装,可以模拟其工作流程并在需要的时候添加一些额外的功能或错误处理。 以下是一个简单的封装示例: ```c #include <stdio.h> #include <stdlib.h> #include <stdarg.h> // 定义封装后的snprintf函数 char* snprintf_wrap(char *buffer, size_t max_size, const char *format, ...) { va_list args; int len; // 初始化va_list用于传递变长参数 va_start(args, format); // 使用实际的snprintf函数 len = vsnprintf(buffer, max_size, format, args); // 如果写入的字符数大于等于max_size,说明可能会溢出,返回负数表示错误 if (len >= max_size) { buffer[max_size - 1] = '\0'; // 设置结果结束符防止数据丢失 return NULL; // 或者抛出自定义错误 } buffer[len] = '\0'; // 添加字符串结束符 va_end(args); // 清理va_list return buffer; } // 示例用法 int main() { char output[50]; if (snprintf_wrap(output, sizeof(output), "Hello, %s! Your age is %d", "World", 25) == NULL) { printf("Error occurred while formatting string.\n"); } else { printf("%s\n", output); } return 0; } ``` 在这个封装中,我们添加了检查是否溢出的部分,并在发生错误时返回NULL。你可以根据需求进一步定制这个封装,例如添加日志记录、异常处理等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值