C语言打印Log
来源:互联网 发布:hdfs java创建目录 编辑:程序博客网 时间:2024/05/23 00:43
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;
- }
- /*
- *日志设置信息
- * */
- 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;
- }
- /*
- *获取时间
- * */
- 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));
- //获取日志时间
- 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;
- }
- //写入日志级别,日志时间
- fprintf(loging.logfile,"[%s] [%s] ",LogLevelText[loglevel-1],loging.logtime);
- return 0;
- }
- /*
- *日志写入
- * */
- int LogWrite(unsigned char loglevel,char *fromat,...)
- {
- int rtv = -1;
- va_list args;
- //[为支持多线程需要加锁] pthread_mutex_lock(&mutex_log); //lock.
- do{
- //初始化日志
- if(initlog(loglevel) != 0)
- {
- rtv = -1;
- break;
- }
- //打印日志信息
- va_start(args,fromat);
- PrintfLog(fromat,args);
- va_end(args);
- //文件刷出
- fflush(loging.logfile);
- //日志关闭
- if(loging.logfile!=NULL)
- fclose(loging.logfile);
- loging.logfile=NULL;
- rtv = 0;
- }while(0);
- //[为支持多线程需要加锁] pthread_mutex_unlock(&mutex_log); //unlock.
- return rtv;
- }
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
阅读全文
0 0
- C语言打印Log
- C语言如何打印LOG
- c 语言变参函数log打印
- 用C语言打印日志(Log)
- Log打印技巧(C语言实现)
- linux环境应用程序LOG日志打印(C语言)
- 使用jni实现在C语言中打印log信息
- linux下C语言编程打印log日志
- NDK C打印log
- c/c++层log打印
- c语言,打印百分号
- C语言打印菱形
- C语言打印日历
- C语言打印自己
- C语言打印万年历
- C语言打印九九乘法表
- c语言打印菱形
- c语言打印九九乘法表
- 敏捷计划、估算考点
- Android 客户端直播实现
- JVM调优
- Android java.lang.IllegalArgumentException: Unterminated quote
- 利用神经网络识别手写数字
- C语言打印Log
- SQL Server 跨数据库查询
- iOS类别扩展无法识别添加方法
- 谈谈iOS中的网络
- HDFS For Java
- Vad for Detection
- JDK1.8的安装及配置
- FTPClient ftp.storeFile上传文件时服务器无响应的原因
- ARP知识,如何通过 ARP判断IP冲突