C++日志记录类实例解析

所属分类: 软件编程 / C 语言 阅读数: 55
收藏 0 赞 0 分享

本文所述实例是从一个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);
}
更多精彩内容其他人还在看

详解C++ string字符串类

这篇文章主要介绍了C++ string字符串类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C++单例类模板详解

这篇文章主要介绍了C++单例类模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言实现数据结构迷宫实验

这篇文章主要为大家详细介绍了C语言实现数据结构迷宫实验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言数据结构之迷宫问题

这篇文章主要为大家详细介绍了C语言数据结构之迷宫问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言数据结构之迷宫求解问题

这篇文章主要为大家详细介绍了C语言数据结构之迷宫求解问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生考试系统

这篇文章主要为大家详细介绍了C语言实现小学生考试系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生随机出题测试计分

这篇文章主要为大家详细介绍了C语言实现小学生随机出题测试计分,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言实现小学生计算机辅助教学系统

这篇文章主要为大家详细介绍了C语言实现小学生计算机辅助教学系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

这篇文章主要介绍了C++中构造函数,拷贝构造函数和赋值函数的区别和实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言清除scanf()缓存的案例讲解

今天小编就为大家分享一篇关于C语言清除scanf()缓存的案例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多