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

时间:2021-05-20

本文所述实例是从一个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);}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章