我们都知道在写代码的时候日志是必不可少的,那么该如何写日志呢,请往下看:
以前我是这么写日志的:
用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