首页 > 编程 > C++ > 正文

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

2020-01-26 15:27:17
字体:
来源:转载
供稿:网友

本文所述实例是从一个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 _DEBUGstatic unsigned int log_level = LOG_DEBUG;#elsestatic 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);}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表