运营日志是为了运营人员查看游戏运行情况而增加的。把场景服务器的日志信息发送到运营服务器,再写到mysql数据库(方便运营后台查询,一般是php后台)。
设计思想:
1、逻辑线程派送运营日志到运营日志线程的添加队列。
2、每种类型的日志会对应有发送队列和添加队列,运营日志线程需要发送时就从发送队列中获取日志。
3、交换添加队列和发送队列(需要加锁),从发送队列里获取的所有日志(每次最多100个)组成一个消息发送到运营服务器。
4、运营服务器把接收到的日志添加到追加日志队列(需要加锁)。
5、运营服务器的逻辑线程(可以有多个逻辑线程,每个都对应有2个日志队列)检查有没创建表,没有就创建,交换追加日志队列和写入日志队列。
6、运营服务器的逻辑线程把写入日志队列的日志组成一个sql(每次最多处理100个日志),写入mysql。
本文内容:
1、场景服务器派送日志到运营日志线程
2、交换添加日志队列和发送日志队列
3、运营日志线程循环
4、把发送队列日志组成一个消息发送出去(到运营日志服务器)
5、运营日志服务器把日志接收到添加日志队列
6、运营日志逻辑线程(可以有多个,目前有两个)
7、把日志写入mysql
1、场景服务器派送日志到运营日志线程。
void operation_log_thread::operationGoodsLogDispatch(uint32 roleId,
uint16 rolelevel,uint32 itemId,uint32 itemBaseId,uint32 preNum,
uint32 lastNum,uint8 loc,uint16 optype,uint32 desc)
{
#if TEST_OPERATION_THREAD
OperationGoodsLog operationLog;
operationLog.fill(roleId,rolelevel,itemId,itemBaseId,preNum,lastNum,loc,optype,desc);
g_operation_log_thread.m_OperationLogLock.lock();
g_operation_log_thread.m_pOperationGoodsLogAppendList->push_back(operationLog);
g_operation_log_thread.m_OperationLogLock.unlock();
#endif
}
2、交换添加日志队列和发送日志队列
void operation_log_thread::changeOperationGoodsLogList()
{
if (m_pOperationGoodsLogToSendingList->empty() && !m_pOperationGoodsLogAppendList->empty())
{
m_OperationLogLock.lock();
//交换待处理运营日志列表与添加运营日志列表
MSGGoodsLogSendingList* pTempList = m_pOperationGoodsLogToSendingList;
m_pOperationGoodsLogToSendingList = m_pOperationGoodsLogAppendList;
m_pOperationGoodsLogAppendList = pTempList;
m_OperationLogLock.unlock(