#ifndef COMMAND_DEFINE_H
#define COMMAND_DEFINE_H
//日志级别的提示信息
static
const
char
* KEYINFOPREFIX =
" Key: \n"
;
static
const
char
* ERRORPREFIX =
" Error: \n"
;
static
const
char
* WARNINGPREFIX =
" Warning: \n"
;
static
const
char
* INFOPREFIX =
" Info: \n"
;
static
const
int
MAX_STR_LEN = 1024;
//日志级别枚举
typedef
enum
EnumLogLevel
{
LogLevelAll = 0,
//所有信息都写日志
LogLevelMid,
//写错误、警告信息
LogLevelNormal,
//只写错误信息
LogLevelStop
//不写日志
};
#endif
|
[2].[文件] Logger.h ~ 1KB 下载(230) 跳至 [1] [2] [3]
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
|
#ifndef LOGGER_H_
#define LOGGER_H_
#include <Windows.h>
#include <stdio.h>
#include "CommandDefine.h"
/*
* 类名:Logger
* 作用:提供写日志功能,支持多线程,支持可变形参数操作,支持写日志级别的设置
* 接口:SetLogLevel:设置写日志级别
TraceKeyInfo:忽略日志级别,写关键信息
TraceError:写错误信息
TraceWarning:写警告信息
TraceInfo:写一般信息
*/
class
Logger
{
public
:
//默认构造函数
Logger();
//构造函数
Logger(
const
char
* strLogPath, EnumLogLevel nLogLevel = EnumLogLevel::LogLevelNormal);
//析构函数
virtual
~Logger();
public
:
//写关键信息
void
TraceKeyInfo(
const
char
* strInfo, ...);
//写错误信息
void
TraceError(
const
char
* strInfo, ...);
//写警告信息
void
TraceWarning(
const
char
* strInfo, ...);
//写一般信息
void
TraceInfo(
const
char
* strInfo, ...);
//设置写日志级别
void
SetLogLevel(EnumLogLevel nLevel);
private
:
//写文件操作
void
Trace(
const
char
* strInfo);
//获取当前系统时间
char
* GetCurrentTime();
//创建日志文件名称
void
GenerateLogName();
//创建日志路径
void
CreateLogPath();
private
:
//写日志文件流
FILE
* m_pFileStream;
//写日志级别
EnumLogLevel m_nLogLevel;
//日志的路径
char
m_strLogPath[MAX_STR_LEN];
//日志的名称
char
m_strCurLogName[MAX_STR_LEN];
//线程同步的临界区变量
CRITICAL_SECTION m_cs;
};
#endif
|
[3].[文件] Logger.cpp ~ 4KB 下载(210) 跳至 [1] [2] [3]
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
#include "Logger.h"
#include <imagehlp.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>
#pragma comment(lib, "DbgHelp.lib")
//默认构造函数
Logger::Logger()
{
//初始化
memset
(m_strLogPath, 0, MAX_STR_LEN);
memset
(m_strCurLogName, 0, MAX_STR_LEN);
m_pFileStream = NULL;
//设置默认的写日志级别
m_nLogLevel = EnumLogLevel::LogLevelNormal;
//初始化临界区变量
InitializeCriticalSection(&m_cs);
//创建日志文件名
GenerateLogName();
}
//构造函数
Logger::Logger(
const
char
* strLogPath, EnumLogLevel nLogLevel):m_nLogLevel(nLogLevel)
{
//初始化
m_pFileStream = NULL;
strcpy
(m_strLogPath, strLogPath);
InitializeCriticalSection(&m_cs);
CreateLogPath();
GenerateLogName();
}
//析构函数
Logger::~Logger()
{
//释放临界区
DeleteCriticalSection(&m_cs);
//关闭文件流
if
(m_pFileStream)
fclose
(m_pFileStream);
}
//写关键信息接口
void
Logger::TraceKeyInfo(
const
char
* strInfo, ...)
{
if
(!strInfo)
return
;
char
pTemp[MAX_STR_LEN] = {0};
strcpy
(pTemp, GetCurrentTime());
strcat
(pTemp, KEYINFOPREFIX);
//获取可变形参
va_list
arg_ptr = NULL;
va_start
(arg_ptr, strInfo);
vsprintf
(pTemp +
strlen
(pTemp), strInfo, arg_ptr);
va_end
(arg_ptr);
//写日志文件
Trace(pTemp);
arg_ptr = NULL;
}
//写错误信息
void
Logger::TraceError(
const
char
* strInfo, ...)
{
//判断当前的写日志级别,若设置为不写日志则函数返回
if
(m_nLogLevel >= EnumLogLevel::LogLevelStop)
return
;
if
(!strInfo)
return
;
char
pTemp[MAX_STR_LEN] = {0};
strcpy
(pTemp, GetCurrentTime());
strcat
(pTemp, ERRORPREFIX);
va_list
arg_ptr = NULL;
va_start
(arg_ptr, strInfo);
vsprintf
(pTemp +
strlen
(pTemp), strInfo, arg_ptr);
va_end
(arg_ptr);
Trace(pTemp);
arg_ptr = NULL;
}
//写警告信息
void
Logger::TraceWarning(
const
char
* strInfo, ...)
{
//判断当前的写日志级别,若设置为只写错误信息则函数返回
if
(m_nLogLevel >= EnumLogLevel::LogLevelNormal)
return
;
if
(!strInfo)
return
;
char
pTemp[MAX_STR_LEN] = {0};
strcpy
(pTemp, GetCurrentTime());
strcat
(pTemp, WARNINGPREFIX);
va_list
arg_ptr = NULL;
va_start
(arg_ptr, strInfo);
vsprintf
(pTemp +
strlen
(pTemp), strInfo, arg_ptr);
va_end
(arg_ptr);
Trace(pTemp);
arg_ptr = NULL;
}
//写一般信息
void
Logger::TraceInfo(
const
char
* strInfo, ...)
{
//判断当前的写日志级别,若设置只写错误和警告信息则函数返回
if
(m_nLogLevel >= EnumLogLevel::LogLevelMid)
return
;
if
(!strInfo)
return
;
char
pTemp[MAX_STR_LEN] = {0};
strcpy
(pTemp, GetCurrentTime());
strcat
(pTemp,INFOPREFIX);
va_list
arg_ptr = NULL;
va_start
(arg_ptr, strInfo);
vsprintf
(pTemp +
strlen
(pTemp), strInfo, arg_ptr);
va_end
(arg_ptr);
Trace(pTemp);
arg_ptr = NULL;
}
//获取系统当前时间
char
* Logger::GetCurrentTime()
{
time_t
curTime;
struct
tm
* pTimeInfo = NULL;
time
(&curTime);
pTimeInfo =
localtime
(&curTime);
char
temp[MAX_STR_LEN] = {0};
sprintf
(temp,
"%02d:%02d:%02d"
, pTimeInfo->tm_hour, pTimeInfo->tm_min, pTimeInfo->tm_sec);
char
* pTemp = temp;
return
pTemp;
}
//设置写日志级别
void
Logger::SetLogLevel(EnumLogLevel nLevel)
{
m_nLogLevel = nLevel;
}
//写文件操作
void
Logger::Trace(
const
char
* strInfo)
{
if
(!strInfo)
return
;
try
{
//进入临界区
EnterCriticalSection(&m_cs);
//若文件流没有打开,则重新打开
if
(!m_pFileStream)
{
char
temp[1024] = {0};
strcat
(temp, m_strLogPath);
strcat
(temp, m_strCurLogName);
m_pFileStream =
fopen
(temp,
"a+"
);
if
(!m_pFileStream)
{
return
;
}
}
//写日志信息到文件流
fprintf
(m_pFileStream,
"%s\n"
, strInfo);
fflush
(m_pFileStream);
//离开临界区
LeaveCriticalSection(&m_cs);
}
//若发生异常,则先离开临界区,防止死锁
catch
(...)
{
LeaveCriticalSection(&m_cs);
}
}
//创建日志文件的名称
void
Logger::GenerateLogName()
{
time_t
curTime;
struct
tm
* pTimeInfo = NULL;
time
(&curTime);
pTimeInfo =
localtime
(&curTime);
char
temp[1024] = {0};
//日志的名称如:2013-01-01.log
sprintf
(temp,
"%04d-%02d-%02d.log"
, pTimeInfo->tm_year+1900, pTimeInfo->tm_mon + 1, pTimeInfo->tm_mday);
if
(0 !=
strcmp
(m_strCurLogName, temp))
{
strcpy
(m_strCurLogName,temp);
if
(m_pFileStream)
fclose
(m_pFileStream);
char
temp[1024] = {0};
strcat
(temp, m_strLogPath);
strcat
(temp, m_strCurLogName);
//以追加的方式打开文件流
m_pFileStream =
fopen
(temp,
"a+"
);
}
}
//创建日志文件的路径
void
Logger::CreateLogPath()
{
if
(0 !=
strlen
(m_strLogPath))
{
strcat
(m_strLogPath,
"\\"
);
}
MakeSureDirectoryPathExists(m_strLogPath);
}
|