C语言打印Log

来源:互联网 发布:hdfs java创建目录 编辑:程序博客网 时间:2024/05/23 00:43

log.h 文件:

[cpp] view plain copy print?
  1. /** log.h **/  
  2.   
  3. #ifndef __LOG_H__  
  4. #define __LOG_H__  
  5. #include "stdio.h"  
  6. #include "string.h"  
  7. #include "stdlib.h"  
  8. #include "time.h"  
  9. #include "stdarg.h"  
  10. #include "unistd.h"  
  11.   
  12. #define MAXLEN (2048)  
  13. #define MAXFILEPATH (512)  
  14. #define MAXFILENAME (50)  
  15. typedef enum{  
  16.     ERROR_1=-1,  
  17.     ERROR_2=-2,  
  18.     ERROR_3=-3  
  19. }ERROR0;  
  20.   
  21.   
  22. typedef enum{  
  23.     NONE=0,  
  24.     INFO=1,  
  25.     DEBUG=2,  
  26.     WARN=3,  
  27.     ERROR=4,  
  28.     ALL=255  
  29. }LOGLEVEL;  
  30.   
  31. typedef struct log{  
  32.     char logtime[20];  
  33.     char filepath[MAXFILEPATH];  
  34.     FILE *logfile;  
  35. }LOG;  
  36.   
  37. typedef struct logseting{  
  38.     char filepath[MAXFILEPATH];  
  39.     unsigned int maxfilelen;  
  40.     unsigned char loglevel;  
  41. }LOGSET;  
  42.   
  43. int LogWrite(unsigned char loglevel,char *fromat,...);  
  44. #endif /* __LOG_H__ */  


log.c 文件:

[cpp] view plain copy print?
  1. /** log.c **/  
  2.   
  3. #include "log.h"  
  4. #define MAXLEVELNUM (3)  
  5.   
  6. LOGSET logsetting;  
  7. LOG loging;  
  8.   
  9. const static char LogLevelText[4][10]={"INFO","DEBUG","WARN","ERROR"};  
  10.   
  11. static char * getdate(char *date);  
  12.   
  13. static unsigned char getcode(char *path){  
  14.     unsigned char code=255;  
  15.     if(strcmp("INFO",path)==0)  
  16.         code=1;  
  17.     else if(strcmp("WARN",path)==0)  
  18.         code=3;  
  19.     else if(strcmp("ERROR",path)==0)  
  20.         code=4;  
  21.     else if(strcmp("NONE",path)==0)  
  22.         code=0;  
  23.     else if(strcmp("DEBUG",path)==0)  
  24.         code=2;  
  25.     return code;  
  26. }  
  27.   
  28. static unsigned char ReadConfig(char *path){  
  29.     char value[512]={0x0};  
  30.     char data[50]={0x0};  
  31.   
  32.     FILE *fpath=fopen(path,"r");  
  33.     if(fpath==NULL)  
  34.         return -1;  
  35.     fscanf(fpath,"path=%s\n",value);  
  36.     getdate(data);  
  37.     strcat(data,".log");  
  38.     strcat(value,"/");  
  39.     strcat(value,data);  
  40.     if(strcmp(value,logsetting.filepath)!=0)  
  41.         memcpy(logsetting.filepath,value,strlen(value));  
  42.     memset(value,0,sizeof(value));  
  43.   
  44.     fscanf(fpath,"level=%s\n",value);  
  45.     logsetting.loglevel=getcode(value);  
  46.     fclose(fpath);  
  47.     return 0;  
  48. }  
  49. /* 
  50.  *日志设置信息 
  51.  * */  
  52. static LOGSET *getlogset(){  
  53.     char path[512]={0x0};  
  54.     getcwd(path,sizeof(path));  
  55.     strcat(path,"/log.conf");  
  56.     if(access(path,F_OK)==0){  
  57.         if(ReadConfig(path)!=0){  
  58.             logsetting.loglevel=INFO;  
  59.             logsetting.maxfilelen=4096;  
  60.         }  
  61.     }else{  
  62.         logsetting.loglevel=INFO;  
  63.         logsetting.maxfilelen=4096;  
  64.     }  
  65.     return &logsetting;  
  66. }  
  67.   
  68. /* 
  69.  *获取日期 
  70.  * */  
  71. static char * getdate(char *date){  
  72.     time_t timer=time(NULL);  
  73.     strftime(date,11,"%Y-%m-%d",localtime(&timer));  
  74.     return date;  
  75. }  
  76.   
  77. /* 
  78.  *获取时间 
  79.  * */  
  80. static void settime(){  
  81.     time_t timer=time(NULL);  
  82.     strftime(loging.logtime,20,"%Y-%m-%d %H:%M:%S",localtime(&timer));  
  83. }  
  84.   
  85. /* 
  86.  *不定参打印 
  87.  * */  
  88. static void PrintfLog(char * fromat,va_list args){  
  89.     int d;  
  90.     char c,*s;  
  91.     while(*fromat)  
  92.     {  
  93.         switch(*fromat){  
  94.             case 's':{  
  95.                 s = va_arg(args, char *);  
  96.                 fprintf(loging.logfile,"%s",s);  
  97.                 break;}  
  98.             case 'd':{  
  99.                 d = va_arg(args, int);  
  100.                 fprintf(loging.logfile,"%d",d);  
  101.                 break;}  
  102.             case 'c':{  
  103.                 c = (char)va_arg(args, int);  
  104.                 fprintf(loging.logfile,"%c",c);  
  105.                 break;}  
  106.             default:{  
  107.                 if(*fromat!='%'&&*fromat!='\n')  
  108.                     fprintf(loging.logfile,"%c",*fromat);  
  109.                 break;}  
  110.         }  
  111.         fromat++;  
  112.     }  
  113.     fprintf(loging.logfile,"%s","\n");  
  114. }  
  115.   
  116. static int initlog(unsigned char loglevel){  
  117.     char strdate[30]={0x0};  
  118.     LOGSET *logsetting;  
  119.     //获取日志配置信息  
  120.     if((logsetting=getlogset())==NULL){  
  121.         perror("Get Log Set Fail!");  
  122.         return -1;  
  123.     }  
  124.     if((loglevel&(logsetting->loglevel))!=loglevel)  
  125.         return -1;  
  126.   
  127.     memset(&loging,0,sizeof(LOG));  
  128.     //获取日志时间  
  129.     settime();  
  130.     if(strlen(logsetting->filepath)==0){  
  131.         char *path=getenv("HOME");  
  132.         memcpy(logsetting->filepath,path,strlen(path));  
  133.   
  134.         getdate(strdate);  
  135.         strcat(strdate,".log");  
  136.         strcat(logsetting->filepath,"/");  
  137.         strcat(logsetting->filepath,strdate);  
  138.     }  
  139.     memcpy(loging.filepath,logsetting->filepath,MAXFILEPATH);  
  140.     //打开日志文件  
  141.     if(loging.logfile==NULL)  
  142.         loging.logfile=fopen(loging.filepath,"a+");  
  143.     if(loging.logfile==NULL){  
  144.         perror("Open Log File Fail!");  
  145.         return -1;  
  146.     }  
  147.     //写入日志级别,日志时间  
  148.     fprintf(loging.logfile,"[%s] [%s] ",LogLevelText[loglevel-1],loging.logtime);  
  149.     return 0;  
  150. }  
  151.   
  152. /* 
  153.  *日志写入 
  154.  * */  
  155. int LogWrite(unsigned char loglevel,char *fromat,...)  
  156. {  
  157.     int  rtv = -1;  
  158.     va_list args;  
  159.       
  160.     //[为支持多线程需要加锁] pthread_mutex_lock(&mutex_log); //lock.   
  161.       
  162.     do{  
  163.         //初始化日志  
  164.         if(initlog(loglevel) != 0)  
  165.         {  
  166.             rtv = -1;  
  167.             break;  
  168.         }  
  169.         //打印日志信息  
  170.         va_start(args,fromat);  
  171.         PrintfLog(fromat,args);  
  172.         va_end(args);  
  173.         //文件刷出  
  174.         fflush(loging.logfile);  
  175.         //日志关闭  
  176.         if(loging.logfile!=NULL)  
  177.             fclose(loging.logfile);  
  178.         loging.logfile=NULL;  
  179.         rtv = 0;  
  180.     }while(0);  
  181.       
  182.     //[为支持多线程需要加锁] pthread_mutex_unlock(&mutex_log); //unlock.   
  183.       
  184.     return rtv;  
  185. }  




test.c 文件:

[cpp] view plain copy print?
  1. /** test.c **/  
  2.   
  3. #include "stdio.h"  
  4. #include "stdlib.h"  
  5. #include "log.h"  
  6. int main(int argv,char**argc){  
  7.     printf("%s\n",argc[0]);  
  8.     LogWrite(INFO,"%s","Hello World!");  
  9.     LogWrite(DEBUG,"%s","H.e.l.l.o W.o.r.l.d!");  
  10.     LogWrite(WARN,"%s","H e l l o W o r l d!");  
  11.     LogWrite(ERROR,"%s","Hallo World!");  
  12.     return 0;  
  13. }  


log.conf 文件:

[cpp] view plain copy print?
  1. path=./temp  
  2. level=ALL