C++语言编写写日志类
使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志。
主要提供以下接口:
- 1、设置写日志的级别
- 2、写关键日志信息
- 3、写错误日志信息
- 4、写警告日志信息
- 5、写一般日志信息
#ifndefCOMMAND_DEFINE_H #defineCOMMAND_DEFINE_H //日志级别的提示信息 staticconstchar*KEYINFOPREFIX="Key:\n"; staticconstchar*ERRORPREFIX="Error:\n"; staticconstchar*WARNINGPREFIX="Warning:\n"; staticconstchar*INFOPREFIX="Info:\n"; staticconstintMAX_STR_LEN=1024; //日志级别枚举 typedefenumEnumLogLevel { LogLevelAll=0,//所有信息都写日志 LogLevelMid,//写错误、警告信息 LogLevelNormal,//只写错误信息 LogLevelStop//不写日志 }; #endif
#ifndefLOGGER_H_ #defineLOGGER_H_ #include<Windows.h> #include<stdio.h> #include"CommandDefine.h" /* *类名:Logger *作用:提供写日志功能,支持多线程,支持可变形参数操作,支持写日志级别的设置 *接口:SetLogLevel:设置写日志级别 TraceKeyInfo:忽略日志级别,写关键信息 TraceError:写错误信息 TraceWarning:写警告信息 TraceInfo:写一般信息 */ classLogger { public: //默认构造函数 Logger(); //构造函数 Logger(constchar*strLogPath,EnumLogLevelnLogLevel=EnumLogLevel::LogLevelNormal); //析构函数 virtual~Logger(); public: //写关键信息 voidTraceKeyInfo(constchar*strInfo,...); //写错误信息 voidTraceError(constchar*strInfo,...); //写警告信息 voidTraceWarning(constchar*strInfo,...); //写一般信息 voidTraceInfo(constchar*strInfo,...); //设置写日志级别 voidSetLogLevel(EnumLogLevelnLevel); private: //写文件操作 voidTrace(constchar*strInfo); //获取当前系统时间 char*GetCurrentTime(); //创建日志文件名称 voidGenerateLogName(); //创建日志路径 voidCreateLogPath(); private: //写日志文件流 FILE*m_pFileStream; //写日志级别 EnumLogLevelm_nLogLevel; //日志的路径 charm_strLogPath[MAX_STR_LEN]; //日志的名称 charm_strCurLogName[MAX_STR_LEN]; //线程同步的临界区变量 CRITICAL_SECTIONm_cs; }; #endif
#include"Logger.h" #include<imagehlp.h> #include<time.h> #include<string.h> #include<stdarg.h> #pragmacomment(lib,"DbgHelp.lib") //默认构造函数 Logger::Logger() { //初始化 memset(m_strLogPath,0,MAX_STR_LEN); memset(m_strCurLogName,0,MAX_STR_LEN); m_pFileStream=NULL; //设置默认的写日志级别 m_nLogLevel=EnumLogLevel::LogLevelNormal; //初始化临界区变量 InitializeCriticalSection(&m_cs); //创建日志文件名 GenerateLogName(); } //构造函数 Logger::Logger(constchar*strLogPath,EnumLogLevelnLogLevel):m_nLogLevel(nLogLevel) { //初始化 m_pFileStream=NULL; strcpy(m_strLogPath,strLogPath); InitializeCriticalSection(&m_cs); CreateLogPath(); GenerateLogName(); } //析构函数 Logger::~Logger() { //释放临界区 DeleteCriticalSection(&m_cs); //关闭文件流 if(m_pFileStream) fclose(m_pFileStream); } //写关键信息接口 voidLogger::TraceKeyInfo(constchar*strInfo,...) { if(!strInfo) return; charpTemp[MAX_STR_LEN]={0}; strcpy(pTemp,GetCurrentTime()); strcat(pTemp,KEYINFOPREFIX); //获取可变形参 va_listarg_ptr=NULL; va_start(arg_ptr,strInfo); vsprintf(pTemp+strlen(pTemp),strInfo,arg_ptr); va_end(arg_ptr); //写日志文件 Trace(pTemp); arg_ptr=NULL; } //写错误信息 voidLogger::TraceError(constchar*strInfo,...) { //判断当前的写日志级别,若设置为不写日志则函数返回 if(m_nLogLevel>=EnumLogLevel::LogLevelStop) return; if(!strInfo) return; charpTemp[MAX_STR_LEN]={0}; strcpy(pTemp,GetCurrentTime()); strcat(pTemp,ERRORPREFIX); va_listarg_ptr=NULL; va_start(arg_ptr,strInfo); vsprintf(pTemp+strlen(pTemp),strInfo,arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr=NULL; } //写警告信息 voidLogger::TraceWarning(constchar*strInfo,...) { //判断当前的写日志级别,若设置为只写错误信息则函数返回 if(m_nLogLevel>=EnumLogLevel::LogLevelNormal) return; if(!strInfo) return; charpTemp[MAX_STR_LEN]={0}; strcpy(pTemp,GetCurrentTime()); strcat(pTemp,WARNINGPREFIX); va_listarg_ptr=NULL; va_start(arg_ptr,strInfo); vsprintf(pTemp+strlen(pTemp),strInfo,arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr=NULL; } //写一般信息 voidLogger::TraceInfo(constchar*strInfo,...) { //判断当前的写日志级别,若设置只写错误和警告信息则函数返回 if(m_nLogLevel>=EnumLogLevel::LogLevelMid) return; if(!strInfo) return; charpTemp[MAX_STR_LEN]={0}; strcpy(pTemp,GetCurrentTime()); strcat(pTemp,INFOPREFIX); va_listarg_ptr=NULL; va_start(arg_ptr,strInfo); vsprintf(pTemp+strlen(pTemp),strInfo,arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr=NULL; } //获取系统当前时间 char*Logger::GetCurrentTime() { time_tcurTime; structtm*pTimeInfo=NULL; time(&curTime); pTimeInfo=localtime(&curTime); chartemp[MAX_STR_LEN]={0}; sprintf(temp,"%02d:%02d:%02d",pTimeInfo->tm_hour,pTimeInfo->tm_min,pTimeInfo->tm_sec); char*pTemp=temp; returnpTemp; } //设置写日志级别 voidLogger::SetLogLevel(EnumLogLevelnLevel) { m_nLogLevel=nLevel; } //写文件操作 voidLogger::Trace(constchar*strInfo) { if(!strInfo) return; try { //进入临界区 EnterCriticalSection(&m_cs); //若文件流没有打开,则重新打开 if(!m_pFileStream) { chartemp[1024]={0}; strcat(temp,m_strLogPath); strcat(temp,m_strCurLogName); m_pFileStream=fopen(temp,"a+"); if(!m_pFileStream) { return; } } //写日志信息到文件流 fprintf(m_pFileStream,"%s\n",strInfo); fflush(m_pFileStream); //离开临界区 LeaveCriticalSection(&m_cs); } //若发生异常,则先离开临界区,防止死锁 catch(...) { LeaveCriticalSection(&m_cs); } } //创建日志文件的名称 voidLogger::GenerateLogName() { time_tcurTime; structtm*pTimeInfo=NULL; time(&curTime); pTimeInfo=localtime(&curTime); chartemp[1024]={0}; //日志的名称如:2013-01-01.log sprintf(temp,"%04d-%02d-%02d.log",pTimeInfo->tm_year+1900,pTimeInfo->tm_mon+1,pTimeInfo->tm_mday); if(0!=strcmp(m_strCurLogName,temp)) { strcpy(m_strCurLogName,temp); if(m_pFileStream) fclose(m_pFileStream); chartemp[1024]={0}; strcat(temp,m_strLogPath); strcat(temp,m_strCurLogName); //以追加的方式打开文件流 m_pFileStream=fopen(temp,"a+"); } } //创建日志文件的路径 voidLogger::CreateLogPath() { if(0!=strlen(m_strLogPath)) { strcat(m_strLogPath,"\\"); } MakeSureDirectoryPathExists(m_strLogPath); }
以上就是本文的全部内容,希望对大家的学习C++有所帮助。