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++有所帮助。