最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++語(yǔ)言編寫寫日志類

 更新時(shí)間:2015年12月29日 16:24:01   投稿:lijiao  
這篇文章主要介紹了C++語(yǔ)言編寫寫日志類的相關(guān)資料,支持寫日志級(jí)別設(shè)置、支持多線程、支持可變形參表寫日志,需要的朋友可以參考下

使用C++語(yǔ)言編寫寫日志類,支持寫日志級(jí)別設(shè)置、支持多線程、支持可變形參表寫日志。
主要提供以下接口:

  • 1、設(shè)置寫日志的級(jí)別
  • 2、寫關(guān)鍵日志信息
  • 3、寫錯(cuò)誤日志信息
  • 4、寫警告日志信息
  • 5、寫一般日志信息
#ifndef COMMAND_DEFINE_H
#define COMMAND_DEFINE_H
//日志級(jí)別的提示信息
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;
//日志級(jí)別枚舉
typedef enum EnumLogLevel
{
 LogLevelAll = 0, //所有信息都寫日志
 LogLevelMid,  //寫錯(cuò)誤、警告信息
 LogLevelNormal,  //只寫錯(cuò)誤信息
 LogLevelStop  //不寫日志
};
 
#endif
#ifndef LOGGER_H_
#define LOGGER_H_
#include <Windows.h>
#include <stdio.h>
#include "CommandDefine.h"
/*
 * 類名:Logger
 * 作用:提供寫日志功能,支持多線程,支持可變形參數(shù)操作,支持寫日志級(jí)別的設(shè)置
 * 接口:SetLogLevel:設(shè)置寫日志級(jí)別
   TraceKeyInfo:忽略日志級(jí)別,寫關(guān)鍵信息
   TraceError:寫錯(cuò)誤信息
   TraceWarning:寫警告信息
   TraceInfo:寫一般信息
*/
class Logger
{
public:
 //默認(rèn)構(gòu)造函數(shù)
 Logger();
 //構(gòu)造函數(shù)
 Logger(const char * strLogPath, EnumLogLevel nLogLevel = EnumLogLevel::LogLevelNormal);
 //析構(gòu)函數(shù)
 virtual ~Logger();
public:
 //寫關(guān)鍵信息
 void TraceKeyInfo(const char * strInfo, ...);
 //寫錯(cuò)誤信息
 void TraceError(const char* strInfo, ...);
 //寫警告信息
 void TraceWarning(const char * strInfo, ...);
 //寫一般信息
 void TraceInfo(const char * strInfo, ...);
 //設(shè)置寫日志級(jí)別
 void SetLogLevel(EnumLogLevel nLevel);
private:
 //寫文件操作
 void Trace(const char * strInfo);
 //獲取當(dāng)前系統(tǒng)時(shí)間
 char * GetCurrentTime();
 //創(chuàng)建日志文件名稱
 void GenerateLogName();
 //創(chuàng)建日志路徑
 void CreateLogPath();
private:
 //寫日志文件流
 FILE * m_pFileStream;
 //寫日志級(jí)別
 EnumLogLevel m_nLogLevel;
 //日志的路徑
 char m_strLogPath[MAX_STR_LEN];
 //日志的名稱
 char m_strCurLogName[MAX_STR_LEN];
 //線程同步的臨界區(qū)變量
 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")
 
//默認(rèn)構(gòu)造函數(shù)
Logger::Logger()
{
 //初始化
 memset(m_strLogPath, 0, MAX_STR_LEN);
 memset(m_strCurLogName, 0, MAX_STR_LEN);
 m_pFileStream = NULL;
 //設(shè)置默認(rèn)的寫日志級(jí)別
 m_nLogLevel = EnumLogLevel::LogLevelNormal;
 //初始化臨界區(qū)變量
 InitializeCriticalSection(&m_cs);
 //創(chuàng)建日志文件名
 GenerateLogName();
}
 
//構(gòu)造函數(shù)
Logger::Logger(const char * strLogPath, EnumLogLevel nLogLevel):m_nLogLevel(nLogLevel)
{
 //初始化
 m_pFileStream = NULL;
 strcpy(m_strLogPath, strLogPath);
 InitializeCriticalSection(&m_cs);
 CreateLogPath();
 GenerateLogName();
}
 
 
//析構(gòu)函數(shù)
Logger::~Logger()
{
 //釋放臨界區(qū)
 DeleteCriticalSection(&m_cs);
 //關(guān)閉文件流
 if(m_pFileStream)
  fclose(m_pFileStream);
}
 
//寫關(guān)鍵信息接口
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;
 
}
 
//寫錯(cuò)誤信息
void Logger::TraceError(const char* strInfo, ...)
{
 //判斷當(dāng)前的寫日志級(jí)別,若設(shè)置為不寫日志則函數(shù)返回
 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, ...)
{
 //判斷當(dāng)前的寫日志級(jí)別,若設(shè)置為只寫錯(cuò)誤信息則函數(shù)返回
 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, ...)
{
 //判斷當(dāng)前的寫日志級(jí)別,若設(shè)置只寫錯(cuò)誤和警告信息則函數(shù)返回
 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;
}
 
//獲取系統(tǒng)當(dāng)前時(shí)間
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; 
}
 
//設(shè)置寫日志級(jí)別
void Logger::SetLogLevel(EnumLogLevel nLevel)
{
 m_nLogLevel = nLevel;
}
 
//寫文件操作
void Logger::Trace(const char * strInfo)
{
 if(!strInfo)
  return;
 try
 {
  //進(jìn)入臨界區(qū)
  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);
  //離開臨界區(qū)
  LeaveCriticalSection(&m_cs);
 }
 //若發(fā)生異常,則先離開臨界區(qū),防止死鎖
 catch(...)
 {
  LeaveCriticalSection(&m_cs);
 }
}
 
//創(chuàng)建日志文件的名稱
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+");
 }
 
}
 
//創(chuàng)建日志文件的路徑
void Logger::CreateLogPath()
{
 if(0 != strlen(m_strLogPath))
 {
  strcat(m_strLogPath, "\\");
 }
 MakeSureDirectoryPathExists(m_strLogPath);
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)C++有所幫助。

相關(guān)文章

  • C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)詳解

    C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)詳解

    這篇文章主要為大家介紹了C語(yǔ)言中數(shù)據(jù)的存儲(chǔ),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++之函數(shù)的重載

    C++之函數(shù)的重載

    這篇文章主要介紹了c++函數(shù)重載的相關(guān)知識(shí),文章講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • C++空類詳解

    C++空類詳解

    以下是對(duì)C++中的空類進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • Qt超時(shí)鎖屏的實(shí)現(xiàn)示例

    Qt超時(shí)鎖屏的實(shí)現(xiàn)示例

    本文主要介紹了Qt超時(shí)鎖屏的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言中system()執(zhí)行cmd命令打開關(guān)閉程序的方法

    C語(yǔ)言中system()執(zhí)行cmd命令打開關(guān)閉程序的方法

    今天小編就為大家分享一篇C語(yǔ)言中system()執(zhí)行cmd命令打開關(guān)閉程序的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單餐飲管理與點(diǎn)餐系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單餐飲管理與點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單餐飲管理與點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++鏈接器工作原理詳解

    C++鏈接器工作原理詳解

    當(dāng)文件見過(guò)編譯后就需要進(jìn)行一個(gè)鏈接的操作接下來(lái)我們就說(shuō)說(shuō)什么是鏈接,本文給大家介紹了C++鏈接器是如何工作的,文章通過(guò)代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • C++構(gòu)造函數(shù)一些常見的坑

    C++構(gòu)造函數(shù)一些常見的坑

    這篇文章主要給大家分享的是C++構(gòu)造函數(shù)一些常見的坑,文章圍繞C++構(gòu)造函數(shù)的相關(guān)資料展開關(guān)于C++構(gòu)造函數(shù)坑的內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)小貓釣魚游戲

    C語(yǔ)言實(shí)現(xiàn)小貓釣魚游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)小貓釣魚游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語(yǔ)言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    C語(yǔ)言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02

最新評(píng)論

喀什市| 留坝县| 南充市| 乌海市| 莱芜市| 理塘县| 寻甸| 德兴市| 合江县| 永胜县| 安康市| 满城县| 花莲市| 保山市| 古蔺县| 虞城县| 东宁县| 宿迁市| 盖州市| 崇礼县| 左云县| 大兴区| 阿坝| 赤水市| 沁阳市| 固安县| 大姚县| 南乐县| 怀柔区| 博罗县| 南宫市| 色达县| 长岭县| 水富县| 建昌县| 美姑县| 南皮县| 驻马店市| 石家庄市| 苍梧县| 常山县|