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

C++日志記錄類實例解析

 更新時間:2014年07月23日 11:22:36   投稿:shichen2014  
這篇文章主要介紹了C++日志記錄類實例,代碼功能非常實用,需要的朋友可以參考下

本文所述實例是從一個Red Hat開源項目里面扒出來的,非常實用!讀者還可以根據自身需求加以修改!完整源碼如下:

Log.h文件部分:

#ifndef __LOG_H__
#define __LOG_H__

#include <stdio.h>
#include <tchar.h>
#include <crtdbg.h>
#include <windows.h>
#include <time.h>
#include <sys/timeb.h>

class CLog {
public:
  ~CLog();
  static CLog* get(TCHAR* path = NULL);
  void printf(const char* format, ...);

private:
  CLog(FILE* handle);

private:
  static CLog* _log;
  FILE* _handle;
};

enum {
 LOG_DEBUG,
 LOG_INFO,
 LOG_WARN,
 LOG_ERROR,
 LOG_FATAL
};

#ifdef _DEBUG
static unsigned int log_level = LOG_DEBUG;
#else
static unsigned int log_level = LOG_INFO;
#endif

#define PRINT_LINE(type, format, datetime, ms, ...)           \
  printf("%lu::%s::%s,%.3d::%s::" format "\n", GetCurrentThreadId(), type, datetime, ms, \
      __FUNCTION__, ## __VA_ARGS__);

#define LOG(type, format, ...) do {                   \
  if (type >= log_level && type <= LOG_FATAL) {            \
    CLog* log = CLog::get();                   \
    const char *type_as_char[] = { "DEBUG", "INFO", "WARN", "ERROR", "FATAL" }; \
    struct _timeb now;                       \
    struct tm today;                        \
    char datetime_str[20];                     \
    _ftime_s(&now);                         \
    localtime_s(&today, &now.time);                 \
    strftime(datetime_str, 20, "%Y-%m-%d %H:%M:%S", &today);    \
    if (log) {                           \
      log->PRINT_LINE(type_as_char[type], format, datetime_str, now.millitm, ## __VA_ARGS__); \
    } else {                            \
      PRINT_LINE(type_as_char[type], format, datetime_str, now.millitm, ## __VA_ARGS__); \
    }                                \
  }                                  \
} while(0)


#define log_printf(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__)
#define LOG_INFO(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__)
#define LOG_WARN(format, ...) LOG(LOG_WARN, format, ## __VA_ARGS__)
#define LOG_ERROR(format, ...) LOG(LOG_ERROR, format, ## __VA_ARGS__)

#define DBGLEVEL 1000

#define DBG(level, format, ...) do {      \
  if (level <= DBGLEVEL) {          \
    LOG(LOG_DEBUG, format, ## __VA_ARGS__); \
  }                      \
} while(0)

#define ASSERT(x) _ASSERTE(x)
#endif

Log.cpp文件部分:

#include "Log.h"
#include <stdio.h>
#include <stdarg.h>
#include <share.h>

#define LOG_ROLL_SIZE (1024 * 1024)

CLog* CLog::_log = NULL;

CLog::CLog(FILE* handle)
  : _handle(handle)
{
  _log = this;
}

CLog::~CLog()
{
  if (_log && _handle) {
    fclose(_handle);
    _log = NULL;
  }
}

CLog* CLog::get(char* path)
{
  if (_log) {
    return _log;
  }
 if(!path)
 {
 path = "dll.log";
 }
  DWORD size = 0;
  HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
               NULL);
  if (file != INVALID_HANDLE_VALUE) {
    size = GetFileSize(file, NULL);
    CloseHandle(file);
  }
  if (size != INVALID_FILE_SIZE && size > LOG_ROLL_SIZE) {
    TCHAR roll_path[MAX_PATH];
    sprintf(roll_path, "%s.1", path);
    if (!MoveFileEx(path, roll_path, MOVEFILE_REPLACE_EXISTING)) {
      return NULL;
    }
  }
  FILE* handle = fopen(path, "a+");
  if (!handle) {
    return NULL;
  }
  _log = new CLog(handle);
  return _log;
}

void CLog::printf(const char* format, ...)
{
  va_list args;

  va_start(args, format);
  vfprintf(_handle, format, args);
  va_end(args);
  fflush(_handle);
}

相關文章

  • AVX2指令集優(yōu)化整形數組求和算法

    AVX2指令集優(yōu)化整形數組求和算法

    這篇文章主要為大家介紹了AVX2指令集優(yōu)化整形數組求和算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 用c++實現將文本每個單詞首字母轉換為大寫

    用c++實現將文本每個單詞首字母轉換為大寫

    本篇文章是對用c++實現將文本每個單詞首字母轉換為大寫的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言使用Bresenham算法生成直線(easyx圖形庫)

    C語言使用Bresenham算法生成直線(easyx圖形庫)

    這篇文章主要為大家詳細介紹了C語言使用Bresenham算法生成直線,基于easyx圖形庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++實現LeetCode(123.買股票的最佳時間之三)

    C++實現LeetCode(123.買股票的最佳時間之三)

    這篇文章主要介紹了C++實現LeetCode(123.買股票的最佳時間之三),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 使用Qt的QChartView實現縮放和放大功能

    使用Qt的QChartView實現縮放和放大功能

    QCustomPlot是一個小型的Qt畫圖標類,支持繪制靜態(tài)曲線、動態(tài)曲線、多重坐標曲線,柱狀圖,蠟燭圖,這篇文章主要介紹了Qt的QChartView實現縮放和放大功能,需要的朋友可以參考下
    2022-09-09
  • C++編程中指針的聲明與基本使用講解

    C++編程中指針的聲明與基本使用講解

    這篇文章主要介紹了詳解C++編程中C++編程中指針的聲明與基本使用講解,文中舉了簡單的例子來講如何在基本的數據結構中使用指針,以及固定和可變指針的介紹,需要的朋友可以參考下
    2016-01-01
  • C語言實現簡單的貪吃蛇游戲

    C語言實現簡單的貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C語言實現簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言中函數參數的入棧順序詳解及實例

    C語言中函數參數的入棧順序詳解及實例

    這篇文章主要介紹了C語言中函數參數的入棧順序詳解及實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • C++ Custom Control控件向父窗體發(fā)送對應的消息

    C++ Custom Control控件向父窗體發(fā)送對應的消息

    這篇文章主要介紹了C++ Custom Control控件向父窗體發(fā)送對應的消息的相關資料,需要的朋友可以參考下
    2015-06-06
  • C語言循環(huán)結構詳解

    C語言循環(huán)結構詳解

    本文主要介紹C語言循環(huán)結構的基礎知識,這里整理了循環(huán)的基礎資料并附簡單的代碼示例詳細講解,有需要的小伙伴可以參考下
    2021-10-10

最新評論

韩城市| 定结县| 南汇区| 遵义县| 泸水县| 云阳县| 安顺市| 平舆县| 莲花县| 镇雄县| 渭南市| 新乡县| 建昌县| 澎湖县| 安化县| 铅山县| 永昌县| 广东省| 宝坻区| 龙门县| 长子县| 登封市| 五寨县| 丹江口市| 政和县| 永年县| 墨脱县| 明溪县| 沙湾县| 湖口县| 普宁市| 湾仔区| 阿鲁科尔沁旗| 龙岩市| 武冈市| 保山市| 岚皋县| 太原市| 漠河县| 金坛市| 普兰店市|