写LOg 生成日志
来源:互联网 发布:北京税控开票软件 编辑:程序博客网 时间:2024/06/05 20:02
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
阅读全文
0 0
- 写LOg 生成日志
- 写wal log日志
- Delphi中写日志文件log总结
- C# 写程序日志 log文件
- 写Windows应用程序日志(event log)
- 自己写的C++日志类log
- leveldb(八):log::Writer写日志
- Log:向 Android 日志中写消息
- C++中关于写日志文件Log的方法
- C++中关于写日志文件Log的方法
- SQL server每个日志写(log write)究竟有多大?
- C++中关于写日志文件Log的方法
- SQL server每个日志写(log write)究竟有多大
- SVN的钩子--限制强制写日志(log)
- UFO提示写日志文件ufoerr.log 错误
- Caffe命令行解析及log日志文件生成
- Log日志
- Log日志
- android c语言实现 热修复 sdk18
- Spark基本概念快速入门
- python里使用正则表达式来替换匹配成功的组名
- angularjs的增删改查
- EasyUI编辑弹出框设置
- 写LOg 生成日志
- 写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)
- java使用jsp servlet来防止csrf 攻击的实现方法
- 图形用户界面2
- 无约束优化基础--解的条件
- 算法(一) --DP动态规划(LIS和LCS)
- linux Centos6.5 下python2.6升级到2.7
- PullToRefresh+Banner无限轮播
- Java多线程--非公平锁