C语言日志的实现,用宏实现日志

我们都知道在写代码的时候日志是必不可少的,那么该如何写日志呢,请往下看:
以前我是这么写日志的:
用fopen,open等创建好文件,然后将write,fwrite封装,这样就可以实现基本的日志。但是这样有很多弊端,比如写入的日志的行号,所在文件名,函数名等无法写入,这样的日志用着不太方面。

#include <stdio.h>  
#include <stdarg.h>  
#include <string.h>  
#include <time.h> 


int st_print(const char *fmt,...)
{
	
	char buf[1024] = {0};
	char buffer[10] = {0};
	char *s = NULL;
	char c;
	int d;
	
	va_list ap;
	va_start(ap,fmt);
	
	while(*fmt != '\0' )
	{
		if(*fmt == '%')
		{
			fmt++;
			if(*fmt == 's')
			{
				s = va_arg(ap,char *);
				strcat(buf,s);
			}
			else if(*fmt == 'd')
			{
				d = va_arg(ap,int);
				memset(buffer,0,sizeof(buffer));
				sprintf(buffer,"%d",d);
				strcat(buf,buffer);
			}
			
		}
		else
		{
			memset(buffer,0,sizeof(buffer));
			sprintf(buffer,"%c",*fmt);
			strcat(buf,buffer);
		}
		fmt++;
	}//end while
	
	FILE *fp = fopen("./log.log","a");
	if(fp == NULL)
	{
		printf("err\n");
		return -1;
	}
	int size = strlen(buf);
	int tmp = fwrite(buf,1,size,fp);
	
	
	return tmp;
}

int main()
{
	st_print("hahaha\n");
	
	return 0;
}


最近学习了一种新的方法,他能弥补上面所说的不足。其实是通过fprintf写入日志。
主要通过这句实现 #define message_r(...) st_print(__LINE__,__FILE__,##__VA_ARGS__)
其中message_r就是写日志的函数。
下面我们主要通过代码看一下:


注:这里我们就不将日志输入到文件了,直接输出到stdout,如果你想输入到文件,创建好文件后将stdout替换为你所创建的文件描述符即可,可参考上面的例子。


define.c 
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <time.h>

void st_print(int line,char *name,const char *fmt,...)
{
	int d;
	char *s;
	char c;
	char buf[1024] = {0};
	char buffer[10];
	va_list ap;
	va_start(ap,fmt);	

	while(*fmt != '\0')
	{
		if(*fmt == '%')
		{
			fmt++;
			if(*fmt == 's')
			{
				s = va_arg(ap,char *);
				strcat(buf,s);
			}
			else if(*fmt == 'd')
			{
				d = va_arg(ap,int);
				memset(buffer,0,10);				
				sprintf(buffer,"%d",d);
				strcat(buf,buffer);
			}
		}
		else
		{
			memset(buffer,0,10);
			sprintf(buffer,"%c",*fmt);
			strcat(buf,buffer);	
		}
		fmt++;
	}//end while
	
	time_t tt;
	tt = time(0);
	char *time = ctime(&tt);
	fprintf(stdout,"%d,%s,%s,%s",line,name,buf,time);
	va_end(ap);
	return;
}

#define message_r(...) st_print(__LINE__,__FILE__,##__VA_ARGS__)

int main()
{
	
	message_r("bbbb!");
	message_r("aaaa:[%s]!","hahahah");
	
	return 0;
}


然后编译运行
gcc -o main define.c
./main


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值