使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志。
主要提供以下接口:
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#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
|
?
|
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
|
?
|
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);
}
|
以上就是本文的全部内容,希望对大家的学习C++有所帮助。
相关文章
猜你喜欢
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-27 58
-
2025-05-25 81
-
2025-05-27 49
-
2025-05-25 47
-
2025-05-29 23
热门评论

