#ifndef _LOG_H #define _LOG_H #include <time.h> #include <string.h> #include <stdio.h> typedef enum LOG_LEVEL { LOG_LEVEL_DEBUG=0, LOG_LEVEL_INFO=1, LOG_LEVEL_WARNING=2, LOG_LEVEL_ERROR=3, LOG_LEVEL_CRITICAL=4, LOG_LEVEL_EVENT=5 }ENUM_LOG_LEVEL; extern FILE* fpPrint; extern time_t rawtime; extern struct tm* timeinfo; extern char* LogLevelName[]; extern unsigned char LogLevel; //日志初始化时使用 //_IOFBF --满BF _IONBF --无BF #define printFileBufType _IONBF//_IONBF直接从流中读入数据或直接向流中写入数据,而没有缓冲区 #define printFileBufSize 0 #define OpenPrintFile(strFileFullPath) \ fpPrint=fopen(strFileFullPath,"ab+");\ setvbuf(fpPrint,NULL,printFileBufType,printFileBufSize)//setvbuf把缓冲区与流相关 //结束时使用 #define ClosePrintFile() if(NULL!=(fpPrint))\ fclose(fpPrint);fpPrint=NULL //不带参的打印函数 #define DPIDebugPrint(level,fmt) \ if(((level)>=LogLevel) && (NULL!=fpPrint))\ {\ time(&rawtime);\ timeinfo=localtime(&rawtime);\ fprintf(fpPrint,"\n[%02d-%02d %02d:%02d:%02d.%03d][FILE:%15s][LINE:%4d][%s] "fmt,\ timeinfo->tm_mon+1,\ timeinfo->tm_mday,\ timeinfo->tm_hour,\ timeinfo->tm_min,\ timeinfo->tm_sec,\ (int)(rawtime%1000),\ strrchr(__FILE__,'\\')+1,\ __LINE__,\ LogLevelName[level]);\ } //带参的打印函数 #define DPIDebugPrintWithArgs(level,fmt,...) \ if(((level)>=LogLevel) && (NULL!=fpPrint))\ {\ time(&rawtime);\ timeinfo=localtime(&rawtime);\ fprintf(fpPrint,"\n[%02d-%02d %02d:%02d:%02d.%03d][FILE:%15s][LINE:%4d][%s] "fmt,\ timeinfo->tm_mon+1,\ timeinfo->tm_mday,\ timeinfo->tm_hour,\ timeinfo->tm_min,\ timeinfo->tm_sec,\ (int)(rawtime%1000),\ strrchr(__FILE__,'\\')+1,\ __LINE__,\ LogLevelName[level],__VA_ARGS__);\ } #endif
#include "stdafx.h" #include "Log.h" FILE* fpPrint=NULL; //日志文件指针 time_t rawtime=0; struct tm* timeinfo=NULL; char* LogLevelName[6]={"DEBUG","INFO","WARNING","ERROR","CRITICAL","EVENT"}; #ifdef _DEBUG unsigned char LogLevel=LOG_LEVEL_DEBUG; #else unsigned char LogLevel=LOG_LEVEL_ERROR; #endif