本文所述实例是从一个Red Hat开源项目里面扒出来的,非常实用!读者还可以根据自身需求加以修改!完整源码如下:
Log.h文件部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#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文件部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#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); } |