参考资料:https://www.nowcoder.com/tutorial/10002/fcd40e1122274be3be775baac85abee5
网址是个好网址,记得保存哈,里面有些小小错误,问题不大
参考xrf,感谢xrf
思考:
如何phexlog(1, buf, buf_len, "这句话之后跟数组数据,即[HEX][len: %d]{11 22 33 44}", 4);
要求输出文字+数据
ps:转载请注明,不要复制粘贴就是你的了,搜问题时好几个网址都是一模一样的回答,好家伙则无语。
有问题就问,我看到就回复
TODO:是求大佬解答或待办事项
代码如下:
#line 1 "hahaha" //配合SourceInsight查看行代码很舒服啊
/* 0001_plog.c */
//TODO:时间选择plog时间和plog里面时间有无区别
//TODO:如何对__VA_RAGS__处理,使得可变参数为0时,不需要人为写0
//TODO:如何实现通过udp发送到ubuntu,利用其日志系统记录大量毫秒级多字节的日志,并自动按时间,限定大小分成带时间的日志文件
//ps:日志最好有个任务专门通过消息队列接收并发送出去,小心卡死
#include<stdarg.h>
#include<stdio.h>
#include<string.h>
#define plog(type, last_arg_format, ...) os_printf_plog(__FILE__, __LINE__, type, last_arg_format, __VA_ARGS__)
// 下面是错误声明,别小瞧,我就这么粗心了,一开始以为c99不支持,找了好久才发现问题
//#define myplog(type, last_arg_format, ...) os_printf_plog(__FILE__, __LINE__, int type, const char *last_arg_format, __VA_ARGS__)
int os_printf_plog(const char *file_name, int line, int type, const char *last_arg_format, ...)
{
unsigned char buf[1024] = {0}; // 日志存放缓存,注意数组大小,不要越界
int buf_len = 0;
// 日志通过udp发出去,现简单为打印在屏幕上
// 日志格式:区分1 区分2 优先级 [时间 ] [DEVICE_1 ] [FILE_NAME ] [LINE xxxx] [TYPE ] 这是个日志测试例!
// 区分1 区分2 优先级 均不可见,与日志服务器通过私有协议用来区分不同设备,不同功能等,优先级可在函数中再加一个priority来,当前简化为1
// [] 开始往后都是可见内容 时间 设备名 程序文件名 所在行数 类型区分 要输出的东西
// 区分1 区分2 优先级 随便写的,为清晰显示用字符以防数字赋值不可见
buf[0] = 'A';
buf[1] = 'B';
buf[2] = 'C';
buf_len = buf_len + 3;
// [时间] [设备名]
unsigned char str1[1024] = "[2021-10-19 21:02.493] [CJ ] ";
sprintf((char *)&buf[buf_len], "%s", str1);
buf_len = buf_len + strlen(str1); // 这里最好不要strlen(buf)以防意外遇到'\0'结束,导致长度不对
// [文件名] [所在行数] [TYPE]
unsigned char str2[1024] = {0};
sprintf((char *)&str2, "[%-10.8s] [LINE %04d] [%-10.8s] ",
file_name, line + 1, "DEBUG"); // 其实可以和时间设备名合起来,TYPE由type通过一个函数得到,简化为"DEBUG"了
sprintf((char *)&buf[buf_len], "%s", str2);
buf_len = buf_len + strlen(str2);
//正文
va_list arg;
va_start(arg, last_arg_format);
vsprintf((char *)&buf[buf_len], last_arg_format, arg);
printf("%s", buf);
va_end(arg);
return 0;
}
int main()
{
plog(12, "这是个日志测试例!\n", 0);
int a = 10;
plog(1, "这是个日志测试例!a = %d\n", a);
}
// 输出结果
// 环境:ubuntu
#if 0
cj@cj-u64:/mnt/hgfs/cj_code/C/test/code$ gcc 0001_plog.c
cj@cj-u64:/mnt/hgfs/cj_code/C/test/code$ ./a.out
ABC[2021-10-19 21:02.493] [CJ ] [0001_plo ] [LINE 0059] [DEBUG ] 这是个日志测试例!
ABC[2021-10-19 21:02.493] [CJ ] [0001_plo ] [LINE 0061] [DEBUG ] 这是个日志测试例!a = 10
cj@cj-u64:/mnt/hgfs/cj_code/C/test/code$ gcc 0001_plog.c //此时增加第一行代码#line 1 "hahaha"
cj@cj-u64:/mnt/hgfs/cj_code/C/test/code$ ./a.out
ABC[2021-10-19 21:02.493] [CJ ] [hahaha ] [LINE 0059] [DEBUG ] 这是个日志测试例!
ABC[2021-10-19 21:02.493] [CJ ] [hahaha ] [LINE 0061] [DEBUG ] 这是个日志测试例!a = 10
cj@cj-u64:/mnt/hgfs/cj_code/C/test/code$ gcc 0001_plog.c //此时更改为line+1 记得加1,行号才对的上
cj@cj-u64:/mnt/hgfs/cj_code/C/test/code$ ./a.out
ABC[2021-10-19 21:02.493] [CJ ] [hahaha ] [LINE 0060] [DEBUG ] 这是个日志测试例!
ABC[2021-10-19 21:02.493] [CJ ] [hahaha ] [LINE 0062] [DEBUG ] 这是个日志测试例!a = 10
#endif
// 注意文件名输出情况
// 注意点:
#if 0
1. #line 1 "file_name"
2. __FILE__, __LINE__, __VA_ARGS__
3. #define xxxx xxxxx
4. sprintf, printf, vsprintf, va_list, va_start, va_end, va_arg
5. strlen
6. if 0 #endif
#endif