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

首頁 > 編程 > 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++有所幫助。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久女女女女999久久| 欧美怡春院一区二区三区| 久久综合久久八八| 久久久成人精品视频| 国产精品九九九| 国产精品亚洲аv天堂网| 欧美午夜激情在线| 国产美女精彩久久| 久久久久久噜噜噜久久久精品| 日韩视频免费在线| 午夜精品视频在线| 欧美日韩性视频在线| 97在线免费观看| 色一区av在线| 成人激情黄色网| 97超级碰在线看视频免费在线看| 日韩电影中文字幕在线| 国产精品中文字幕在线观看| 亚洲成色999久久网站| 自拍亚洲一区欧美另类| 日韩在线观看免费全| 成人在线激情视频| 亚洲国产三级网| 97热在线精品视频在线观看| 亚洲午夜精品视频| 国产免费成人av| 亚洲欧美变态国产另类| 黑人欧美xxxx| 国产精品夜色7777狼人| 亚洲专区国产精品| 亚洲黄色片网站| 日韩欧美在线视频观看| 成人久久久久久| 亚洲一区二区三区在线视频| 九九热在线精品视频| 久久久噜噜噜久久久| 在线视频欧美日韩精品| 亚洲free嫩bbb| 美日韩精品免费观看视频| 97色伦亚洲国产| 欧美午夜视频在线观看| 欧美日韩高清在线观看| 92福利视频午夜1000合集在线观看| 欧美肥婆姓交大片| 亚洲精品国产精品国自产观看浪潮| 中文字幕久久亚洲| 国内精品视频久久| 日日摸夜夜添一区| 中文字幕综合在线| 97人人模人人爽人人喊中文字| 日韩精品999| 国产成人精品电影| 国产高清在线不卡| 国产剧情久久久久久| 欧美激情第一页xxx| 91精品91久久久久久| 国产偷亚洲偷欧美偷精品| 78m国产成人精品视频| 亚洲欧美日韩一区二区三区在线| 日本免费一区二区三区视频观看| 欧美激情一区二区三区在线视频观看| 欧美日韩亚洲精品内裤| 中文字幕av一区二区三区谷原希美| 亚洲第一页在线| 国产视频一区在线| 亚洲最新在线视频| 7777kkkk成人观看| 九色精品美女在线| 2018国产精品视频| 久久成人一区二区| 琪琪亚洲精品午夜在线| 成人欧美一区二区三区在线湿哒哒| 日韩欧美成人免费视频| 日韩欧美高清视频| 国产精品视频999| 精品中文字幕乱| 亚洲女人天堂色在线7777| 伊人成人开心激情综合网| 91po在线观看91精品国产性色| 性色av一区二区三区| 九九热在线精品视频| 国产va免费精品高清在线| 国产精品一久久香蕉国产线看观看| 日韩国产在线看| 精品国产成人在线| 久久99青青精品免费观看| 欧美日韩久久久久| 日韩精品在线免费| 日韩免费电影在线观看| 97碰碰碰免费色视频| 亚洲一区二区自拍| 久久国产视频网站| 亚洲国产欧美一区| 亚洲人av在线影院| 国产成人亚洲综合91精品| 国产精品成人一区二区| 欧美性xxxx极品hd欧美风情| 欧美限制级电影在线观看| 欧美日产国产成人免费图片| 日韩欧美在线视频观看| 97香蕉久久夜色精品国产| 日韩av电影手机在线观看| 在线精品高清中文字幕| 性夜试看影院91社区| 丝袜一区二区三区| 久久的精品视频| 欧美大学生性色视频| 亚洲欧洲美洲在线综合| 日本亚洲欧洲色α| 亚洲精品视频在线播放| 国内精品久久久久伊人av| 欧美色欧美亚洲高清在线视频| 欧美视频在线观看 亚洲欧| 久久精品男人天堂| 夜夜躁日日躁狠狠久久88av| 国内精久久久久久久久久人| 国产精品mp4| 91免费电影网站| 久久国产精品久久国产精品| 欧美丰满少妇xxxxx做受| 人人做人人澡人人爽欧美| 亚洲女人天堂av| 成人a级免费视频| 国产日韩欧美视频在线| 久久久久国产精品www| y97精品国产97久久久久久| 日韩欧中文字幕| 久久视频中文字幕| 91久久国产精品| 亚洲美女精品成人在线视频| 亚洲国产精品美女| 国产精品一区二区性色av| 国产精品白丝av嫩草影院| 成人黄色av网站| 国产精品video| 91久久久久久久一区二区| 国产拍精品一二三| 亚洲成人av在线| 久久97精品久久久久久久不卡| 国产一区二区三区视频在线观看| 欧美人与性动交a欧美精品| 伊人久久免费视频| 日韩小视频在线观看| 亚洲天堂免费在线| 欧美第一淫aaasss性| 亚洲jizzjizz日本少妇| 色中色综合影院手机版在线观看| 国产精品成人av性教育| 亚洲一区www| www.日韩视频| 亚洲精品第一国产综合精品| 亚州精品天堂中文字幕| 亚洲欧美另类中文字幕| 国产日韩欧美影视| 欧美二区乱c黑人| 色系列之999| 日韩精品中文字幕久久臀| 亚洲激情视频网| 亚洲国产精品yw在线观看| 欧美日韩国产区| 国产精品美女午夜av| 欧美激情视频在线观看| 国产97人人超碰caoprom| 精品伊人久久97|