国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++語言編寫寫日志類

2020-05-23 14:11:23
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++語言編寫寫日志類的相關資料,支持寫日志級別設置、支持多線程、支持可變形參表寫日志,需要的朋友可以參考下
 

使用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, 0, MAX_STR_LEN); memset(m_strCurLogName, 0, 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, GetCurrentTime()); strcat(pTemp, ERRORPREFIX); 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::TraceWarning(const char * strInfo, ...){ //判斷當前的寫日志級別,若設置為只寫錯誤信息則函數返回 if(m_nLogLevel >= EnumLogLevel::LogLevelNormal)  return; if(!strInfo)  return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, WARNINGPREFIX); 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::TraceInfo(const char * strInfo, ...){ //判斷當前的寫日志級別,若設置只寫錯誤和警告信息則函數返回 if(m_nLogLevel >= EnumLogLevel::LogLevelMid)  return; if(!strInfo)  return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp,INFOPREFIX); 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;} //獲取系統當前時間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);}

以上就是本文的全部內容,希望對大家的學習C++有所幫助。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 诸城市| 永仁县| 海兴县| 荆州市| 弥勒县| 桦甸市| 平昌县| 巴楚县| 礼泉县| 漯河市| 滦平县| 乌拉特中旗| 武川县| 平安县| 拜城县| 家居| 民和| 珲春市| 吴江市| 乐至县| 明水县| 蒲城县| 准格尔旗| 安龙县| 都昌县| 基隆市| 鄂尔多斯市| 平南县| 赤城县| 威宁| 平阳县| 开化县| 周至县| 开江县| 独山县| 卢龙县| 商城县| 华容县| 庆阳市| 葵青区| 盈江县|