//------------------------------------------------------------------------------------- void DebugHelper::sync() { lockthread(); if(hasBufferedLogPackets_ == 0) { unlockthread(); return; } if(Mercury::Address::NONE == messagelogAddr_) { if(hasBufferedLogPackets_ > g_kbeSrvConfig.tickMaxBufferedLogs()) { clearBufferedLog(); } canLogFile_ = true; unlockthread(); return; } Mercury::Channel* pMessagelogChannel = pNetworkInterface_->findChannel(messagelogAddr_); if(pMessagelogChannel == NULL) { if(hasBufferedLogPackets_ > g_kbeSrvConfig.tickMaxBufferedLogs()) { clearBufferedLog(); } canLogFile_ = true; unlockthread(); return; } int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; uint32 i = 0; size_t totalLen = 0; while(!bufferedLogPackets_.empty()) { if(i++ >= g_kbeSrvConfig.tickMaxSyncLogs() || totalLen > (PACKET_MAX_SIZE_TCP * 10)) break; Mercury::Bundle* pBundle = bufferedLogPackets_.front(); bufferedLogPackets_.pop(); totalLen += pBundle->currMsgLength(); pMessagelogChannel->send(pBundle); --hasBufferedLogPackets_; } Mercury::g_trace_packet = v; canLogFile_ = false; unlockthread(); }
//------------------------------------------------------------------------------------- void DebugHelper::sync() { if(bufferedLogPackets_.size() == 0) return; if(Mercury::Address::NONE == messagelogAddr_) { if(bufferedLogPackets_.size() > g_kbeSrvConfig.tickMaxBufferedLogs()) { clearBufferedLog(); } return; } Mercury::Channel* pMessagelogChannel = pNetworkInterface_->findChannel(messagelogAddr_); if(pMessagelogChannel == NULL) { if(bufferedLogPackets_.size() > g_kbeSrvConfig.tickMaxBufferedLogs()) { clearBufferedLog(); } return; } int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; uint32 i = 0; size_t totalLen = 0; std::list< Mercury::Bundle* >::iterator iter = bufferedLogPackets_.begin(); for(; iter != bufferedLogPackets_.end();) { if(i++ >= g_kbeSrvConfig.tickMaxSyncLogs() || totalLen > (PACKET_MAX_SIZE_TCP * 10)) break; totalLen += (*iter)->currMsgLength(); pMessagelogChannel->send((*iter)); bufferedLogPackets_.erase(iter++); } Mercury::g_trace_packet = v; }
//------------------------------------------------------------------------------------- void DebugHelper::sync() { if(bufferedLogPackets_.size() == 0) return; if(messagelogAddr_.isNone()) { if(bufferedLogPackets_.size() > 128) { ERROR_MSG("DebugHelper::sync: can't found messagelog. packet size=%u.\n", bufferedLogPackets_.size()); clearBufferedLog(); } return; } int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; Mercury::Channel* pChannel = pNetworkInterface_->findChannel(messagelogAddr_); if(pChannel == NULL) { if(bufferedLogPackets_.size() > 1024) { messagelogAddr_.ip = 0; messagelogAddr_.port = 0; WARNING_MSG("DebugHelper::sync: is no use the messagelog, packet size=%u.\n", bufferedLogPackets_.size()); clearBufferedLog(); } Mercury::g_trace_packet = v; return; } if(bufferedLogPackets_.size() > 0) { if(bufferedLogPackets_.size() > 32) { WARNING_MSG("DebugHelper::sync: packet size=%u.\n", bufferedLogPackets_.size()); } int i = 0; size_t totalLen = 0; std::list< Mercury::Bundle* >::iterator iter = bufferedLogPackets_.begin(); for(; iter != bufferedLogPackets_.end();) { if(i++ >= 32 || totalLen > (PACKET_MAX_SIZE_TCP * 10)) break; totalLen += (*iter)->currMsgLength(); pChannel->send((*iter)); Mercury::Bundle::ObjPool().reclaimObject((*iter)); bufferedLogPackets_.erase(iter++); } } Mercury::g_trace_packet = v; }
//------------------------------------------------------------------------------------- DebugHelper::~DebugHelper() { clearBufferedLog(); }
//------------------------------------------------------------------------------------- void DebugHelper::onMessage(uint32 logType, const char * str, uint32 length) { #if !defined( _WIN32 ) && !defined( PLAYSTATION3 ) if (g_shouldWriteToSyslog) { int lid = LOG_INFO; switch(logType) { case KBELOG_ERROR: lid = LOG_ERR; break; case KBELOG_CRITICAL: lid = LOG_CRIT; break; case KBELOG_WARNING: lid = LOG_WARNING; break; default: lid = LOG_INFO; break; }; if(lid == KBELOG_ERROR || lid == KBELOG_CRITICAL) syslog( LOG_CRIT, "%s", str ); } #endif if(length <= 0 || noSyncLog_) return; if(g_componentType == MACHINE_TYPE || g_componentType == CONSOLE_TYPE || g_componentType == MESSAGELOG_TYPE) return; if(hasBufferedLogPackets_ > g_kbeSrvConfig.tickMaxBufferedLogs()) { int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; #ifdef NO_USE_LOG4CXX #else LOG4CXX_WARN(g_logger, "DebugHelper::onMessage: bufferedLogPackets is full, discard log-packets!\n"); #endif Mercury::g_trace_packet = v; clearBufferedLog(); return; } Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; pBundle->newMessage(MessagelogInterface::writeLog); (*pBundle) << logType; (*pBundle) << g_componentType; (*pBundle) << g_componentID; (*pBundle) << g_componentGlobalOrder; int64 t = time(NULL); (*pBundle) << t; (*pBundle) << g_kbetime; (*pBundle) << str; ++hasBufferedLogPackets_; bufferedLogPackets_.push(pBundle); Mercury::g_trace_packet = v; g_pDebugHelperSyncHandler->startActiveTick(); }
//------------------------------------------------------------------------------------- DebugHelper::~DebugHelper() { clearBufferedLog(true); // SAFE_RELEASE(g_pDebugHelperSyncHandler); }