日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言编程日志,用C语言打印日志(Log)

發(fā)布時(shí)間:2024/7/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言编程日志,用C语言打印日志(Log) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

用C語言打印日志(Log)

直接上源代碼。

log.h 文件:

/** log.h **/

#ifndef __LOG_H__

#define __LOG_H__

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#include "time.h"

#include "stdarg.h"

#include "unistd.h"

#define MAXLEN (2048)

#define MAXFILEPATH (512)

#define MAXFILENAME (50)

typedef enum{

ERROR_1=-1,

ERROR_2=-2,

ERROR_3=-3

}ERROR0;

typedef enum{

NONE=0,

INFO=1,

DEBUG=2,

WARN=3,

ERROR=4,

ALL=255

}LOGLEVEL;

typedef struct log{

char logtime[20];

char filepath[MAXFILEPATH];

FILE *logfile;

}LOG;

typedef struct logseting{

char filepath[MAXFILEPATH];

unsigned int maxfilelen;

unsigned char loglevel;

}LOGSET;

int LogWrite(unsigned char loglevel,char *fromat,...);

#endif /* __LOG_H__ */

log.c 文件:

/** log.c **/

#include "log.h"

#define MAXLEVELNUM (3)

LOGSET logsetting;

LOG loging;

const static char LogLevelText[4][10]={"INFO","DEBUG","WARN","ERROR"};

static char * getdate(char *date);

static unsigned char getcode(char *path){

unsigned char code=255;

if(strcmp("INFO",path)==0)

code=1;

else if(strcmp("WARN",path)==0)

code=3;

else if(strcmp("ERROR",path)==0)

code=4;

else if(strcmp("NONE",path)==0)

code=0;

else if(strcmp("DEBUG",path)==0)

code=2;

return code;

}

static unsigned char ReadConfig(char *path){

char value[512]={0x0};

char data[50]={0x0};

FILE *fpath=fopen(path,"r");

if(fpath==NULL)

return -1;

fscanf(fpath,"path=%s\n",value);

getdate(data);

strcat(data,".log");

strcat(value,"/");

strcat(value,data);

if(strcmp(value,logsetting.filepath)!=0)

memcpy(logsetting.filepath,value,strlen(value));

memset(value,0,sizeof(value));

fscanf(fpath,"level=%s\n",value);

logsetting.loglevel=getcode(value);

fclose(fpath);

return 0;

}

/*

*日志設(shè)置信息

* */

static LOGSET *getlogset(){

char path[512]={0x0};

getcwd(path,sizeof(path));

strcat(path,"/log.conf");

if(access(path,F_OK)==0){

if(ReadConfig(path)!=0){

logsetting.loglevel=INFO;

logsetting.maxfilelen=4096;

}

}else{

logsetting.loglevel=INFO;

logsetting.maxfilelen=4096;

}

return &logsetting;

}

/*

*獲取日期

* */

static char * getdate(char *date){

time_t timer=time(NULL);

strftime(date,11,"%Y-%m-%d",localtime(&timer));

return date;

}

/*

*獲取時(shí)間

* */

static void settime(){

time_t timer=time(NULL);

strftime(loging.logtime,20,"%Y-%m-%d %H:%M:%S",localtime(&timer));

}

/*

*不定參打印

* */

static void PrintfLog(char * fromat,va_list args){

int d;

char c,*s;

while(*fromat)

{

switch(*fromat){

case 's':{

s = va_arg(args, char *);

fprintf(loging.logfile,"%s",s);

break;}

case 'd':{

d = va_arg(args, int);

fprintf(loging.logfile,"%d",d);

break;}

case 'c':{

c = (char)va_arg(args, int);

fprintf(loging.logfile,"%c",c);

break;}

default:{

if(*fromat!='%'&&*fromat!='\n')

fprintf(loging.logfile,"%c",*fromat);

break;}

}

fromat++;

}

fprintf(loging.logfile,"%s","]\n");

}

static int initlog(unsigned char loglevel){

char strdate[30]={0x0};

LOGSET *logsetting;

//獲取日志配置信息

if((logsetting=getlogset())==NULL){

perror("Get Log Set Fail!");

return -1;

}

if((loglevel&(logsetting->loglevel))!=loglevel)

return -1;

memset(&loging,0,sizeof(LOG));

//獲取日志時(shí)間

settime();

if(strlen(logsetting->filepath)==0){

char *path=getenv("HOME");

memcpy(logsetting->filepath,path,strlen(path));

getdate(strdate);

strcat(strdate,".log");

strcat(logsetting->filepath,"/");

strcat(logsetting->filepath,strdate);

}

memcpy(loging.filepath,logsetting->filepath,MAXFILEPATH);

//打開日志文件

if(loging.logfile==NULL)

loging.logfile=fopen(loging.filepath,"a+");

if(loging.logfile==NULL){

perror("Open Log File Fail!");

return -1;

}

//寫入日志級(jí)別,日志時(shí)間

fprintf(loging.logfile,"[%s] [%s]:[",LogLevelText[loglevel-1],loging.logtime);

return 0;

}

/*

*日志寫入

* */

int LogWrite(unsigned char loglevel,char *fromat,...){

va_list args;

//初始化日志

if(initlog(loglevel)!=0)

return -1;

//打印日志信息

va_start(args,fromat);

PrintfLog(fromat,args);

va_end(args);

//文件刷出

fflush(loging.logfile);

//日志關(guān)閉

if(loging.logfile!=NULL)

fclose(loging.logfile);

loging.logfile=NULL;

return 0;

}

test.c 文件:

/** test.c **/

#include "stdio.h"

#include "stdlib.h"

#include "log.h"

int main(int argv,char**argc){

printf("%s\n",argc[0]);

LogWrite(INFO,"%s","Hello World!");

LogWrite(DEBUG,"%s","H.e.l.l.o W.o.r.l.d!");

LogWrite(WARN,"%s","H e l l o W o r l d!");

LogWrite(ERROR,"%s","Hallo World!");

return 0;

}

log.conf 文件:

path=./temp

level=ALL

總結(jié)

以上是生活随笔為你收集整理的C语言编程日志,用C语言打印日志(Log)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。