其他分享
首页 > 其他分享> > 异步日志文件模块实现

异步日志文件模块实现

作者:互联网

异步日志文件模块实现


前先时间,在公司做的一个项目,当时并没有觉得有什么问题;但是后来发现,在写日志的时候,每次都是同步在写,尤其是写文件,这个是比较耗时的,所以就想优化一下;

优化方案:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRTy7K6R-1582939007578)(D:\学习总结\网络通信\异步日志文件\1.png)]

使用队列的好处:



实现

注意:一般不同的模块就是一个线程,这时候就需要加锁,否则会出现访问权限冲突的问题;

这里写了一个简单的例子,仅供参考:

#pragma once
#include <iostream>
#include <queue>
#include <windows.h>
#include <mutex>

using namespace std;

struct MSGLOG
{
	//0 info;1 error;
	int type;
	char info[256];
};

class QueueLog
{
public:
	QueueLog();
	static QueueLog& instance();
	~QueueLog();
	bool SetLog(string logmsg,int type);
	MSGLOG GetLog();
private:
	MSGLOG msg;
	queue<MSGLOG>que;
	std::mutex _mutex;
};

#define LOG QueueLog::instance()

#include "QueueLog.h"

QueueLog::QueueLog()
{

}

QueueLog::~QueueLog()
{

}

QueueLog& QueueLog::instance()
{
	static QueueLog quelog;
	return quelog;
}

bool QueueLog::SetLog(string logmsg, int type)
{
	std::lock_guard<mutex>lock(_mutex);
	//不做判空
	memset(&msg,0,sizeof(msg));
	msg.type = type;
	memcpy(&msg.info, logmsg.c_str(), logmsg.length());
	que.push(msg);
	return true;
}

MSGLOG QueueLog::GetLog()
{
	std::lock_guard<mutex>lock(_mutex);
	MSGLOG getMsg;
	memset(&getMsg,0,sizeof(getMsg));
	if (que.empty())
	{
		goto EXIT;
	}
	//while (que.empty())
	//{
	//	Sleep(2);
	//}
	//Sleep(3);
	getMsg = que.front();
	que.pop();
EXIT:
	return getMsg;
}
#pragma once
#include <iostream>
#include <string>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h> 
#include <log4cplus/layout.h> 
#include <log4cplus/loggingmacros.h> 
#include <log4cplus/helpers/stringhelper.h> 

#define MY_LOG_FILE_PATH "../log/logconfig.properites"

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;

class MyLogger
{
public:
	static MyLogger & getInstance();
	Logger logger;
private:
	MyLogger();
	~MyLogger();
};

#define LOG4CPLUS MyLogger::getInstance()
#include "logger.h"

MyLogger::MyLogger()
{
	log4cplus::initialize();
	PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));
	logger = Logger::getRoot();

}


MyLogger & MyLogger::getInstance()
{
	static MyLogger log;
	return log;
}

MyLogger::~MyLogger()
{
}

#include "QueueLog.h"
#include "test.h"
#include "logger.h"
#include <thread>

using namespace std;

void SetTest2()
{
	while (1)
	{
		MSGLOG msg;
		memset(&msg, 0, sizeof(msg));
		LOG.SetLog("test", 0);
		LOG.SetLog("test2", 0);
		LOG.SetLog("test3", 0);
		LOG.SetLog("test4", 0);
		Sleep(5);
	}

}

int main()
{
	std::thread t1(SetTest2);
	MSGLOG msg;
	/*memset(&msg,0,sizeof(msg));
	LOG.SetLog("test",0);*/
	SetTest();
	while (1)
	{
		memset(&msg, 0, sizeof(msg));
		msg = LOG.GetLog();
		switch(msg.type)
		{
			case 0:
				LOG4CPLUS_DEBUG(LOG4CPLUS.logger, msg.info);
				break;
			case 1:
				LOG4CPLUS_DEBUG(LOG4CPLUS.logger, msg.info);
				break;
		}
		cout << "id:" << msg.type << endl;
		cout << "msg:" << msg.info << endl;
		//Sleep(1);
	}
	t1.join();
	system("pause");
	return 0;
}


总结:

这就是一个简单的异步日志实现,项目流程比较简单,这个也可以符合要求;其实现在存在大量的消息队列的开源库,性能比较高,不过自己去设计、排错也是一个成长的过程;


想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:CPP后台服务器开发


");
return 0;
}




**************

********

**总结:**

这就是一个简单的异步日志实现,项目流程比较简单,这个也可以符合要求;其实现在存在大量的消息队列的开源库,性能比较高,不过自己去设计、排错也是一个成长的过程;

************

想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:====**CPP后台服务器开发**====

**************



CPP后台服务器开发 发布了198 篇原创文章 · 获赞 68 · 访问量 7万+ 私信 关注

标签:异步,LOG,MyLogger,QueueLog,模块,msg,日志,include
来源: https://blog.csdn.net/Travelerwz/article/details/104569101