C++语言编写写日志类

2025-05-29 0 37

使用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++有所帮助。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C++语言编写写日志类 https://www.kuaiidc.com/106457.html

相关文章

发表评论
暂无评论