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