手机
当前位置:查字典教程网 >编程开发 >C语言 >C++日志记录类实例解析
C++日志记录类实例解析
摘要:本文所述实例是从一个RedHat开源项目里面扒出来的,非常实用!读者还可以根据自身需求加以修改!完整源码如下:Log.h文件部分:#ifnd...

本文所述实例是从一个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++日志记录类实例解析】相关文章:

C++指向类成员函数的指针详细解析

C++临时性对象的生命周期详细解析

C/C++数据对齐详细解析

C语言的指针类型详细解析

C/C++ 宏详细解析

C++中的对象数组详细解析

C++内核对象封装单实例启动程序的类

C++ sizeof 实例解析

C++结构体数组详细解析

C++求斐波那契数的实例代码

精品推荐
分类导航