程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++說話編寫寫日記類

C++說話編寫寫日記類

編輯:關於C++

C++說話編寫寫日記類。本站提示廣大學習愛好者:(C++說話編寫寫日記類)文章只能為提供參考,不一定能成為您想要的結果。以下是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++有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved