参考资料: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