70,023
社区成员




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX 128
int log_level;
void info(FILE *file, const char *format, ...);
void init_logger(struct stat *s, FILE **f, const char *path, int level);
int main(int argc, char *argv[]){
FILE *f;
struct stat s;
init_logger(&s, &f, "log", 4);
info(f, "hello %s, year %d", "huzilong", 2012);
return 0;
}
void init_logger(struct stat *s, FILE **f, const char *path, int level){//深度传形参f, f是一个临时指针变量
char temp[128] = {0};
time_t timer;
struct tm *now;
log_level = level;
time(&timer);
now = localtime(&timer);
sprintf(temp, "%s/%d%d%d.log", path, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
if(-1 == stat(path, s)){
puts("[warn]文件夹不存在");
mkdir(path, 777);
}
if(!(*f = fopen(temp, "a+"))){
puts("[error]open log file failed");
exit(-1);
}
}
void info(FILE *file, const char *format, ...){
int i, d;
unsigned int u;
void *p;
char c, *s, src[MAX] = {'\0'};//顺序遍历format
va_list argp = NULL;
va_start(argp, format);
for(i = 0; i < strlen(format) + 1; i++){
if(format[i] == '%'){
switch(format[i + 1]){
case 'd':
d = va_arg(argp, int);
sprintf(src, "%s%d", src, d);
i = i + 1;
break;
case 'c':
c = (char)va_arg(argp, int);
sprintf(src, "%s%c", src, c);
i = i + 1;
break;
case 's':
s = va_arg(argp, char *);
sprintf(src, "%s%s", src, s);
i = i + 1;
break;
case 'u':
u = va_arg(argp, unsigned int);
sprintf(src, "%s%u", src, u);
i = i + 1;
break;
case 'p':
p = va_arg(argp, void *);
sprintf(src, "%s%p", src, p);
i = i + 1;
break;
default:
break;
}
++format;
}else if('\0' == format[i]){
va_end(argp);
break;
}else{
sprintf(src, "%s%c", src, format[i]);
}
}
switch(log_level){
case 8:
case 4:
case 2:
case 1:
fputs(src, file);
fputs("\r\n", file);//Linux回车换行 \r\n
fflush(file);
default:
break;
}