C++写日志 *** 作

C++写日志 *** 作,第1张

概述C++写日志 *** 作

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

使用C++语言编写写日志类,支持写日志级别设置、支持多线程、支持可变形参表写日志。
主要提供以下接口:
1、设置写日志的级别
2、写关键日志信息
3、写错误日志信息
4、写警告日志信息
5、写一般日志信息
#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
#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
#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,MAX_STR_LEN);	memset(m_strCurLogname,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,ERRORPREFIX);	va_List arg_ptr = NulL;	va_start(arg_ptr,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,WARNINGPREFIX);	va_List arg_ptr = NulL;	va_start(arg_ptr,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,INFOPREFIX);	va_List arg_ptr = NulL;	va_start(arg_ptr,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);}

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的C++写日志 *** 作全部内容,希望文章能够帮你解决C++写日志 *** 作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1231868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存