1.日志基类
.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
|
//--------------------------------------------------------------------------- #ifndef
UnitLogWriterH #define
UnitLogWriterH #include
<vcl.h> #include
<time.h> #include
<assert.h> //--------------------------------------------------------------------------- class LogFile { protected : CRITICAL_SECTION
_csLock; char *
_szFileName; HANDLE _hFile; bool OpenFile(); //打开文件,
指针到文件尾 DWORD Write( LPCVOID lpBuffer,
DWORD dwLength); virtual void WriteLog(
LPCVOID lpBuffer,
DWORD dwLength); //写日志,
可以扩展修改 void Lock()
{ ::EnterCriticalSection(&_csLock); } void Unlock()
{ ::LeaveCriticalSection(&_csLock); } public : LogFile( const char *szFileName
= "Log.log" ); //设定日志文件名 virtual ~LogFile(); const char *
GetFileName() { return _szFileName; } void SetFileName( const char *szName); //修改文件名,
同时关闭上一个日志文件 bool IsOpen() { return _hFile
!= INVALID_HANDLE_VALUE; } void Close(); void Log( LPCVOID lpBuffer,
DWORD dwLength); //追加日志内容 void Log( const char *szText) { Log(szText,
strlen (szText)); } private : //屏蔽函数 LogFile( const LogFile&); LogFile&operator
= ( const LogFile&); }; #endif |
基类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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
//--------------------------------------------------------------------------- #pragma
hdrstop #include
"UnitLogWriter.h" //--------------------------------------------------------------------------- #pragma
package(smart_init) LogFile::LogFile( const char *szFileName) { _szFileName
= NULL; _hFile
= INVALID_HANDLE_VALUE; ::InitializeCriticalSection(&_csLock); SetFileName(szFileName); } //------------------------------------------------------------------------- LogFile::~LogFile() { ::DeleteCriticalSection(&_csLock); Close(); if (_szFileName) delete []_szFileName; } //------------------------------------------------------------------------- bool LogFile::OpenFile() { if (IsOpen()) return true ; if (!_szFileName) return false ; _hFile
= CreateFile( _szFileName, GENERIC_WRITE, FILE_SHARE_READ
| FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (!IsOpen()
&& GetLastError() == 2) //打开不成功,
且因为文件不存在, 创建文件 _hFile
= CreateFile( _szFileName, GENERIC_WRITE, FILE_SHARE_READ
| FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (IsOpen()) SetFilePointer(_hFile,
0, NULL, FILE_END); return IsOpen(); } //------------------------------------------------------------------------- DWORD LogFile::Write( LPCVOID lpBuffer,
DWORD dwLength) { DWORD dwWriteLength
= 0; if (IsOpen()) WriteFile(_hFile,
lpBuffer, dwLength, &dwWriteLength, NULL); return dwWriteLength; } //------------------------------------------------------------------------- void LogFile::WriteLog(
LPCVOID lpBuffer,
DWORD dwLength) { time_t now; char temp[21]; DWORD dwWriteLength; if (IsOpen()) { time (&now); strftime (temp,
20, "%Y-%m-%d
%H:%M:%S" ,
localtime (&now)); WriteFile(_hFile,
"\xd\xa#-----------------------------" ,
32, &dwWriteLength, NULL); WriteFile(_hFile,
temp, 19, &dwWriteLength, NULL); WriteFile(_hFile,
"-----------------------------#\xd\xa" ,
32, &dwWriteLength, NULL); WriteFile(_hFile,
lpBuffer, dwLength, &dwWriteLength, NULL); WriteFile(_hFile,
"\xd\xa" ,
2, &dwWriteLength, NULL); FlushFileBuffers(_hFile); } } //------------------------------------------------------------------------- //------------------------------------------------------------------------- void LogFile::SetFileName( const char *szName) { assert (szName); if (_szFileName) delete []_szFileName; Close(); _szFileName
= new char [ strlen (szName)
+ 1]; assert (_szFileName); strcpy (_szFileName,
szName); } //------------------------------------------------------------------------- void LogFile::Close() { if (IsOpen()) { CloseHandle(_hFile); _hFile
= INVALID_HANDLE_VALUE; } } //------------------------------------------------------------------------- void LogFile::Log( LPCVOID lpBuffer,
DWORD dwLength) { assert (lpBuffer); __try { Lock(); if (!OpenFile()) return ; WriteLog(lpBuffer,
dwLength); } __finally { Unlock(); } } |
1
|
|
2.日志派生类
.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
|
//--------------------------------------------------------------------------- #ifndef
LogFileExH #define
LogFileExH #include
<assert.h> #include
"UnitLogWriter.h" //--------------------------------------------------------------------------- class LogFileEx
: public LogFile { protected : char *_szPath; char _szLastDate[9]; int _iType; void SetPath( const char *szPath); public : enum LOG_TYPE{YEAR
= 0, MONTH = 1, DAY = 2}; LogFileEx( const char *szPath
= "." ,
LOG_TYPE iType = MONTH); ~LogFileEx(); const char *
GetPath(); void Log( LPCVOID lpBuffer,
DWORD dwLength); void Log( const char *szText); void Log( const AnsiString&szText); private : //屏蔽函数 LogFileEx( const LogFileEx&); LogFileEx&operator
= ( const LogFileEx&); }; #endif |
1
|
|
1
|
cpp文件 |
1
|
|
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
//--------------------------------------------------------------------------- #pragma
hdrstop #include
"LogFileEx.h" //--------------------------------------------------------------------------- #pragma
package(smart_init) //------------------------------------------------------------------------- void LogFileEx::SetPath( const char *szPath) { assert (szPath); WIN32_FIND_DATA
wfd; char temp[MAX_PATH
+ 1] = {0}; if (FindFirstFile(szPath,
&wfd) == INVALID_HANDLE_VALUE && CreateDirectory(szPath, NULL) == 0) { strcat ( strcpy (temp,
szPath), "
Create Fail. Exit Now! Error ID :" ); ltoa(GetLastError(),
temp + strlen (temp),
10); MessageBox(NULL,
temp, "Class
LogFileEx" ,
MB_OK); exit (1); } else { GetFullPathName(szPath,
MAX_PATH, temp, NULL); _szPath
= new char [ strlen (temp)
+ 1]; assert (_szPath); strcpy (_szPath,
temp); } } //------------------------------------------------------------------------- LogFileEx::LogFileEx( const char *szPath
, LOG_TYPE iType) { _szPath
= NULL; SetPath(szPath); _iType
= iType; memset (_szLastDate,
0, 9); } //------------------------------------------------------------------------- LogFileEx::~LogFileEx() { if (_szPath) delete []_szPath; } //------------------------------------------------------------------------- const char *
LogFileEx::GetPath() { return _szPath; } //------------------------------------------------------------------------- void LogFileEx::Log( LPCVOID lpBuffer,
DWORD dwLength) { assert (lpBuffer); char temp[10]; static const char format[3][10]
= { "%Y" ,
"%Y-%m" ,
"%Y%m%d" }; __try { Lock(); time_t now
= time (NULL); strftime (temp,
9, format[_iType], localtime (&now)); if ( strcmp (_szLastDate,
temp) != 0) //更换文件名 { strcat ( strcpy (_szFileName,
_szPath), "\\" ); strcat ( strcat (_szFileName,
temp), ".log" ); strcpy (_szLastDate,
temp); Close(); } if (!OpenFile()) return ; WriteLog(lpBuffer,
dwLength); } __finally { Unlock(); } } //------------------------------------------------------------------------- void LogFileEx::Log( const char *szText) { Log(szText,
strlen (szText)); } //------------------------------------------------------------------------- void LogFileEx::Log( const AnsiString&szText) { Log(szText.c_str(),szText.Length()); } |
3.随便测试的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//--------------------------------------------------------------------------- #include
<vcl.h> #include
<conio.h> #include
"LogFileEx.h" #pragma
hdrstop //--------------------------------------------------------------------------- #pragma
argsused int main( int argc,
char *
argv[]) { LogFileEx
log ; log .Log( "哈哈" ); AnsiString
temp= "adsfsadfsadfsaf" ; log .Log(temp); log .Log(temp); getch(); return 0; } //--------------------------------------------------------------------------- |
1
|
|