下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。
内存溢出小编现在分享给大家,也给大家做个参考。
使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志。主要提供以下接口:
1、设置写日志的级别
2、写关键日志信息
3、写错误日志信息
4、写警告日志信息
5、写一般日志信息
#ifndef COMMAND_define_H#define COMMAND_define_H//日志级别的提示信息static const char * KEYINFOPREFIX = " Key: \n";static const char * ERRORPREFIX = " Error: \n";static const char * WARNINGPREFIX = " Warning: \n";static const char * INFOPREFIX = " Info: \n";static const int MAX_STR_LEN = 1024;//日志级别枚举typedef enum EnumLogLevel{ LogLevelAll = 0,//所有信息都写日志 LogLevelMID,//写错误、警告信息 LogLevelnormal,//只写错误信息 LogLevelStop //不写日志};#endif
#ifndef LOGGER_H_#define LOGGER_H_#include <windows.h>#include <stdio.h>#include "Commanddefine.h"/* * 类名:Logger * 作用:提供写日志功能,支持多线程,支持可变形参数 *** 作,支持写日志级别的设置 * 接口:SetLogLevel:设置写日志级别 TraceKeyInfo:忽略日志级别,写关键信息 TraceError:写错误信息 TraceWarning:写警告信息 TraceInfo:写一般信息*/class Logger{public: //默认构造函数 Logger(); //构造函数 Logger(const char * strLogPath,EnumLogLevel nLogLevel = EnumLogLevel::LogLevelnormal); //析构函数 virtual ~Logger();public: //写关键信息 voID TraceKeyInfo(const char * strInfo,...); //写错误信息 voID TraceError(const char* strInfo,...); //写警告信息 voID TraceWarning(const char * strInfo,...); //写一般信息 voID TraceInfo(const char * strInfo,...); //设置写日志级别 voID SetLogLevel(EnumLogLevel nLevel);private: //写文件 *** 作 voID Trace(const char * strInfo); //获取当前系统时间 char * GetCurrentTime(); //创建日志文件名称 voID GenerateLogname(); //创建日志路径 voID CreateLogPath();private: //写日志文件流 file * m_pfileStream; //写日志级别 EnumLogLevel m_nLogLevel; //日志的路径 char m_strLogPath[MAX_STR_LEN]; //日志的名称 char m_strCurLogname[MAX_STR_LEN]; //线程同步的临界区变量 CRITICAL_SECTION m_cs;};#endif
#include "Logger.h"#include <imagehlp.h>#include <time.h>#include <string.h>#include <stdarg.h>#pragma comment(lib,"DbgHelp.lib")//默认构造函数Logger::Logger(){ //初始化 memset(m_strLogPath,MAX_STR_LEN); memset(m_strCurLogname,MAX_STR_LEN); m_pfileStream = NulL; //设置默认的写日志级别 m_nLogLevel = EnumLogLevel::LogLevelnormal; //初始化临界区变量 InitializeCriticalSection(&m_cs); //创建日志文件名 GenerateLogname();}//构造函数Logger::Logger(const char * strLogPath,EnumLogLevel nLogLevel):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);}//写关键信息接口voID Logger::TraceKeyInfo(const char * strInfo,...){ if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp,GetCurrentTime()); strcat(pTemp,KEYINFOPREFIX); //获取可变形参 va_List arg_ptr = NulL; va_start(arg_ptr,strInfo); vsprintf(pTemp + strlen(pTemp),strInfo,arg_ptr); va_end(arg_ptr); //写日志文件 Trace(pTemp); arg_ptr = NulL;}//写错误信息voID Logger::TraceError(const char* strInfo,...){ //判断当前的写日志级别,若设置为不写日志则函数返回 if(m_nLogLevel >= EnumLogLevel::LogLevelStop) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp,ERRORPREFIX); va_List arg_ptr = NulL; va_start(arg_ptr,arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr = NulL;}//写警告信息voID Logger::TraceWarning(const char * strInfo,...){ //判断当前的写日志级别,若设置为只写错误信息则函数返回 if(m_nLogLevel >= EnumLogLevel::LogLevelnormal) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp,WARNINGPREFIX); va_List arg_ptr = NulL; va_start(arg_ptr,arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr = NulL;}//写一般信息voID Logger::TraceInfo(const char * strInfo,...){ //判断当前的写日志级别,若设置只写错误和警告信息则函数返回 if(m_nLogLevel >= EnumLogLevel::LogLevelMID) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp,INFOPREFIX); va_List arg_ptr = NulL; va_start(arg_ptr,arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr = NulL;}//获取系统当前时间char * Logger::GetCurrentTime(){ time_t curTime; struct tm * pTimeInfo = NulL; time(&curTime); pTimeInfo = localtime(&curTime); char temp[MAX_STR_LEN] = {0}; sprintf(temp,"%02d:%02d:%02d",pTimeInfo->tm_hour,pTimeInfo->tm_min,pTimeInfo->tm_sec); char * pTemp = temp; return pTemp; }//设置写日志级别voID Logger::SetLogLevel(EnumLogLevel nLevel){ m_nLogLevel = nLevel;}//写文件 *** 作voID Logger::Trace(const char * strInfo){ if(!strInfo) return; try { //进入临界区 EnterCriticalSection(&m_cs); //若文件流没有打开,则重新打开 if(!m_pfileStream) { char temp[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); }}//创建日志文件的名称voID Logger::GenerateLogname(){ time_t curTime; struct tm * pTimeInfo = NulL; time(&curTime); pTimeInfo = localtime(&curTime); char temp[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); char temp[1024] = {0}; strcat(temp,m_strLogPath); strcat(temp,m_strCurLogname); //以追加的方式打开文件流 m_pfileStream = fopen(temp,"a+"); }}//创建日志文件的路径voID Logger::CreateLogPath(){ if(0 != strlen(m_strLogPath)) { strcat(m_strLogPath,"\"); } MakeSureDirectoryPathExists(m_strLogPath);}
以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
总结以上是内存溢出为你收集整理的C++写日志 *** 作全部内容,希望文章能够帮你解决C++写日志 *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)