亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

教你C++語言編寫寫日志類的步驟

2020-02-24 14:28:36
字體:
來源:轉載
供稿:網友

編寫日志類是用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, "http://"); } MakeSureDirectoryPathExists(m_strLogPath);}

教你C++語言編寫寫日志類的步驟,大家都了解了嗎?通過武林技術頻道相關人士的介紹,相信大家都清楚了吧,希望上文信息可以幫助到您!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久人人爽人人爽人人片av高清| 亚洲aaa激情| 国产精品久久久av久久久| 亚洲国产精品中文| 97精品国产97久久久久久| 欧美激情免费在线| 色悠久久久久综合先锋影音下载| 国产精品成人av在线| 久久久国产精品免费| 欧美大片免费观看在线观看网站推荐| 久久99精品久久久久久青青91| 欧美麻豆久久久久久中文| 国产精品视频一区二区三区四| 国产伦精品免费视频| 91精品久久久久久久久久另类| 成人黄在线观看| 精品久久久久久中文字幕大豆网| 国产成人久久久精品一区| 国产香蕉97碰碰久久人人| 国产精品夫妻激情| 日韩最新av在线| 亚洲人午夜精品免费| 欧美激情区在线播放| 久久国产精品久久久久久| 97在线视频免费播放| 国产人妖伪娘一区91| 国内精品美女av在线播放| 在线观看亚洲视频| 久热国产精品视频| 亚洲一二在线观看| 国产欧美久久一区二区| 热re91久久精品国99热蜜臀| 97超碰国产精品女人人人爽| 日韩av理论片| 在线观看欧美www| 亚洲美女动态图120秒| 日本亚洲欧美成人| 国产精品福利在线观看网址| 在线观看日韩欧美| 国产999精品久久久| 国产成人一区二区| 国产精品男女猛烈高潮激情| 久久精品久久精品亚洲人| 日韩精品在线播放| 两个人的视频www国产精品| 久久久国产在线视频| 欧美另类在线观看| 久久久久久久999精品视频| 国模精品一区二区三区色天香| 欧美激情中文字幕乱码免费| 91精品国产91久久久久久最新| 欧美电影在线观看| 日韩精品视频在线观看免费| 日韩美女免费视频| 精品亚洲夜色av98在线观看| 国自在线精品视频| 欧美成人午夜视频| 91久久夜色精品国产网站| **欧美日韩vr在线| 亚洲美女中文字幕| 亚洲第一区在线观看| 亚洲欧美在线免费观看| 欧美电影电视剧在线观看| 最近中文字幕mv在线一区二区三区四区| www.久久草.com| 久久久久久久97| 国产精品久久久久久一区二区| 国产精品亚洲第一区| 欧美日韩国产区| 国产亚洲欧美日韩精品| 国产精品美腿一区在线看| 成人啪啪免费看| 久久久久久久影院| 国产精品国产三级国产aⅴ9色| 精品在线欧美视频| 国产精品视频自拍| 欧美午夜精品久久久久久久| 久久男人的天堂| 在线免费观看羞羞视频一区二区| 日韩av影院在线观看| 久久精品亚洲国产| 中文字幕在线国产精品| 色在人av网站天堂精品| 日韩一区在线视频| 国产精品美女www爽爽爽视频| 国产精品老牛影院在线观看| 中文字幕亚洲自拍| 久久99热精品| 国内精久久久久久久久久人| 国产亚洲精品综合一区91| 91色琪琪电影亚洲精品久久| 久久精品一本久久99精品| 中文字幕欧美在线| 久久久久国产一区二区三区| 中文字幕自拍vr一区二区三区| 国产色视频一区| 福利一区视频在线观看| 疯狂做受xxxx欧美肥白少妇| 国内精品久久久久久中文字幕| 日本sm极度另类视频| 欧美性色19p| 久久精品国产亚洲一区二区| 亚洲国产欧美一区二区三区久久| 国产精品欧美风情| 国产精品美腿一区在线看| 亚洲国产精品99| 亚洲最大的av网站| 欧美日韩精品国产| 国内揄拍国内精品少妇国语| 国产精品第100页| 91国产中文字幕| 欧美日韩午夜激情| 91精品在线国产| 一级做a爰片久久毛片美女图片| 91禁国产网站| 国产成人久久久精品一区| 亚洲伊人久久大香线蕉av| 国产日韩欧美综合| 久久天堂av综合合色| 亚洲mm色国产网站| 精品久久香蕉国产线看观看亚洲| 日韩风俗一区 二区| 国产在线播放不卡| 国产精品日日做人人爱| 国产视频精品免费播放| 欧美午夜精品在线| 亚洲另类图片色| 国产精品第一页在线| 久久精品国产一区| 日韩精品在线观看一区| 久久久成人av| 最近更新的2019中文字幕| 欧美日韩成人网| 国产精品aaaa| 91网站免费观看| 欧美大全免费观看电视剧大泉洋| 亚洲最大的av网站| 欧美性猛交xxxx偷拍洗澡| 欧美午夜片在线免费观看| 中文字幕综合一区| 视频在线观看99| 日韩大陆欧美高清视频区| 国产精品日日摸夜夜添夜夜av| 久久久亚洲精品视频| 一区二区三区视频在线| 97婷婷大伊香蕉精品视频| 日韩中文字幕久久| 欧美综合一区第一页| 91干在线观看| 国产aⅴ夜夜欢一区二区三区| 欧美日韩电影在线观看| 国产精品国产三级国产aⅴ浪潮| 欧美大尺度电影在线观看| 日韩免费高清在线观看| 这里精品视频免费| 亚洲国产精久久久久久久| 国产精品∨欧美精品v日韩精品| 国产日本欧美在线观看| 亚洲伊人成综合成人网| 成人做爽爽免费视频| 日韩精品高清在线观看| 成人乱人伦精品视频在线观看| www.xxxx欧美| 一区二区三区日韩在线|