Browse Source

Merge branch 'ST2_0927_chromium_sharangan' into ST2_1031_merge_sharanan_and_multiDB

chenliangyu 11 months ago
parent
commit
062ed164fb

+ 4 - 1
Framework/Common/SpBase.h

@@ -1163,7 +1163,8 @@ struct IEntityFunctionPrivilege
 	virtual void GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
 		unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
 		unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
-		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err) = 0;
+		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err,
+		unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum) = 0;
 
 	
 	//replace params with VTMInitParam; if one param in VTMInitParam equals to "", it will not replace to old value
@@ -1639,6 +1640,8 @@ SPBASE_API void destroy_log_producer_default();
 SPBASE_API void load_debugLevelInCentersetting(const char* fileName);
 SPBASE_API bool refreshLogLevel();
 SPBASE_API int getCurLogLevel();
+SPBASE_API int getReduceSpbaseLog();
+SPBASE_API void setReduceSpbaseLog(int isNor);
 SPBASE_API ErrorCodeEnum GetAllEntityIdx(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<WORD>& wEntityDevelopIDs);
 
 

+ 1 - 0
Framework/Common/def.h

@@ -16,6 +16,7 @@
 #define SHELL_CMD_REQ_WRITE_TERMINALNO			10
 #define SHELL_CMD_REQ_MODIFY_MEM_CFG			11
 #define SHELL_CMD_REQ_TRY_UPDATE_VTMERRMSG		12
+#define SHELL_CMD_REQ_GET_UPLOAD_LOGS_INFO			13
 
 #define SHELL_CMD_INFO_MACHINE_REBOOT		        1
 #define SHELL_CMD_INFO_BLUESCREEN_DISPLAY	    2

+ 1 - 0
Framework/RvcLogSdk/log_db.cpp

@@ -747,6 +747,7 @@ int db_get_count(log_db_manager* manager) {
 
 	try {
 		ret = manager->db->execScalar(sql.c_str());
+		g_notUploadLogNum = ret;
 		//aos_debug_log((LB, "db %s get count %d", manager->file_name.c_str(), ret));
 	}
 	catch (CppSQLite3Exception& e)

+ 8 - 0
Framework/RvcLogSdk/log_producer_config.c

@@ -354,6 +354,14 @@ void log_producer_config_get_upload_info(unsigned long* t_upload_TerminalSys_Suc
     *t_upload_beidou_Err = g_upload_beidou_Err;
 }
 
+void log_producer_config_get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum)
+{
+    *t_discard_full = g_discardMsgNum_since_full;
+    *t_discard_RTI1002 = g_discardMsgNum_since_serverRet_RTI1002;
+    *curLogNum = g_notUploadLogNum;
+}
+
+
 LOG_EXPORT void log_producer_config_set_dbgFun(dbg_callback t_callback)
 {
     g_callback = t_callback;

+ 7 - 2
Framework/RvcLogSdk/log_producer_config.h

@@ -80,6 +80,9 @@ extern unsigned long g_upload_TerminalUser_Err;
 extern unsigned long g_upload_BussinessSys_Err;
 extern unsigned long g_upload_BussinessUser_Err;
 extern unsigned long g_upload_beidou_Err;
+extern unsigned long g_discardMsgNum_since_full;
+extern unsigned long g_discardMsgNum_since_serverRet_RTI1002;
+extern unsigned long g_notUploadLogNum;
 
 
 /**
@@ -137,11 +140,13 @@ LOG_EXPORT void log_producer_config_set_united_needArchived(log_producer_config*
 LOG_EXPORT void log_producer_config_set_united_deployUnitId(log_producer_config* config, char* deployUnitId);
 LOG_EXPORT void log_producer_config_set_united_serviceUnitId(log_producer_config* config, char* serviceUnitId);
 
-LOG_EXPORT void log_producer_config_get_upload_info(unsigned long *t_upload_TerminalSys_Suc, unsigned long *t_upload_TerminalUser_Suc, 
-    unsigned long *t_upload_BussinessSys_Suc, unsigned long *t_upload_BussinessUser_Suc, unsigned long *t_upload_beidou_Suc,
+LOG_EXPORT void log_producer_config_get_upload_info(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
+    unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
     unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
     unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err);
 
+LOG_EXPORT void log_producer_config_get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum);
+
 typedef void (*dbg_callback)(const char*);
 extern dbg_callback g_callback;
 // 日志回调函数

+ 3 - 2
Framework/RvcLogSdk/log_producer_manager.c

@@ -232,11 +232,11 @@ void* log_producer_read_persistent_thread(void* param)
                 else {
                     if ((producer_manager->send_param_queue_write - producer_manager->send_param_queue_read) < producer_manager->send_param_queue_size)
                     {
-                        sleepMs = 1200 * LOG_PRODUCER_READ_INTERVAL_MS;//120s send once if can not get enough
+                        sleepMs = 600 * LOG_PRODUCER_READ_INTERVAL_MS;//60s send once if can not get enough
                         forceClean = 1;
                     }                        
                     else
-                        sleepMs = 10 * LOG_PRODUCER_READ_INTERVAL_MS;//普通暂停时间,等待发送线程发送
+                        sleepMs = 3 * LOG_PRODUCER_READ_INTERVAL_MS;//普通暂停时间,等待发送线程发送
                     //aos_debug_log((LB, "get from persistent is null."));
                     break;
                 }
@@ -335,6 +335,7 @@ void* log_producer_write_persistent_thread(void* param)
         t_count = db_get_count(persistent_manager->db_manager);
         if (t_count > (persistent_manager->config->maxPersistentLogCount + 2000)) {
             discardMsg = 1;
+            g_discardMsgNum_since_full = g_discardMsgNum_since_full + 1;
             aos_warn_log((LB, "give up the db content, bcz db count %d exceeds max count %d", t_count, persistent_manager->config->maxPersistentLogCount));
         }
         else {

+ 5 - 3
Framework/RvcLogSdk/log_producer_sender.c

@@ -33,7 +33,6 @@ const char* LOGE_TIME_EXPIRED = "RequestTimeExpired";
 
 ///**TODO(Gifur@4/27/2023): 这套在Linux下行不通!! */
 
-#pragma data_seg("LOG_SEND_INFO")
 unsigned long g_upload_TerminalSys_Suc = 0;
 unsigned long g_upload_TerminalUser_Suc = 0;
 unsigned long g_upload_BussinessSys_Suc = 0;
@@ -46,8 +45,9 @@ unsigned long g_upload_BussinessSys_Err = 0;
 unsigned long g_upload_BussinessUser_Err = 0;
 unsigned long g_upload_beidou_Err = 0;
 unsigned long g_upload_vtmsdk_Err = 0;
-#pragma data_seg()
-#pragma comment(linker,"/section:LOG_SEND_INFO,rws")
+unsigned long g_discardMsgNum_since_full = 0;
+unsigned long g_discardMsgNum_since_serverRet_RTI1002 = 0;
+unsigned long g_notUploadLogNum = 0;
 
 
 //#define SEND_TIME_INVALID_FIX
@@ -271,6 +271,8 @@ void * log_producer_send_fun(void * param)
             default:
                 break;
             }
+            if(rst->statusCode == 300)
+                g_discardMsgNum_since_serverRet_RTI1002 += send_buf->n_logs;
         }
 
         sleepMs = log_producer_on_send_done(send_param, rst, &error_info) / 2;//执行senddone,删除数据库中内容

+ 69 - 7
Framework/spbase/SpEntityPrivilege.cpp

@@ -39,6 +39,7 @@
 #include <winpr/crt.h>
 #include <winpr/file.h>
 #endif //RVC_OS_WIN
+#include <SpHelper.h>
 
 static ErrorCodeEnum ControlEntity(
 	SpEntity *pEntity, 
@@ -2425,18 +2426,79 @@ ErrorCodeEnum SpEntityPrivilege::TryUpdateCenterCfg(bool& isUpdate, bool& isRese
 		
 	return (ErrorCodeEnum)ret;
 }
+struct Log_Info
+{
+	unsigned int t_upload_TerminalSys_Suc;
+	unsigned int t_upload_TerminalUser_Suc;
+	unsigned int t_upload_BussinessSys_Suc;
+	unsigned int t_upload_BussinessUser_Suc;
+	unsigned int t_upload_beidou_Suc;
+	unsigned int t_upload_TerminalSys_Err;
+	unsigned int t_upload_TerminalUser_Err;
+	unsigned int t_upload_BussinessSys_Err;
+	unsigned int t_upload_BussinessUser_Err;
+	unsigned int t_upload_beidou_Err;
+	unsigned int t_discard_full;
+	unsigned int t_discard_RTI1002;
+	unsigned int curLogNum;
+
+	void Serialize(SpBuffer& Buf)
+	{
+		auto& buf = Buf & t_upload_TerminalSys_Suc & t_upload_TerminalUser_Suc & t_upload_BussinessSys_Suc &
+		 t_upload_BussinessUser_Suc & t_upload_beidou_Suc & t_upload_TerminalSys_Err & t_upload_TerminalUser_Err &
+		  t_upload_BussinessSys_Err & t_upload_BussinessUser_Err & t_upload_beidou_Err & t_discard_full & t_discard_RTI1002 & curLogNum;
+	}
+};
+
 
 void SpEntityPrivilege::GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
 	unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
 	unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
-	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err)
+	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err, 
+	unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum)
 {
-#if defined(_MSC_VER)
-	log_producer_config_get_upload_info(t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
-		t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err);
-#else
-	///*TODO(80374374@3/9/2023):  */
-#endif //_MSC_VER
+	iobuffer_t* req_pkt = iobuffer_create(-1, -1);
+	SpAsyncWaitRPC* pAsyncWait = new SpAsyncWaitRPC(this, &req_pkt, SHELL_CMD_REQ_GET_UPLOAD_LOGS_INFO);
+	ErrorCodeEnum Error = pAsyncWait->Begin();
+
+	if (Error == Error_Succeed)
+	{
+		Error = pAsyncWait->WaitAnswer(30000);//WaitAnswer如果设定为INFINE,则最大10s,在http访问中会触发超时
+		if (Error == Error_Succeed)
+		{
+			CAutoBuffer AnsBuf;
+			bool bEnd;
+			Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
+			if (Error == Error_Succeed)
+			{
+				Log_Info cur;
+				SpBuffer2Object(AnsBuf, cur);
+
+				*t_upload_TerminalSys_Suc = cur.t_upload_TerminalSys_Suc;
+				*t_upload_TerminalUser_Suc = cur.t_upload_TerminalUser_Suc;
+				*t_upload_BussinessSys_Suc = cur.t_upload_BussinessSys_Suc;
+				*t_upload_BussinessUser_Suc = cur.t_upload_BussinessUser_Suc;
+				*t_upload_beidou_Suc = cur.t_upload_beidou_Suc;
+				*t_upload_TerminalSys_Err = cur.t_upload_TerminalSys_Err;
+				*t_upload_TerminalUser_Err = cur.t_upload_TerminalUser_Err;
+				*t_upload_BussinessSys_Err = cur.t_upload_BussinessSys_Err;
+				*t_upload_BussinessUser_Err = cur.t_upload_BussinessUser_Err;
+				*t_upload_beidou_Err = cur.t_upload_beidou_Err;
+				*t_discard_full = cur.t_discard_full;
+				*t_discard_RTI1002 = cur.t_discard_RTI1002;
+				*curLogNum = cur.curLogNum;
+				/*
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
+					, cur.t_upload_TerminalSys_Suc, cur.t_upload_TerminalUser_Suc, cur.t_upload_BussinessSys_Suc, cur.t_upload_BussinessUser_Suc, cur.t_upload_beidou_Suc,
+					cur.t_upload_TerminalSys_Err, cur.t_upload_TerminalUser_Err, cur.t_upload_BussinessSys_Err, cur.t_upload_BussinessUser_Err, cur.t_upload_beidou_Err
+					, cur.t_discard_full, cur.t_discard_RTI1002, cur.curLogNum);
+				*/
+			}
+		}
+	}
+	pAsyncWait->DecrementRef();
+	if (req_pkt)
+		iobuffer_dec_ref(req_pkt);
 
 }
 

+ 2 - 1
Framework/spbase/SpEntityPrivilege.h

@@ -69,7 +69,8 @@ public:
 	virtual void GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
 		unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
 		unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
-		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err);
+		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err,
+		unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum);
 
 	//Ïȵ÷ÓÃÕâ¸öÈ¥³õʼ»¯url
 	virtual ErrorCodeEnum InitCfgUrl(VTMInitParam& info);

+ 28 - 0
Framework/spbase/sp_cfg.cpp

@@ -47,6 +47,7 @@
 #include "JsonConvertHelper.hpp"
 #endif //_MSC_VER
 #include "sp_checkEntity.h"
+#include <log_producer_config.h>
 
 
 
@@ -587,10 +588,29 @@ int sp_cfg_getVer(char *ver)
 
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("read active.txt, version[%s]", s_terminalVer.GetData());
 	}
+	
+#ifdef RVC_OS_LINUX
+	sprintf(ver, "%s", s_terminalVer.GetData());
+#else
 	sprintf_s(ver, SP_MAX_VER_LEN, "%s", s_terminalVer.GetData());
+#endif
 	return Error_Succeed;
 }
 
+void get_upload_info(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
+	unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
+	unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
+	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err)
+{
+	log_producer_config_get_upload_info(t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
+		t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err);
+}
+
+void get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum)
+{
+	log_producer_config_get_upload_info2(t_discard_full, t_discard_RTI1002, curLogNum);
+}
+
 int sp_TryUpdateToken(char *oldToken, char *newToken)
 {
 	auto cfg = sp_get_env()->cfg;
@@ -686,7 +706,11 @@ int sp_tryReadFromCacheConfig(int cfgType, const char* section, const char* key,
 		return ErrorCodeEnum::Error_NoDefine;
 	else
 	{
+#ifdef RVC_OS_LINUX
+		sprintf(dst, "%s", curSection[key].c_str());
+#else
 		sprintf_s(dst, max_len, "%s", curSection[key].c_str());
+#endif
 		return Error_Succeed;
 	}
 }
@@ -732,7 +756,11 @@ int sp_tryReadFromCenterSetting(const char* section, const char* key, char *dst,
 		return ErrorCodeEnum::Error_NoDefine;
 	else
 	{
+#ifdef RVC_OS_LINUX
+		sprintf(dst, "%s", curSection[key].c_str());
+#else
 		sprintf_s(dst, max_len, "%s", curSection[key].c_str());
+#endif
 		return Error_Succeed;
 	}
 }

+ 6 - 0
Framework/spbase/sp_cfg.h

@@ -262,6 +262,12 @@ SPBASE_API void sp_cfg_setShellFirstStartTime(LARGE_TIME t_shellFirstStart);
 SPBASE_API void load_specialRunInfoInCentersetting(const char* fileName);
 SPBASE_API LARGE_TIME sp_cfg_getShellFirstStartTime();
 SPBASE_API int sp_cfg_getVer(char* ver);
+SPBASE_API void get_upload_info(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
+	unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
+	unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
+	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err);
+
+SPBASE_API void get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum);
 
 #define SP_MAX_VER_LEN		128
 #define SPSHELL_NAME		"SpShell"

+ 12 - 0
Framework/spbase/sp_logwithlink.cpp

@@ -38,6 +38,7 @@ int g_curEntityIdx = 0;
 std::map<std::string, int> g_entityDebugLevelArr;
 void* g_logProduceSender = NULL;
 int curEntityLogLevel = 1;
+int g_spbaseLogNor = 1;
 std::mutex g_logMtx;
 
 
@@ -828,6 +829,17 @@ SPBASE_API int getCurLogLevel()
     return curEntityLogLevel;
 }
 
+SPBASE_API void setReduceSpbaseLog(int isNor)
+{
+    g_spbaseLogNor = isNor;
+}
+
+SPBASE_API int getReduceSpbaseLog()
+{
+    return g_spbaseLogNor;
+}
+
+
 SPBASE_API bool create_log_producer_default(CSimpleStringA entityName, int idx)
 {
     refreshLogLevel();

+ 4 - 2
Framework/spbase/sp_tbs_unix.cpp

@@ -857,7 +857,8 @@ static void on_session(sp_tbs_t *tbs, sock_connection *conn, int tsx_id, char *e
 
 	rc = create_sub_session(tbs, conn, tsx_id, entity_name, function_name, class_name, &session);
 	if (rc == 0) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start create sub session!");
+		if(getReduceSpbaseLog())
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start create sub session!");
 		//post_session_ack(tbs, conn, session->id, tsx_id, rc, NULL);
 	} else {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create_sub_session failed! entity: %s, err = %d %s %d",
@@ -906,7 +907,8 @@ static void __bcm_on_message_raw(sp_bcm_listener_t *listener, int from_client_id
 	*msg_pkt = NULL;
 	sp_bcm_listener_inc_ref(listener); //@
 	post_msg(entry->conn->tbs, MSG_ON_EVENT, (param_size_t)entry, (param_size_t)pkt);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event from_client_id:%d", from_client_id);
+	if (getReduceSpbaseLog())
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event from_client_id:%d", from_client_id);
 }
 
 static void __bcm_on_destroy(sp_bcm_listener_t *listener, void *user_data)

+ 4 - 2
Framework/spbase/sp_tbs_win.cpp

@@ -721,7 +721,8 @@ static void on_session(sp_tbs_t *tbs, sock_connection *conn, int tsx_id, char *e
 
 	rc = create_sub_session(tbs, conn, tsx_id, entity_name, function_name, class_name, &session);
 	if (rc == 0) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start create sub session!");
+		if (getReduceSpbaseLog())
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start create sub session!");
 		//post_session_ack(tbs, conn, session->id, tsx_id, rc, NULL);
 	} else {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create_sub_session failed! entity: %s, err = %d %s %d",
@@ -771,7 +772,8 @@ static void __bcm_on_message_raw(sp_bcm_listener_t *listener, int from_client_id
 	*msg_pkt = NULL;
 	sp_bcm_listener_inc_ref(listener); //@
 	post_msg(entry->conn->tbs, MSG_ON_EVENT, (int)entry, (int)pkt);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("post event from_client_id:%d", from_client_id);
+	if(getReduceSpbaseLog())
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("post event from_client_id:%d", from_client_id);
 }
 
 static void __bcm_on_destroy(sp_bcm_listener_t *listener, void *user_data)

+ 1 - 0
Framework/spshell/app.cpp

@@ -118,6 +118,7 @@ static void on_req(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, in
 		HANDLE_REQ(SHELL_CMD_REQ_WRITE_TERMINALNO, on_write_terminalNo)
 		HANDLE_REQ(SHELL_CMD_REQ_MODIFY_MEM_CFG, on_modify_mem_cfg)
 		HANDLE_REQ(SHELL_CMD_REQ_TRY_UPDATE_VTMERRMSG, on_try_update_VTMERRMSG)
+		HANDLE_REQ(SHELL_CMD_REQ_GET_UPLOAD_LOGS_INFO, on_try_upload_logs_info)
 	END_REQ_MAP()
 }
 

+ 71 - 0
Framework/spshell/svc.cpp

@@ -793,6 +793,9 @@ iobuffer_t* on_try_update_VTMERRMSG(sp_rpc_server_t* server, int epid, int svc_i
 	return ans_pkt;
 }
 
+
+
+
 iobuffer_t* on_try_update_cfg(sp_rpc_server_t* server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t** req_pkt)
 {
 	iobuffer_t* ans_pkt = iobuffer_create(-1, -1);
@@ -877,3 +880,71 @@ iobuffer_t* on_modify_mem_cfg(sp_rpc_server_t* server, int epid, int svc_id, int
 	
 	return ans_pkt;
 }
+
+iobuffer_t* on_try_upload_logs_info(sp_rpc_server_t* server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t** req_pkt)
+{
+	iobuffer_t* ans_pkt = iobuffer_create(-1, -1);
+	unsigned long t_upload_TerminalSys_Suc = 0,
+		t_upload_TerminalUser_Suc = 0,
+		t_upload_BussinessSys_Suc = 0,
+		t_upload_BussinessUser_Suc = 0,
+		t_upload_beidou_Suc = 0,
+		t_upload_TerminalSys_Err = 0,
+		t_upload_TerminalUser_Err = 0,
+		t_upload_BussinessSys_Err = 0,
+		t_upload_BussinessUser_Err = 0,
+		t_upload_beidou_Err = 0;
+	unsigned long t_discard_full = 0,
+		t_discard_RTI1002 = 0,
+		curLogNum = 0;
+	get_upload_info(&t_upload_TerminalSys_Suc, &t_upload_TerminalUser_Suc, &t_upload_BussinessSys_Suc, &t_upload_BussinessUser_Suc, &t_upload_beidou_Suc,
+		&t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err);
+
+	get_upload_info2(&t_discard_full, &t_discard_RTI1002, &curLogNum);
+
+	ErrorCodeEnum nRet = Error_Succeed;
+	int end = 0;
+
+	//iobuffer_write(ans_pkt, IOBUF_T_I4, &nRet, 0);//dwSysError
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &nRet, 0);//UserError
+	//char* tmpStr = "";
+	//iobuffer_write(ans_pkt, IOBUF_T_STR, tmpStr, 0);
+	//iobuffer_write(ans_pkt, IOBUF_T_I4, &end, 0);//end
+
+	unsigned int i_upload_TerminalSys_Suc = t_upload_TerminalSys_Suc;
+	unsigned int i_upload_TerminalUser_Suc = t_upload_TerminalUser_Suc;
+	unsigned int i_upload_BussinessSys_Suc = t_upload_BussinessSys_Suc;
+	unsigned int i_upload_BussinessUser_Suc = t_upload_BussinessUser_Suc;
+	unsigned int i_upload_beidou_Suc = t_upload_beidou_Suc;
+	unsigned int i_upload_TerminalSys_Err = t_upload_TerminalSys_Err;
+	unsigned int i_upload_TerminalUser_Err = t_upload_TerminalUser_Err;
+	unsigned int i_upload_BussinessSys_Err = t_upload_BussinessSys_Err;
+	unsigned int i_upload_BussinessUser_Err = t_upload_BussinessUser_Err;
+	unsigned int i_upload_beidou_Err = t_upload_beidou_Err;
+	unsigned int i_discard_full = t_discard_full;
+	unsigned int i_discard_RTI1002 = t_discard_RTI1002;
+	unsigned int i_curLogNum = curLogNum;
+
+
+
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalSys_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalUser_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessSys_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessUser_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_beidou_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalSys_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalUser_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessSys_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessUser_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_beidou_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_discard_full, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_discard_RTI1002, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_curLogNum, 0);
+	
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
+		, t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
+		t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err
+		, t_discard_full, t_discard_RTI1002, curLogNum);
+
+	return ans_pkt;
+}

+ 1 - 0
Framework/spshell/svc.h

@@ -89,6 +89,7 @@ iobuffer_t* on_try_update_cfg(sp_rpc_server_t * server, int epid, int svc_id, in
 iobuffer_t* on_write_terminalNo(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
 iobuffer_t* on_modify_mem_cfg(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
 iobuffer_t* on_try_update_VTMERRMSG(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
+iobuffer_t* on_try_upload_logs_info(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
 
 int  stop_all_stated_entity(void* param);
 int KickoffSpRestart(bool bRestart);

+ 100 - 75
Module/mod_chromium/CModTools.cpp

@@ -88,10 +88,10 @@ namespace Chromium {
 		ErrorCodeEnum Error = m_pEntity->GetFunction()->OpenConfig(Config_Root, spConfig);
 		if (Error == Error_Succeed)
 		{
-			Error = spConfig->ReadConfigValue("Terminal", "MachineType", m_strMachineType);
+			Error = spConfig->ReadConfigValue("Terminal", "MachineType", ConfigManager::getInstance().m_strMachineType);
 			if (Error == Error_Succeed)
 			{
-				Error = spConfig->ReadConfigValue("Terminal", "Site", m_strSite);
+				Error = spConfig->ReadConfigValue("Terminal", "Site", ConfigManager::getInstance().m_strSite);
 				if (Error != Error_Succeed)
 				{
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get Site value failed");
@@ -104,14 +104,14 @@ namespace Chromium {
 		}
 
 		auto configRet = ReadCenterConfigStr();
-		m_UserMgrUrlStr = std::get<0>(configRet);
-		m_UserMgrUrlNoSidebarStr = std::get<1>(configRet);
-		m_UserMgrUrlNoSidebarMutiStr = std::get<2>(configRet);
-		m_UserMgrUrlFultureStr = std::get<3>(configRet);
-		m_UserMgrAdStr = std::get<4>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlStr = std::get<0>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr = std::get<1>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlNoSidebarMutiStr = std::get<2>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlFultureStr = std::get<3>(configRet);
+		ConfigManager::getInstance().m_UserMgrAdStr = std::get<4>(configRet);
 		notifyExist = breakdownExist = m_isAdOpen = false;
 		m_magicStr = uuid4_generate(8);
-		m_withMin = false;
+		ConfigManager::getInstance().m_withMin = false;
 
 #if defined(RVC_OS_LINUX)
         InitBrowserUseMode();
@@ -180,8 +180,9 @@ namespace Chromium {
 
 	std::pair<bool, std::string> CModTools::getAdUrl()
 	{
-		auto AdUrl = m_UserMgrAdStr;
-		auto strUrl = detectUrls(AdUrl.GetData());
+		auto AdUrl = ConfigManager::getInstance().m_UserMgrAdStr;
+		std::string strUrl = AdUrl.GetData();
+		//auto strUrl = detectUrls(AdUrl.GetData());
 		return strUrl.length() > 0 ? std::make_pair(true, strUrl) : std::make_pair(false, strUrl);
 	}
 
@@ -237,7 +238,7 @@ namespace Chromium {
 		case ERR_PAGE_REASON::audioErr:
 		{
 			errPageParams.Append(CSimpleStringA("showlimit=1"));
-			if (m_withMin) {
+			if (ConfigManager::getInstance().m_withMin) {
 				errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&showmin=1"));
 			}
 		}
@@ -259,16 +260,17 @@ namespace Chromium {
 		errPageUrl.Append(" ");
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(errType._to_string());
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(errType._to_string());
 		errPageUrl.Append(" --cache-path=").Append(cachePath);
-        if (g_useMagic)
+        if (ConfigManager::getInstance().isUseMagic())
 			errPageUrl.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			errPageUrl.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			errPageUrl.Append(" --with-console");
-		if(g_sogouForce != 0)
-			errPageUrl.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
+		if(ConfigManager::getInstance().getSogouForce() != 0)
+			errPageUrl.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
 		errPageUrl.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver").Append(" --always-on-top");
 
         switch (errType) {
@@ -435,8 +437,8 @@ namespace Chromium {
 		CSimpleStringA strUrl;
 		bool isOpenExtend = false;
 
-		auto mainUrl = m_UserMgrUrlFultureStr;
-		strUrl = detectUrls(mainUrl.GetData()).c_str();
+		auto mainUrl = ConfigManager::getInstance().m_UserMgrUrlFultureStr;
+		//strUrl = detectUrls(mainUrl.GetData()).c_str();
 		strUrl = mainUrl;
 		isOpenExtend = false;
 
@@ -447,10 +449,10 @@ namespace Chromium {
 	{
 		CSimpleStringA strUrl;
 
-		if (m_UserMgrUrlNoSidebarStr.Compare(""))
+		if (ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr.Compare(""))
 		{
-			auto mainUrl = m_UserMgrUrlNoSidebarStr;
-			auto exUrl = m_UserMgrUrlNoSidebarMutiStr;
+			auto mainUrl = ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr;
+			auto exUrl = ConfigManager::getInstance().m_UserMgrUrlNoSidebarMutiStr;
 			auto t_Arr = exUrl.Split('|');
 			std::vector<std::string> urlArr;
 			urlArr.emplace_back(mainUrl.GetData());
@@ -464,7 +466,7 @@ namespace Chromium {
 				strUrl = mainUrl;
 		}
 		else
-			strUrl = m_UserMgrUrlStr;
+			strUrl = ConfigManager::getInstance().m_UserMgrUrlStr;
 
 		return std::make_pair(strUrl.GetLength() > 0, strUrl.GetData());
 	}
@@ -472,24 +474,24 @@ namespace Chromium {
 
 
 	std::string CModTools::generateAdCmd(std::string AdUrl) {
-		
 #if defined(RVC_OS_LINUX)
-		return generateBrowserCMDForEverything(AdUrl, 1, g_unsafeAd);
+		return generateBrowserCMDForEverything(AdUrl, 1, ConfigManager::getInstance().m_withUnsafeAd);
 #else
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(AdUrl.c_str());
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
         strCmdLine.Append(" --cache-path=").Append(cachePath);
-        if (g_useMagic)
+        if (ConfigManager::getInstance().isUseMagic())
             strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			strCmdLine.Append(" --with-console");
-		if (g_sogouForce != 0)
-			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
+		if (ConfigManager::getInstance().getSogouForce() != 0)
+			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
         strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver");
         strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Ad)._to_string());
         strCmdLine.Append(" --top=-1");
@@ -510,20 +512,21 @@ namespace Chromium {
         }
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "")
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "")
             .Append(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
         //strCmdLine.Append(" --hide-controls=true")
         strCmdLine.Append(" --cache-path=").Append(cachePath);
         strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver --hide-tabs");
-		if (g_useMagic)
+		if (ConfigManager::getInstance().isUseMagic())
             strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			strCmdLine.Append(" --with-console");
-		if (g_sogouForce != 0)
-			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
-        if (m_withDebugMode)
+		if (ConfigManager::getInstance().getSogouForce() != 0)
+			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
+        if (ConfigManager::getInstance().m_withDebugMode)
             strCmdLine.Append(" --remote-debugging-port=9222");
         if (isExtend) {
             strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::extend)._to_string());
@@ -553,7 +556,9 @@ namespace Chromium {
 		strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
+			Append((+ERR_PAGE_REASON::Ad)._to_string());
 		strCmdLine.Append(" --cache-path=").Append(cachePath);
 		strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver --hide-tabs");
 		strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
@@ -623,7 +628,7 @@ namespace Chromium {
 			cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowser_").Append(name.c_str());
 			strParams.Append(" --disk-cache-dir=").Append(cachePath);
 			strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 
 			CSimpleStringA usrDataPath(tempPath);
@@ -646,7 +651,7 @@ namespace Chromium {
 			cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("Browser_").Append(name.c_str());
 			strParams.Append(" --disk-cache-dir=").Append(cachePath);
 			strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 
 			CSimpleStringA usrDataPath(tempPath);
@@ -668,7 +673,8 @@ namespace Chromium {
 		}
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(name.c_str());
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(name.c_str());
 		strCmdLine.Append(" --cache-path=").Append(cachePath);
 		strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver --hide-tabs");
 		strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
@@ -687,18 +693,20 @@ namespace Chromium {
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(m_specialPage_temp_name.c_str());
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
+			Append(m_specialPage_temp_name.c_str());
         //strCmdLine.Append(" --hide-controls=true")
         strCmdLine.Append(" --cache-path=").Append(cachePath);
         strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver  --hide-tabs");;//don't use single-process, it will affect the cef log
-        if (g_useMagic)
+        if (ConfigManager::getInstance().isUseMagic())
             strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			strCmdLine.Append(" --with-console");
-		if (g_sogouForce != 0)
-			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
+		if (ConfigManager::getInstance().getSogouForce() != 0)
+			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
         strCmdLine.Append(" --logextend=").Append(m_specialPage_temp_name.c_str());
         if (m_specialPage_temp_size.length() > 0)
             strCmdLine.Append(" --center-size=").Append(m_specialPage_temp_size.c_str());
@@ -771,7 +779,7 @@ namespace Chromium {
             }
             strParams.Append(" --disk-cache-dir=").Append(cachePath);
             strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 			{
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 			}
@@ -831,7 +839,7 @@ namespace Chromium {
             }
             strParams.Append(" --disk-cache-dir=").Append(cachePath);
             strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 			{
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 			}
@@ -911,7 +919,7 @@ namespace Chromium {
 
 			if (0 == mainUrlRet.second.length())
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StartChromiumBrowser get %s url failed!", reason._to_string());
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "none", Error_Unexpect, "StartChromiumBrowser get url failed!");
 				LogWarn(Severity_High, Error_Unexpect, LOG_EVT_CHROMIUM_DETECT_MAIN_URL_EMPTY,
 						CSimpleStringA::Format("StartChromiumBrowser get %s url failed!", reason._to_string()));
 				return std::make_pair(Error_Unexpect, 0);
@@ -923,21 +931,27 @@ namespace Chromium {
 			if (Error_Succeed == openCefRet.first) {
                 LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_OPEN_MAIN_URL,
                         CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()));
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()).GetData());
+				/*
 #ifndef DEVOPS_ON_PRD
                 LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_MAIN_URL, CSimpleStringA::Format("当前打开的业务链接:%s", mainUrlRet.second.c_str()));
 #endif
+*/
                 return std::make_pair(Error_Succeed, openCefRet.second);
 			}
 		}
 		else if (reason._to_integral() == ERR_PAGE_REASON::extend)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do not support freerdp");
+			LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "open", Error_Unexpect, "do not support freerdp");
 		}
 		else if (reason._to_integral() == ERR_PAGE_REASON::Ad)
 		{
 			auto AdRet = openAdPage();
-			if (!AdRet.first) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", AdRet.second.c_str());
+			if(AdRet.first)
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 0, "open");
+			else
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "none", Error_Unexpect, AdRet.second);
 			return std::make_pair(AdRet.first ? Error_Succeed : Error_Unexpect, 0);
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::OutsideRequest) {
@@ -948,19 +962,27 @@ namespace Chromium {
 			auto strCmdLine = generateBrowserCMDForEverything(std::get<0>(normalParam), 3, false);
 #endif //RVC_OS_WIN
 	        auto openCefRet = openCef(strCmdLine, false);
-	        if (Error_Succeed == openCefRet.first)
-	            return std::make_pair(Error_Succeed, openCefRet.second);
-		 	else 
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
+				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
+			else
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
+			}
 	    }
 		 else if (reason._to_integral() == ERR_PAGE_REASON::SpecialPageFromOtherEntity)
 		{
 			auto strCmdLine = generateSpecialPageFromOtherEntityCmd(std::get<0>(normalParam));
 			auto openCefRet = openCef(strCmdLine, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::startup)
 		{
@@ -970,25 +992,27 @@ namespace Chromium {
 #else
 			auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::startup)._to_string(), 900, 650, -1, -1, (int)HWND_NOTOPMOST);
 #endif
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startup page %s", strCmdline.c_str());
 			auto openCefRet = openCef(strCmdline, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef %s for %s failed: %d", (+ERR_PAGE_REASON::startup)._to_string(),
-					reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::performance_monitor)
 		{
 			auto url = std::string(R"(file:///)") + getErrUrl(reason).second;
 			auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::performance_monitor)._to_string(), 900, 600, -1, -1, (int)HWND_NOTOPMOST);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startup page %s", strCmdline.c_str());
 			auto openCefRet = openCef(strCmdline, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef %s for %s failed: %d", (+ERR_PAGE_REASON::performance_monitor)._to_string(),
-					reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::Install)
 		{
@@ -1026,9 +1050,12 @@ namespace Chromium {
 			auto strCmdLine = generateInstallCmd(dstInstallUrl);
 			auto openCefRet = openCef(strCmdLine, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		else
 		{
@@ -1045,7 +1072,7 @@ namespace Chromium {
 			auto errPageUrl = GenerateErrPage(reason, normalParam, exParam);
 			if (!errPageUrl.first)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("errPage get url failed!");
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 2, 0, "none", Error_Unexpect, "errPage get url failed!");
 				return std::make_pair(Error_Unexpect, 0);
 			}
 			auto errPageRet = openCef(errPageUrl.second);
@@ -1057,8 +1084,10 @@ namespace Chromium {
 					|| reason._to_integral() == ERR_PAGE_REASON::warnPrompt
 					|| reason._to_integral() == ERR_PAGE_REASON::audioErr)
 					breakdownExist = true;
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), errPageRet.second, 0, "open");
 			}
-
+			else
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), errPageRet.second, 0, "none", errPageRet.first, "");
 
 			return std::make_pair(errPageRet.first, 0);
 
@@ -1171,8 +1200,8 @@ namespace Chromium {
 
 	bool CModTools::isOutsidePad() {
 
-		if ((m_strSite.IsEndWith("FLB", true) || m_strSite.IsEndWith("SMM", true)) &&
-			m_strMachineType.IsEndWith("PAD", true))
+		if ((ConfigManager::getInstance().m_strSite.IsEndWith("FLB", true) || ConfigManager::getInstance().m_strSite.IsEndWith("SMM", true)) &&
+			ConfigManager::getInstance().m_strMachineType.IsEndWith("PAD", true))
 		{
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("isOutsidePad Yes");
 			return true;
@@ -1443,15 +1472,11 @@ namespace Chromium {
 
 		SpIniMappingTable table;
 		// clean cache every time
-		table.AddEntryString(entityName, "UserMgrUrl", str, "");
-		table.AddEntryString(entityName, "UserMgrUrlNoSidebar", strNew, "");
-		table.AddEntryString(entityName, "UserMgrUrlNoSidebarMuti", strEx, "");
 		table.AddEntryString(entityName, "UserMgrUrlFulture", strFulture, "");
 		table.AddEntryString(entityName, "UserMgrAd", strAd, "");
 		table.AddEntryString(entityName, "CacheHead", strCacheHead, "");
 		if (Error_Succeed == table.Load(spCerConfig))
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleString::Format("read centersetting config : UserMgrUrl-%s, UserMgrUrlNoSidebar-%s, UserMgrUrlNoSidebarMuti-%s, UserMgrUrlFulture-%s, UserMgrAd-%s",
-				str.GetData(), strNew.GetData(), strEx.GetData(), strFulture.GetData(), strAd.GetData()));
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleString::Format("read centersetting config : UserMgrUrlFulture-%s, UserMgrAd-%s", strFulture.GetData(), strAd.GetData()));
 
 		CChromiumEntity* pChromiumEntity = reinterpret_cast<CChromiumEntity*>(m_pEntity);
 		if (pChromiumEntity != nullptr && pChromiumEntity->HasCustomMainUrl()) {
@@ -1460,7 +1485,7 @@ namespace Chromium {
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_USE_CUSTOM_FULTURE_URL, strTmp);
 		}
 
-		m_strCacheHead = strCacheHead.GetData();
+		ConfigManager::getInstance().m_strCacheHead = strCacheHead.GetData();
 
 		return std::make_tuple(str, strNew, strEx, strFulture, strAd);
 	}

+ 4 - 9
Module/mod_chromium/CModTools.h

@@ -49,17 +49,14 @@ namespace Chromium {
 		void killAllChromiumByThread(int seconds);
 		bool killChromiumByName(std::string name);
 		bool RestartProxyServer();
-		void setWithMin(bool t_withMin) { m_withMin = t_withMin; };
-		void setWithClose(bool t_withClose) { m_withClose = t_withClose; };
-		void setWithDebugMode(bool t_withDebugMode) { m_withDebugMode = t_withDebugMode; };
 		std::string getMagicStr() { return m_magicStr; };
 		int getUosBrowser() { return m_UseUOSBrowser; };
 		bool IsConfigWork()
 		{
-			return m_UserMgrUrlFultureStr.GetLength() > 0;
+			return ConfigManager::getInstance().m_UserMgrUrlFultureStr.GetLength() > 0;
 		}
 		CSimpleString getFultureUrl() {
-			return m_UserMgrUrlFultureStr; 
+			return ConfigManager::getInstance().m_UserMgrUrlFultureStr;
 		}
 		void lockGuard();
 		void unlockGuard();
@@ -130,9 +127,7 @@ namespace Chromium {
 	public:
 		bool notifyExist, breakdownExist, m_isAdOpen;	//if notify exist, do not start other err page
 	private:
-		CSimpleString m_strSite, m_strMachineType;
-		CSimpleString m_UserMgrUrlStr, m_UserMgrUrlNoSidebarStr, m_UserMgrUrlNoSidebarMutiStr, m_UserMgrUrlFultureStr, m_UserMgrAdStr;
-		bool m_withMin, m_withClose, m_withDebugMode;
+
 		std::string m_magicStr;
 		/** 0:使用CefClient,1:使用旧版UOS浏览器uos-browser-stable ;2:使用新版UOS浏览器org.deepin.browser  [Gifur@2022228]*/
 		int m_UseUOSBrowser;
@@ -141,7 +136,7 @@ namespace Chromium {
 		//for special page
 		std::string m_specialPage_temp_name, m_specialPage_temp_size, m_specialPage_temp_point;
 		int m_specialPage_temp_top;
-		std::string m_strCacheHead;
+		
 	};
 
 	template<class T>

+ 93 - 34
Module/mod_chromium/CWSCodec.cpp

@@ -399,7 +399,7 @@ namespace Chromium {
 		cJSON_AddStringToObject(ret, PARAMLIST_HEAD, dstPayLoad.c_str());
 	}
 
-	void CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret) {
+	std::pair<bool, std::string>  CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret) {
 		entity_def_struct* p_struct = &it->second;
 		CMedthodInterface* mi = mInterpreter->getFunctionInterface(p_struct->entity_name, p_struct->class_name, p_struct->methodID);
 		CTransStruct ts = mi->mResponseInterpreter;
@@ -407,6 +407,7 @@ namespace Chromium {
 		try
 		{
 			DeserializeBase(msg, ts, rpos, ret, !mi->m_forceNewReturn);
+			return std::make_pair(true, mi->mMethodName);
 		}
 		catch (...)
 		{
@@ -424,8 +425,9 @@ namespace Chromium {
 #else
 			throw std::exception(std::logic_error("error DeserializeRequestAck"));
 #endif
-
+			return std::make_pair(false, mi->mMethodName);
 		}
+		
 	}
 
 	void CWSCodec::DeserializeEvent(CMessage & msg,
@@ -467,7 +469,7 @@ namespace Chromium {
 	}
 
 
-	std::string CWSCodec::BufferToJson(CMessage & msg, boost::function<void(int, int)> dealErrcodeFun, int replaceTransId) {
+	std::string CWSCodec::BufferToJson(CMessage & msg, boost::function<void(int, int)> dealErrcodeFun, socket_msgInfo& msgInfo, int replaceTransId) {
 		//replaceTransId==0,MessageType为8(Event),其他都应该有值
 		int rpos = 16;
 		cJSON* ret = cJSON_CreateObject();
@@ -483,6 +485,9 @@ namespace Chromium {
 		int srcTransId = msg.getTransID();
 		// 通用反序列化
 		cJSON_AddNumberToObject(ret, "messageType", msg.getMessageType());
+		msgInfo.messageType = msg.getMessageType();
+		msgInfo.inner_transID = srcTransId;
+		msgInfo.msgBytes = msg.printfHEX();
 		switch (msg.getMessageType()) {
 		case MessageType::RequestAck: //PKT_TYPE_REQACK
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
@@ -507,7 +512,15 @@ namespace Chromium {
 				}
 					
 				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
+
+				msgInfo.userCodeVal = userCodeInfo.first;
+				msgInfo.userCode = userCodeInfo.second.userCode;
+				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
+				msgInfo.warnMsg = userCodeInfo.second.errMsg;
 			}
+			
+			msgInfo.web_transID = replaceTransId;
+			msgInfo.sessionId = msg.getSessionID();
 			break;
 		case MessageType::SessionAck:
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
@@ -524,7 +537,14 @@ namespace Chromium {
 				}
 
 				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
+				msgInfo.userCodeVal = userCodeInfo.first;
+				msgInfo.userCode = userCodeInfo.second.userCode;
+				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
+				msgInfo.warnMsg = userCodeInfo.second.errMsg;
 			}
+			msgInfo.inner_transID = srcTransId;
+			msgInfo.web_transID = replaceTransId;
+			msgInfo.sessionId = msg.getSessionID();
 			break;
 		case MessageType::Event:
 			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
@@ -612,9 +632,12 @@ namespace Chromium {
 				free(str);
 				return s;
 			}
-			DeserializeRequestAck(msg, it, rpos, ret);
+			auto deserializeRet = DeserializeRequestAck(msg, it, rpos, ret);
+			msgInfo.entityName = it->second.entity_name;
+			msgInfo.className = it->second.class_name;
+			msgInfo.functionName = deserializeRet.second;			
 			
-			m_AckCallbackList.erase(it);
+			m_AckCallbackList.erase(it);//remove callback
 		}
 		else if (MessageType::Event == msg.getMessageType())
 		{
@@ -638,11 +661,12 @@ namespace Chromium {
 		cJSON_Delete(ret);
 		std::string s(str);
 		free(str);
+		msgInfo.payLoad = str;
 		//delete []str;
 		return s;
 	}
 
-	std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson) {
+	std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson, ws_msgInfo &msgInfo) {
 		//int pos = strJson.find('}'); //try to test json with linkInfo
 		//strJson = strJson.substr(0, pos) + ",\"BussinessId\":\"DoInit\",\"TraceId\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"SpanId\":\"AAAAAAAAAAAAAAAA\",\"ParentSpanId\":\"AAAAAAAAAAAAAAAA\",\"Timestamp\":\"\",\"ReservedControl\":0}";
 		cJSON* pJson = cJSON_Parse(strJson.c_str());
@@ -653,6 +677,7 @@ namespace Chromium {
 
 		// 查找序列化结构 有用户定义数据部分的只有 Info 和 Request
 		CMedthodInterface* mi = NULL;
+		msgInfo.messageType = messageType;
 		if (MessageType::Request == messageType || MessageType::Info == messageType)
 		{
 			entity_def_struct st = { 0 };
@@ -665,8 +690,13 @@ namespace Chromium {
 				return std::make_pair(messageType, nullptr);
 			}
 			else
+			{
+				msgInfo.entityName = st.entity_name;
+				msgInfo.className = st.class_name;
+				msgInfo.functionName = mi->mMethodName;
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("JsonToBuffer parse method success, entityName:%s, className:%s, methodID:%d, DstMethodName:%s, DstMethodParamNum:%d",
 					st.entity_name, st.class_name, st.methodID, mi->mMethodName.c_str(), mi->mRequestInterpreter.mParamList.size());	//如出错,可对比方法名和变量数量
+			}
 			if (MessageType::Request == messageType) {
 				// 维护回调列表 Request
 				auto transid = json_deal::getIntergerFromCjsonObj(pJson, "transId");
@@ -675,6 +705,7 @@ namespace Chromium {
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWSCodec::JsonToBuffer get transId failed");
 					return std::make_pair(messageType, nullptr);
 				}
+
 				m_ackMutex.lock();
 				m_AckCallbackList.insert(std::pair<int, entity_def_struct>(transid.second, st));
 				m_ackMutex.unlock();
@@ -702,7 +733,11 @@ namespace Chromium {
 			{
 				auto rc = SpSendBroadcast(m_pFunc, eMsg_ChromiumBroadcast, eMsgSig_ChromiumBroadcast, e);
 				if (Error_Succeed != rc)
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Broadcast Msg Error:%d", rc);
+				{
+					LogManager::getInstance().logWebSocketBroadcast(msgInfo.hdlId, "", 2, "none", msgInfo.payLoad, rc, "Broadcast Msg Error");
+				}					
+				else
+					LogManager::getInstance().logWebSocketBroadcast(msgInfo.hdlId, "", 0, "send", msgInfo.payLoad);
 			}
 			else
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("json is too long, do not send out sp broadcast!");
@@ -750,41 +785,41 @@ namespace Chromium {
 		switch (messageType) {
 			//info和request由于有其他信息,需要在数据中获得context
 		case MessageType::Info:
-			SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			break;
 		case MessageType::Request:
-			SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			break;
 		case MessageType::BeginSession:
-			SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::EndSession:
-			SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::Register:
-			SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::Unregister:
-			SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::LogEventMsgType:
-			SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::LogWarnMsgType:
-			SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::SetVarReq:
-			SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::GetVarReq:
-			SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		default:
@@ -815,7 +850,7 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string too long, discard");
 			return std::make_pair(messageType, nullptr);
 		}
-
+		msgInfo.transId = m_SerializeCache.getTransID();
 		return std::make_pair(messageType, &m_SerializeCache);
 	}
 
@@ -868,7 +903,7 @@ namespace Chromium {
 	}
 
 
-	void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 
 		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
 		if (sessionID.first == false)
@@ -921,13 +956,19 @@ namespace Chromium {
 				{
 #endif
 					if (paramInfo.mName == repeatName)
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("request参数名字重复, MethodName:%s, repeatParam:%s", pI->mMethodName.c_str(), paramInfo.mName.c_str());
+					{
+						CSimpleStringA warnStr = CSimpleString::Format("request参数名字重复, MethodName:%s, repeatParam:%s"
+							, pI->mMethodName.c_str(), paramInfo.mName.c_str());
+						msgInfo.warnMsg = warnStr;
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(warnStr.GetData());
+					}
 				}
 			}
 			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
 
 			paramJs = js;
 		}
+		msgInfo.functionName = pI->mMethodName;
 		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
 
 		return;
@@ -961,21 +1002,23 @@ namespace Chromium {
 
 	}
 
-	void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		int i4 = 0;
 		GetCJsonIntergerValue(js, "transID", i4, errmsg);
 		WriteT(data, i4, wpos, capacity);
 		CSimpleStringA s = "";
 		GetCJsonObjectValue(js, "entity", s, errmsg);
 		WriteT(data, s, wpos, capacity);
+		msgInfo.entityName = s;
 		GetCJsonObjectValue(js, "method", s, errmsg);
 		WriteT(data, s, wpos, capacity);
+		msgInfo.functionName = s;
 		GetCJsonObjectValue(js, "class", s, errmsg);
 		WriteT(data, s, wpos, capacity);
-
+		msgInfo.className = s;
 	}
 
-	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) 
+	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo)
 	{
 		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
 		if (sessionID.first == false)
@@ -986,7 +1029,7 @@ namespace Chromium {
 		WriteT(data, sessionID.second, wpos, capacity);
 	}
 
-	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) 
+	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo)
 	{
 
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
@@ -1026,6 +1069,8 @@ namespace Chromium {
 		WriteT(data, signature.second, wpos, capacity);
 		WriteT(data, timeout.second, wpos, capacity);
 		SerializeLinkInfo(js, data, wpos, capacity, errmsg);
+		msgInfo.transId = transID.second;
+		msgInfo.timeout = timeout.second;
 
 		if (NULL == pI)
 		{
@@ -1052,16 +1097,21 @@ namespace Chromium {
 				{
 #endif
 					if (paramInfo.mName == repeatName)
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("request参数名字重复, MethodName:%s, repeatParam:%s", pI->mMethodName.c_str(), paramInfo.mName.c_str());
+					{
+						CSimpleStringA warnStr = CSimpleString::Format("request参数名字重复, MethodName:%s, repeatParam:%s", pI->mMethodName.c_str(), paramInfo.mName.c_str());
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(warnStr.GetData());
+						msgInfo.warnMsg = warnStr;
+					}
+						
 				}
 			}
 			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
 			paramJs = js;
-				}
+		}
 		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
-			}
+	}
 
-	void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
@@ -1075,14 +1125,14 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWSCodec::SerializeRegister get entity failed");
 			return;
 		}
-
+		msgInfo.entityName = entity.second;
 		WriteT(data, transID.second, wpos, capacity);
 		WriteT(data, entity.second, wpos, capacity);
 		CSimpleStringA tmp = "";
 		WriteT(data, tmp, wpos, capacity);//订阅实体全局,不限定方法
 	}
 
-	void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
 		{
@@ -1093,7 +1143,7 @@ namespace Chromium {
 		WriteT(data, transID.second, wpos, capacity);
 	}
 
-	void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 
 		auto securityLevel = json_deal::getIntergerFromCjsonObj(js, "securityLevel");
 		if (securityLevel.first == false)
@@ -1117,6 +1167,9 @@ namespace Chromium {
 		WriteT(data, securityLevel.second, wpos, capacity);
 		WriteT(data, eventCode.second, wpos, capacity);
 		WriteT(data, message.second, wpos, capacity);
+		msgInfo.securityLevel = securityLevel.second;
+		msgInfo.eventCode = eventCode.second;
+		msgInfo.message = message.second;
 	}
 
 	inline CSimpleStringA DWORD2Hex(DWORD cur)
@@ -1124,7 +1177,7 @@ namespace Chromium {
 		return CSimpleStringA::Format("%X", cur);
 	}
 
-	void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		auto securityLevel = json_deal::getIntergerFromCjsonObj(js, "securityLevel");
 		if (securityLevel.first == false)
 		{
@@ -1147,13 +1200,16 @@ namespace Chromium {
 		WriteT(data, securityLevel.second, wpos, capacity);
 		WriteT(data, eventCode.second, wpos, capacity);
 		WriteT(data, message.second, wpos, capacity);
+		msgInfo.securityLevel = securityLevel.second;
+		msgInfo.eventCode = eventCode.second;
+		msgInfo.message = message.second;
 
 		DbgWithLink(securityLevel.second == SeverityLevelEnum::Severity_Low ? LOG_LEVEL_INFO : LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
 			.setResultCode(DWORD2Hex(eventCode.second).GetData())
 			("receive warn from web, Warn: {%s}(sc=0x%X, uc=0x%X)", message.second.GetData(), 0, eventCode.second);
 	}
 
-	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo)
 	{
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
@@ -1177,6 +1233,8 @@ namespace Chromium {
 		WriteT(data, transID.second, wpos, capacity);
 		WriteT(data, name.second, wpos, capacity);
 		WriteT(data, value.second, wpos, capacity);
+		msgInfo.name = name.second;
+		msgInfo.value = value.second;
 	}
 
 	using namespace std;
@@ -1218,7 +1276,7 @@ namespace Chromium {
 		return result;
 	}
 
-	void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		auto  transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
 		{
@@ -1234,6 +1292,7 @@ namespace Chromium {
 
 		WriteT(data, transID.second, wpos, capacity);
 		WriteT(data, name.second, wpos, capacity);
+		msgInfo.name = name.second;
 	}
 
 

+ 64 - 13
Module/mod_chromium/CWSCodec.h

@@ -14,7 +14,58 @@
 #include <boost/thread/mutex.hpp>
 
 
+class ws_msgInfo {
+public:
+	std::string payLoad;
+	int transId;
+	int messageType;
+	unsigned int hdlId;
 
+	std::string entityName;
+	std::string className;
+	std::string functionName;
+
+	std::string warnMsg;
+
+	int timeout;
+	std::string name;
+	std::string value;
+
+	int securityLevel;
+	int eventCode;
+	std::string message;
+
+	ws_msgInfo(std::string t_payLoad, int t_transId, int t_messageType)
+		: payLoad(t_payLoad), transId(t_transId), messageType(t_messageType) {};
+};
+
+class socket_msgInfo {
+public:
+	int web_transID;
+	int inner_transID;
+	int sessionId;
+	int messageType;
+	unsigned int hdlId;
+
+	std::string entityName;
+	std::string className;
+	std::string functionName;
+
+	long userCodeVal;
+	std::string userCode;
+	std::string rtaCode;
+	std::string warnMsg;
+
+	int timeout;
+	std::string name;
+	std::string value;
+
+	std::string payLoad;
+	std::string msgBytes;
+
+	socket_msgInfo(int t_web_transID, int t_inner_transID, int t_sessionId)
+		: web_transID(t_web_transID), inner_transID(t_inner_transID), sessionId(t_sessionId) {};
+};
 
 
 namespace Chromium {
@@ -33,15 +84,15 @@ namespace Chromium {
 		void init(const char* xmlPath);
 		void setEntityHandler(CSmartPointer<IEntityFunction> p);
 
-		std::pair<int, CMessage*> JsonToBuffer(std::string strJson);
-		std::string BufferToJson(CMessage& msg, boost::function<void(int,int)> dealErrcodeFun, int replaceTransId = 0);
+		std::pair<int, CMessage*> JsonToBuffer(std::string strJson, ws_msgInfo& msgInf);
+		std::string BufferToJson(CMessage& msg, boost::function<void(int,int)> dealErrcodeFun, socket_msgInfo &msgInfo, int replaceTransId = 0);
 
 		std::string GetEntityName(std::string strJson);
 		std::string GetClassName(std::string strJson);
 
 		bool checkEntityHasService(std::string entityName);
 	private:
-		void DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret);
+		std::pair<bool, std::string> DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret);
 		void DeserializeEvent(CMessage& msg, std::vector<CMedthodInterface>* list, int& rpos, cJSON* ret);
 		void DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret, bool writeToOldParam);	//解析json->buffer
 
@@ -49,17 +100,17 @@ namespace Chromium {
 
 		std::pair<bool, std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, int>> GetLinkContex(cJSON* js, char* data, char* errmsg);
 
-		void SerializeInfo(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeBeginSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeEndSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeRequest(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeRegister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeUnregister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
+		void SerializeInfo(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeBeginSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeEndSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeRequest(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeRegister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeUnregister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
 		/*	void SerializeEvent(cJSON* js, char* data, int* wpos, int* capacity, unsigned int* len);*/
-		void SerializeLogEvent(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeLogWarn(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeSetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeGetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
+		void SerializeLogEvent(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeLogWarn(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeSetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeGetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
 		void GeneralSerialize(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
 		void SerializeLinkInfo(cJSON* js, char* data, int* wpos, int* capacity, char* errmsg);
 

+ 188 - 116
Module/mod_chromium/CWebsocketServer.cpp

@@ -69,8 +69,8 @@ namespace Chromium {
 	{
 		//存储的消息应具备时效性,保证一个hdl只有一个记录的消息
 
-		auto it = m_msg_pool.find(entityName);
-		if (it != m_msg_pool.end())
+		auto it = ConfigManager::getInstance().m_msg_pool.find(entityName);
+		if (it != ConfigManager::getInstance().m_msg_pool.end())
 		{
 			auto& curArr = it->second;
 			for (auto i = curArr.begin(); i != curArr.end(); i++)
@@ -88,38 +88,38 @@ namespace Chromium {
 		{
 			std::vector<std::pair<websocketpp::connection_hdl, std::string>> t_saveMsgs;
 			t_saveMsgs.emplace_back(std::make_pair(hdl, payload));
-			m_msg_pool.insert(std::make_pair(entityName, t_saveMsgs));
+			ConfigManager::getInstance().m_msg_pool.insert(std::make_pair(entityName, t_saveMsgs));
 		}
 	}
 
 	void CWebsocketServer::updateNotifyPool(unsigned hdl, unsigned transId)
 	{
-		auto it = m_notifyPool.find(hdl);
-		if (it != m_notifyPool.end())
+		auto it = ConfigManager::getInstance().m_notifyPool.find(hdl);
+		if (it != ConfigManager::getInstance().m_notifyPool.end())
 		{
 			if (transId == 0)
-				m_notifyPool.erase(it);
+				ConfigManager::getInstance().m_notifyPool.erase(it);
 			else
 				it->second = transId;
 		}
 		else if (transId != 0)
-			m_notifyPool.insert(std::make_pair(hdl, transId));
+			ConfigManager::getInstance().m_notifyPool.insert(std::make_pair(hdl, transId));
 
 
 	}
 
 	void CWebsocketServer::storeEntityWithCLass(std::string entityName, std::string entityClass)
 	{
-		if (m_entityAndClass.end() == m_entityAndClass.find(entityName)) {
-			m_entityAndClass.insert(std::make_pair(entityName, entityClass));	//not exist
+		if (ConfigManager::getInstance().m_entityAndClass.end() == ConfigManager::getInstance().m_entityAndClass.find(entityName)) {
+			ConfigManager::getInstance().m_entityAndClass.insert(std::make_pair(entityName, entityClass));	//not exist
 			//DbgEx("storeEntityWithCLass, %s:%s", entityName.c_str(), entityClass.c_str());
 		}
 	}
 
 	std::pair<bool, std::string> CWebsocketServer::getEntityClass(std::string entityName)
 	{
-		auto it = m_entityAndClass.find(entityName);
-		if (m_entityAndClass.end() == it)
+		auto it = ConfigManager::getInstance().m_entityAndClass.find(entityName);
+		if (ConfigManager::getInstance().m_entityAndClass.end() == it)
 			return std::make_pair(false, "");
 		else
 			return std::make_pair(true, it->second);
@@ -128,7 +128,8 @@ namespace Chromium {
 	void CWebsocketServer::do_sendJsonStartSession(std::string entityName, std::string entityClass)
 	{
 		auto startSessionReq = m_esm->GetStartSessionRequest(entityName, entityClass);
-		auto sessionBuf = this->m_serializer->JsonToBuffer(startSessionReq.second).second;
+		ws_msgInfo cur(startSessionReq.second, 0, 0);
+		auto sessionBuf = this->m_serializer->JsonToBuffer(startSessionReq.second, cur).second;
 		if (nullptr == sessionBuf)
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("JsonToBuffer return NULL !");
@@ -140,9 +141,13 @@ namespace Chromium {
 		if (m_esm->checkBeginSession(entityName)) {
 			m_esm->updateBeginSessionTime(entityName);
 			WriteToFramework(sessionBuf);
+			LogManager::getInstance().logWebSocketBeginSession(-1, -1, cur.transId, cur.entityName, cur.className, 0, "auto_send", cur.payLoad);
 		}
 		else
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Already begin session in 5s, %s", entityName.c_str());
+		{
+			LogManager::getInstance().logWebSocketBeginSession(-1, -1, cur.transId, cur.entityName, cur.className, 1, "none", cur.payLoad,
+				Error_Duplication, "already begin session in 5 seconds");
+		}
 	}
 
 	void CWebsocketServer::WriteToFramework(CMessage* msg)
@@ -224,7 +229,7 @@ namespace Chromium {
 				break;
 			}
 			DbgWithLink(changeMessageTypeToLogLevel(messageType), LOG_TYPE_BUSINESS_SYSTEM)
-				.withLogProducer(logProducer).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.second.GetData())();
+				.withLogProducer(ConfigManager::getInstance().getLogProducer()).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.second.GetData())();
 			break;
 		}
 		case METHOD_SYSTEM_DETAIL_LOG_DEBUG:
@@ -263,7 +268,8 @@ namespace Chromium {
 			}
 
 			//create the logProduer if not exist
-			if (g_logProducerArr.find(t_entityName.second.GetData()) == g_logProducerArr.end())//can not find the logProducer
+			auto t_logProducerArr = ConfigManager::getInstance().getLogProducerArr();
+			if (t_logProducerArr.find(t_entityName.second.GetData()) == t_logProducerArr.end())//can not find the logProducer
 			{
 				auto t_CmptId = json_deal::getStringFromCjsonObj(pJson.get(), msg_CmptId);
 				auto t_CmptName = json_deal::getStringFromCjsonObj(pJson.get(), msg_CmptName);
@@ -278,9 +284,9 @@ namespace Chromium {
 				else
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create producer sueccess, entityName:%s, CmptId:%s, t_CmptName:%s"
 						, t_entityName.second.GetData(), t_CmptId.second.GetData(), t_CmptName.second.GetData());
-				g_logProducerArr.insert(std::make_pair(t_entityName.second.GetData(), t_producer));
+				t_logProducerArr.insert(std::make_pair(t_entityName.second.GetData(), t_producer));
 			}
-			auto t_logProducer = g_logProducerArr[t_entityName.second.GetData()];
+			auto t_logProducer = t_logProducerArr[t_entityName.second.GetData()];
 
 
 			auto logType = json_deal::getStringFromCjsonObj(pJson.get(), msg_logType);//it can be equal to Sys/User/VTMWeb
@@ -478,9 +484,9 @@ namespace Chromium {
 
 		std::string js = CSimpleString::Format("{\"messageType\":5,\"errorCode\":\"%d\",\"errorMsg\":\"1537 session break\",\"sessionID\":-1,\"transID\":125}", Error_DevNotAvailable).GetData();
 
-		js = restroreTransId(js);
+		auto dst_js = restroreTransId(js);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_sessionBreakMsg, len:%d, srcPayLoad:%s, ret:%s", payload.length()
-			, payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str(), js.c_str());
+			, payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str(), dst_js.second.c_str());
 		do_send_msg(hdl, js);
 	}
 
@@ -488,8 +494,11 @@ namespace Chromium {
 	void CWebsocketServer::deal_msg(std::string& payload, websocketpp::connection_hdl hdl)
 	{
 		boost::lock_guard<boost::mutex> lock(m_dealMsgLock);	//在buffer和json处理时,deal_msg会调用多次,导致transId存在重复可能
-		auto ret = this->m_serializer->JsonToBuffer(payload);
+		ws_msgInfo cur(payload, 0, 0);
+		cur.hdlId = (long)hdl.lock().get();
+		auto ret = this->m_serializer->JsonToBuffer(payload, cur);
 		CMessage* p = ret.second;
+		
 		if (ret.first == Broadcast && nullptr == p)
 		{
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("JsonToBuffer return NULL, perhaps an event happened");
@@ -509,9 +518,9 @@ namespace Chromium {
 				if (transIdJson.first)
 				{
 					std::string errRetJs = "{\"messageType\":4,\"transID\":" + std::to_string((LONGLONG)transIdJson.second) + ",\"errorCode\":103,\"errorMsg\":\"can not find entity or class!\"}";
-					auto js = restroreTransId(errRetJs);
+					auto dst_js = restroreTransId(errRetJs);
 					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_msg %s get null msg, ret:%s", ret.first == Request ? "Request" : "Info", errRetJs.c_str());
-					do_send_msg(hdl, js);
+					do_send_msg(hdl, dst_js.second);
 				}
 				else
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer::deal_msg get transIdJson failed");
@@ -536,8 +545,8 @@ namespace Chromium {
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("sessionJson:%s", sessionRet.second.c_str());
 				if (sessionRet.first)
 				{
-					auto js = restroreTransId(sessionRet.second);
-					do_send_msg(hdl, js);
+					auto dst_js = restroreTransId(sessionRet.second);
+					do_send_msg(hdl, dst_js.second);
 				}
 			}
 			else
@@ -547,8 +556,10 @@ namespace Chromium {
 		else if (ret.first == BeginSession)
 			storeEntityWithCLass(m_serializer->GetEntityName(payload), m_serializer->GetClassName(payload));
 
+		
+
 		// Try to manage entity session
-		RequestProcessType processType = this->m_esm->RequestProcess(p, m_serializer->GetEntityName(payload), (long)hdl.lock().get());
+		RequestProcessType processType = this->m_esm->RequestProcess(p, m_serializer->GetEntityName(payload), (long)hdl.lock().get(), cur);
 
 		switch (processType)
 		{
@@ -556,7 +567,6 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do PROCESS_NOTHING");
 			return;
 		case Chromium::PROCESS_SEND:
-			//DbgEx("do PROCESS_SEND");
 			if (nullptr != p)
 				WriteToFramework(p);
 			break;
@@ -577,8 +587,8 @@ namespace Chromium {
 		{
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do PROCESS_FINDSESSION");
 			std::string js = m_esm->GetStartSessionAck(p, m_serializer->GetEntityName(payload));
-			js = restroreTransId(js);
-			do_send_msg(hdl, js);
+			auto dst_js = restroreTransId(js);
+			do_send_msg(hdl, dst_js.second);
 		}
 		break;
 		case Chromium::PROCESS_RECORDMSG:
@@ -613,7 +623,7 @@ namespace Chromium {
 			return;
 		}
 
-		switch (m_ws_sm2_hdls_manager[curHdl]->getState())
+		switch (ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->getState())
 		{
 		case SM2ProtocolState::WAIT_KEY_EXCHANGE:
 		{
@@ -623,8 +633,8 @@ namespace Chromium {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("pubKey == null");
 				return;
 			}
-			m_ws_sm2_hdls_manager[curHdl]->setOpposite(pubKey.second.GetData());
-			auto encPub = m_ws_sm2_hdls_manager[curHdl]->GenerateEncPubKey();
+			ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->setOpposite(pubKey.second.GetData());
+			auto encPub = ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->GenerateEncPubKey();
 			if (!encPub.first)
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer -> message_handler_ws_sm2 err:%s", encPub.second.c_str());
@@ -634,7 +644,7 @@ namespace Chromium {
 			std::string js = CSimpleString::Format("{\"encPub\":\"%s\"}", encPub.second.c_str()).GetData();
 			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer -> message_handler_ws_sm2 send js:%s", js.c_str());
 			do_send_msg(hdl, js);
-			m_ws_sm2_hdls_manager[curHdl]->setState(SM2ProtocolState::DATA_EXCHANGE);
+			ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->setState(SM2ProtocolState::DATA_EXCHANGE);
 		}
 		break;
 		case SM2ProtocolState::DATA_EXCHANGE:
@@ -653,7 +663,7 @@ namespace Chromium {
 				return;
 			}
 
-			auto decMsg = m_ws_sm2_hdls_manager[curHdl]->DecryptMsg(sign.second.GetData(), msgData.second.GetData());
+			auto decMsg = ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->DecryptMsg(sign.second.GetData(), msgData.second.GetData());
 			if(decMsg.first == false)
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DecryptMsg err:%s", decMsg.second.c_str());
@@ -730,14 +740,18 @@ namespace Chromium {
 			auto messageType = messageTypeJson.second;
 			if (messageType < WEB_CHROMIUM_MSG_BEGIN)
 			{
+				/*
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
 					payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
+					*/
 				deal_msg(dstPayLoad, hdl);
 			}				
 			else if (messageType > WEB_CHROMIUM_MSG_BEGIN && messageType < WEB_CHROMIUM_MSG_END)
 			{
+				/*
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_webchromium_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
  payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
+ */
 				deal_webchromium_msg(dstPayLoad, hdl, messageType);
 			}				
 			else if (messageType > METHOD_SYSTEM_START && messageType < METHOD_SYSTEM_END)
@@ -749,61 +763,64 @@ namespace Chromium {
 		dealMsgThread.join();
 	}
 
-	std::string CWebsocketServer::restroreTransId(std::string payLoad)
+	std::pair<int, std::string> CWebsocketServer::restroreTransId(std::string payLoad)
 	{
 		std::shared_ptr<cJSON> pJson(cJSON_Parse(payLoad.c_str()), [](cJSON* p) {
 			if (nullptr != p)
 				cJSON_Delete(p);
 			});
 		auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");//不改动,因为需要set
+		int dstTransId = 0;
 		if (transIdJson != nullptr)
 		{
 			int transid = transIdJson->valueint;
-			int dstTransId = transid & 0x00FFFFFF;
+			dstTransId = transid & 0x00FFFFFF;
 			cJSON_SetIntValue(transIdJson, dstTransId);
 		}
 
 		char* unformateStr = cJSON_PrintUnformatted(pJson.get());
 		std::string dstPayLoad = unformateStr;
 		delete[]unformateStr;
-		return dstPayLoad;
+		return std::make_pair(dstTransId, dstPayLoad);
 	}
 
 
 	void CWebsocketServer::open_handler(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		server::connection_ptr con = m_wsserver.get_con_from_hdl(hdl);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws connection to ws server : %u, isSecure:%d, url:%s", hdl.lock().get(), con->get_uri()->get_secure(), con->get_uri()->str().c_str());
-
-		m_connection_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)hdl.lock().get(), hdl));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws connection to ws server : %u, isSecure:%d, url:%s", hdl.lock().get(), con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "unsafe");
+		ConfigManager::getInstance().m_connection_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)hdl.lock().get(), hdl));
 	}
 
 	void CWebsocketServer::open_handler_wss(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		auto con = m_server_wss.get_con_from_hdl(hdl);
 		unsigned int dstHdl = (long)hdl.lock().get();//start from 0, be different from ws
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new wss connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
-
-		m_connection_wss_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)dstHdl, hdl));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new wss connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "wss");
+		ConfigManager::getInstance().m_connection_wss_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)dstHdl, hdl));
 	}
 
 	void CWebsocketServer::open_handler_ws_sm2(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		auto con = m_ws_sm2_server.get_con_from_hdl(hdl);
 		unsigned int dstHdl = (long)hdl.lock().get();//start from 0, be different from ws
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws by encrypt connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
-		m_connection_ws_sm2_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>(dstHdl, hdl));
-		m_ws_sm2_hdls_manager.insert(std::make_pair(dstHdl, new SM2_Encrypt_Manager()));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws by encrypt connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "ws_sm2");
+		ConfigManager::getInstance().m_connection_ws_sm2_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>(dstHdl, hdl));
+		ConfigManager::getInstance().m_ws_sm2_hdls_manager.insert(std::make_pair(dstHdl, new SM2_Encrypt_Manager()));
 	}
 
 	void CWebsocketServer::close_handler(websocketpp::connection_hdl hdl) {
 		// hand shake here
 
-		auto connectionIter = m_connection_hdls.find((long)hdl.lock().get());
-		if (m_connection_hdls.end() != connectionIter)
+		auto connectionIter = ConfigManager::getInstance().m_connection_hdls.find((long)hdl.lock().get());
+		if (ConfigManager::getInstance().m_connection_hdls.end() != connectionIter)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws connection with ws server closed : %u", hdl.lock().get());
-			m_connection_hdls.erase(connectionIter);
+			LogManager::getInstance().logWebSocketClose((uint64_t)hdl.lock().get());
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws connection with ws server closed : %u", hdl.lock().get());
+			ConfigManager::getInstance().m_connection_hdls.erase(connectionIter);
 		}
 		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws connection close erase failed : %u", hdl.lock().get());
@@ -813,11 +830,12 @@ namespace Chromium {
 	void CWebsocketServer::close_handler_wss(websocketpp::connection_hdl hdl) {
 		// hand shake here
 
-		auto connectionIter = m_connection_wss_hdls.find((long)hdl.lock().get());
-		if (m_connection_wss_hdls.end() != connectionIter)
+		auto connectionIter = ConfigManager::getInstance().m_connection_wss_hdls.find((long)hdl.lock().get());
+		if (ConfigManager::getInstance().m_connection_wss_hdls.end() != connectionIter)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss connection with ws server closed : %u", hdl.lock().get());
-			m_connection_wss_hdls.erase(connectionIter);
+			LogManager::getInstance().logWebSocketClose((uint64_t)hdl.lock().get());
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss connection with ws server closed : %u", hdl.lock().get());
+			ConfigManager::getInstance().m_connection_wss_hdls.erase(connectionIter);
 		}
 		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss connection close erase failed : %u", hdl.lock().get());
@@ -827,12 +845,13 @@ namespace Chromium {
 	{
 		// hand shake here
 
-		auto connectionIter = m_connection_ws_sm2_hdls.find((long)hdl.lock().get());
-		if (m_connection_ws_sm2_hdls.end() != connectionIter)
+		auto connectionIter = ConfigManager::getInstance().m_connection_ws_sm2_hdls.find((long)hdl.lock().get());
+		if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.end() != connectionIter)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws sm2 connection with ws server closed : %u", hdl.lock().get());
-			m_connection_ws_sm2_hdls.erase(connectionIter);
-			m_ws_sm2_hdls_manager.erase((long)hdl.lock().get());
+			LogManager::getInstance().logWebSocketClose((uint64_t)hdl.lock().get());
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws sm2 connection with ws server closed : %u", hdl.lock().get());
+			ConfigManager::getInstance().m_connection_ws_sm2_hdls.erase(connectionIter);
+			ConfigManager::getInstance().m_ws_sm2_hdls_manager.erase((long)hdl.lock().get());
 		}
 		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws sm2 connection close erase failed : %u", hdl.lock().get());
@@ -985,9 +1004,9 @@ namespace Chromium {
 
 	void CWebsocketServer::do_sendJsonBroadcast(std::string js)
 	{
-		js = restroreTransId(js);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message broadcast : json = %s", js.c_str());
-		if (js.empty())
+		auto dst_js = restroreTransId(js);
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message broadcast : json = %s", dst_js.second.c_str());
+		if (dst_js.second.empty())
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty");
 			return;
@@ -1003,23 +1022,17 @@ namespace Chromium {
 			return ss.str();
 		};
 
-		if (!sendBroadCast(m_connection_hdls, m_wsserver, js))
+		if (!sendBroadCast(ConfigManager::getInstance().m_connection_hdls, m_wsserver, dst_js.second))
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws server broadcast error");
 		}
 
-		if (!sendBroadCast(m_connection_ws_sm2_hdls, m_ws_sm2_server, js))
+		if (!sendBroadCast(ConfigManager::getInstance().m_connection_ws_sm2_hdls, m_ws_sm2_server, dst_js.second))
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws_sm2 server broadcast error");
 		}
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("do_sendJsonBroadcast: broadcasts have already send to these terminals, no_security:%s, security:%s",
-			formatMapToString(m_connection_hdls).c_str(), formatMapToString(m_connection_ws_sm2_hdls).c_str());
-		/*
-		if (!sendBroadCast(m_connection_wss_hdls, m_server_wss, js))
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss server broadcast error");
-		}
-		*/
+			formatMapToString(ConfigManager::getInstance().m_connection_hdls).c_str(), formatMapToString(ConfigManager::getInstance().m_connection_ws_sm2_hdls).c_str());
 	}
 
 	void CWebsocketServer::do_send_msg(int hdl, std::string msg)
@@ -1027,8 +1040,8 @@ namespace Chromium {
 		//send ws
 				try
 				{
-			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = m_connection_hdls.find(hdl);
-			if (m_connection_hdls.end() != it)
+			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = ConfigManager::getInstance().m_connection_hdls.find(hdl);
+			if (ConfigManager::getInstance().m_connection_hdls.end() != it)
 			{
 				do_send_msg(it->second, msg);
 				return;
@@ -1048,8 +1061,8 @@ namespace Chromium {
 		//send ws sm2
 		try
 		{
-			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = m_connection_ws_sm2_hdls.find(hdl);
-			if (m_connection_ws_sm2_hdls.end() != it)
+			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = ConfigManager::getInstance().m_connection_ws_sm2_hdls.find(hdl);
+			if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.end() != it)
 			{
 				//DbgEx("Send....");
 				do_send_msg(it->second, msg);
@@ -1072,8 +1085,8 @@ namespace Chromium {
 		try
 		{
 			//DbgEx("do_send_notifyMsg Enter...");
-			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = m_connection_hdls.find(hdlID);
-			if (m_connection_hdls.end() != it)
+			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = ConfigManager::getInstance().m_connection_hdls.find(hdlID);
+			if (ConfigManager::getInstance().m_connection_hdls.end() != it)
 			{
 				//DbgEx("Send....");
 				websocketpp::connection_hdl hdl = it->second;
@@ -1101,20 +1114,21 @@ namespace Chromium {
 		unsigned int dstHdl = (long)hdl.lock().get();
 
 		websocketpp::lib::error_code dstExption;
-		if (m_connection_hdls.find(dstHdl) != m_connection_hdls.end())
+		if (ConfigManager::getInstance().m_connection_hdls.find(dstHdl) != ConfigManager::getInstance().m_connection_hdls.end())
 		{
 			m_wsserver.send(hdl, msg, websocketpp::frame::opcode::TEXT, dstExption);
 		}
-		else if (m_connection_ws_sm2_hdls.find(dstHdl) != m_connection_ws_sm2_hdls.end())
+		else if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.find(dstHdl) != ConfigManager::getInstance().m_connection_ws_sm2_hdls.end())
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dstHdl:%d, save:%d", dstHdl, m_connection_ws_sm2_hdls[dstHdl].lock().get());
-			if(m_ws_sm2_hdls_manager[dstHdl]->getState() == SM2ProtocolState::WAIT_KEY_EXCHANGE)
-				m_ws_sm2_server.send(m_connection_ws_sm2_hdls[dstHdl], msg, websocketpp::frame::opcode::TEXT, dstExption);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dstHdl:%d, save:%d", dstHdl,
+				ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl].lock().get());
+			if(ConfigManager::getInstance().m_ws_sm2_hdls_manager[dstHdl]->getState() == SM2ProtocolState::WAIT_KEY_EXCHANGE)
+				m_ws_sm2_server.send(ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl], msg, websocketpp::frame::opcode::TEXT, dstExption);
 			else
 			{
-				auto dst = m_ws_sm2_hdls_manager[dstHdl]->EncryptMsg(msg);
+				auto dst = ConfigManager::getInstance().m_ws_sm2_hdls_manager[dstHdl]->EncryptMsg(msg);
 				std::string js = CSimpleString::Format("{\"sign\":\"%s\",\"msg\":\"%s\"}", dst.first.c_str(), dst.second.c_str()).GetData();
-				m_ws_sm2_server.send(m_connection_ws_sm2_hdls[dstHdl], js, websocketpp::frame::opcode::TEXT, dstExption);
+				m_ws_sm2_server.send(ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl], js, websocketpp::frame::opcode::TEXT, dstExption);
 			}
 		}
 			
@@ -1135,32 +1149,87 @@ namespace Chromium {
 
 
 
-	void CWebsocketServer::do_sendJson(std::string js, int messageType, int hdlID, unsigned int id)
+	void CWebsocketServer::do_sendJson(std::string js, int messageType, int hdlID, unsigned int id, socket_msgInfo& msgInfo)
 	{
-		js = restroreTransId(js);
-		if(g_withLinkLog)
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
-		else if(messageType != MessageType::RequestAck && messageType != MessageType::Event)//do not upload message which messageType equals to RequestAck or Event
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
-		if (js.empty())
+		auto dst_js = restroreTransId(js);
+		js = dst_js.second;
+
+		if (messageType == MessageType::RequestAck)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty");
-			return;
-		}
-		if (m_connection_hdls.empty() && m_connection_ws_sm2_hdls.empty())
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket : no websocket client connection");
-		else {
 #if(defined _WIN32 || defined _WIN64)
 			js = string_to_utf8(js);
 #endif
 			if (js.empty())
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty 2");
+				LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+					msgInfo.entityName, msgInfo.functionName, 2, "none", msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "string empty");
+				return;
+			}
+			if (ConfigManager::getInstance().m_connection_hdls.empty() && ConfigManager::getInstance().m_connection_ws_sm2_hdls.empty())
+				LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+					msgInfo.entityName, msgInfo.functionName, 2, "none", msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "no websocket client connection");
+			else
+			{
+				if(msgInfo.userCodeVal == 0)
+					LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, msgInfo.functionName, 0, "send", msgInfo.payLoad, msgInfo.msgBytes);
+				else
+					LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, msgInfo.functionName, 2, "send", msgInfo.payLoad, msgInfo.msgBytes, msgInfo.userCodeVal, msgInfo.warnMsg);
+				do_send_msg(hdlID, js);
+			}
+		}
+		else if (messageType == MessageType::SessionAck)
+		{
+			if (js.empty())
+			{
+				LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId, msgInfo.entityName, 2, "none",
+					msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "string empty");
+				return;
+			}
+			if (ConfigManager::getInstance().m_connection_hdls.empty() && ConfigManager::getInstance().m_connection_ws_sm2_hdls.empty())
+				LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+					msgInfo.entityName, 2, "none", msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "no websocket client connection");
+			else
+			{
+				if(msgInfo.userCodeVal == 0)
+					LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, 0, "send", msgInfo.payLoad, msgInfo.msgBytes);
+				else
+					LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, 2, "send", msgInfo.payLoad, msgInfo.msgBytes, msgInfo.userCodeVal, msgInfo.warnMsg);
+				
+				do_send_msg(hdlID, js);
+			}
+		}
+		else
+		{
+			if (ConfigManager::getInstance().m_withLinkLog)
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
+			else if (messageType != MessageType::RequestAck && messageType != MessageType::Event)//do not upload message which messageType equals to RequestAck or Event
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
+			if (js.empty())
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty");
 				return;
 			}
+			if (ConfigManager::getInstance().m_connection_hdls.empty() && ConfigManager::getInstance().m_connection_ws_sm2_hdls.empty())
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket : no websocket client connection");
+			else {
+#if(defined _WIN32 || defined _WIN64)
+				js = string_to_utf8(js);
+#endif
+				if (js.empty())
+				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty 2");
+					return;
+				}
 
-			do_send_msg(hdlID, js);
+				do_send_msg(hdlID, js);
+			}
 		}
+
+		
 	}
 
 	// socket message handler
@@ -1188,12 +1257,12 @@ namespace Chromium {
 			replaceTransId = tmpReplace.first == true ? tmpReplace.second : 0;
 		}
 		// 处理session ack,获取hdlID
+		socket_msgInfo cur_from_socket(replaceTransId, msg.getTransID(), msg.getSessionID());
 
 		unsigned int hdlID = 0;
 		std::vector<std::pair<int, int>> sendArr;
 		if (MessageType::Event == msg.getMessageType())
 		{
-
 			auto formatVectorToString = [](const std::vector<std::pair<int, int>>& vec) -> std::string {
 				std::stringstream ss;
 				ss << "[";
@@ -1216,27 +1285,30 @@ namespace Chromium {
 			for (auto i = sendArr.begin(); i != sendArr.end(); i++)
 			{
 				msg.setTransID(i->first);
-				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), 0);
-				do_sendJson(js, msg.getMessageType(), i->second, id);
+				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, 0);
+				do_sendJson(js, msg.getMessageType(), i->second, id, cur_from_socket);
 				unaccurate_js = js;
 			}
 			auto signatureID = msg.getSignatureID();
 			if (sendArr.size() == 0)
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event sendArr.size() == 0");
+				LogManager::getInstance().logVtmEvent(-1, -1, cur_from_socket.sessionId, cur_from_socket.entityName, 0, "send", sendArr,
+					cur_from_socket.payLoad, cur_from_socket.msgBytes, Error_NotExist, "message_from_socket event sendArr.size() == 0");
 			else if (signatureID != eMsgSig_LogInfo && signatureID != eMsgSig_EntityStatus && signatureID != eMsgSig_PerformanceList)//fiter guiconsole msg
 			{
-#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+				LogManager::getInstance().logVtmEvent(-1, -1, cur_from_socket.sessionId, cur_from_socket.entityName, 0, "send", sendArr,
+					cur_from_socket.payLoad, cur_from_socket.msgBytes);
+				/*
+#ifdef DEVOPS_ON_ST 
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event %s send to arr:%s"
 					, unaccurate_js.c_str(), formatVectorToString(sendArr).c_str());
-#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+#elif defined(DEVOPS_ON_UAT)
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event %s send to arr:%s"
 					, unaccurate_js.c_str(), formatVectorToString(sendArr).c_str());
 #else
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event send to arr:%s", formatVectorToString(sendArr).c_str());
 #endif
+				*/
 			}
-				
-
 		}
 		else if (MessageType::EndSession == msg.getMessageType())	//session end
 		{
@@ -1244,10 +1316,9 @@ namespace Chromium {
 
 			auto ret = m_esm->DoSessionRemove(sessionId);
 			if (ret.first)
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MessgeType:%s, detect session %s:%d lost!remove success", GetMessageTypeString(2).c_str(), ret.second.c_str(), sessionId);
+				LogManager::getInstance().logVtmEndSession(-1, ret.second, sessionId, 0, "clean", "", Error_Succeed, "remove session success");
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MessgeType:%s, detect session %d lost!remove failed", GetMessageTypeString(2).c_str(), sessionId);
-
+				LogManager::getInstance().logVtmEndSession(-1, ret.second, sessionId, 1, "clean", "", Error_NotExist, "detect session lost!remove failed");
 		}
 		else if (MessageType::SessionAck == msg.getMessageType())
 		{//sessionAck
@@ -1255,21 +1326,22 @@ namespace Chromium {
 			auto sessionId = msg.getSessionID();
 			if (ACKPROCESS_NOTHING == ret.first)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MessgeType:%s, can not find save session, process noting, %s", GetMessageTypeString(2).c_str(), ret.second.c_str());//error
+				LogManager::getInstance().logVtmSessionAck(hdlID, -1, -1, sessionId, cur_from_socket.entityName, 2, "none", cur_from_socket.payLoad, cur_from_socket.msgBytes,
+					Error_NotExist, "can not find save session, process noting");
 				return;
 			}
 			if (0 != hdlID)
 			{//hdlId为0时,说明本地发起的session
-				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), replaceTransId);
-				do_sendJson(js, msg.getMessageType(), hdlID, id);	//发给首记录的CMessage
+				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, replaceTransId);
+				do_sendJson(js, msg.getMessageType(), hdlID, id, cur_from_socket);	//发给首记录的CMessage
 			}
 
-			for (auto cur = m_msg_pool.begin(); cur != m_msg_pool.end(); cur++)
+			for (auto cur = ConfigManager::getInstance().m_msg_pool.begin(); cur != ConfigManager::getInstance().m_msg_pool.end(); cur++)
 			{//sessionId为-1时需处理,否则会引发消息风暴
 				if (cur->first == ret.second)
 				{
 					std::vector<std::pair<websocketpp::connection_hdl, std::string>> msgArr(cur->second);
-					m_msg_pool.erase(cur);	//为防止处理消息时引发消息风暴,拷贝并删除原msg_pool
+					ConfigManager::getInstance().m_msg_pool.erase(cur);	//为防止处理消息时引发消息风暴,拷贝并删除原msg_pool
 					if (-1 != sessionId) {
 						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Session with %s Make, deal with record Msg:%d", ret.second.c_str(), msgArr.size());
 						for (auto msg = msgArr.begin(); msg != msgArr.end(); msg++)
@@ -1296,8 +1368,8 @@ namespace Chromium {
 		else
 		{
 			m_esm->AckProcess(&msg, hdlID); //替换真实的transId,update session map
-			std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), replaceTransId);
-			do_sendJson(js, msg.getMessageType(), hdlID, id);
+			std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, replaceTransId);
+			do_sendJson(js, msg.getMessageType(), hdlID, id, cur_from_socket);
 		}
 
 	}

+ 4 - 10
Module/mod_chromium/CWebsocketServer.h

@@ -58,7 +58,7 @@ namespace Chromium {
 		void message_from_socket(CMessage& msg, unsigned int id);
 		bool isWebSocketSuceess() { return m_initSuccess; }
 		const std::map<unsigned, unsigned>& getNotifyPool() {
-			return m_notifyPool;
+			return ConfigManager::getInstance().m_notifyPool;
 		};
 		void do_send_notifyMsg(unsigned hdlID, unsigned transId, const std::string& reason, const std::string& errmsg, const std::string& rebootTime, const DWORD& dwSysError, const DWORD& dwUserCode);
 		//static server m_wsserver;
@@ -80,7 +80,7 @@ namespace Chromium {
 		void do_run();
 		void init_websocket();
 		void init_entity_sessions();
-		void do_sendJson(std::string js, int messageType, int hdlID, unsigned int id);
+		void do_sendJson(std::string js, int messageType, int hdlID, unsigned int id, socket_msgInfo &msgInfo);
 		void do_sendJsonBroadcast(std::string js);
 		template <typename T, typename Y>
 		bool sendBroadCast(T &connections, Y &senders, std::string msg);
@@ -95,7 +95,7 @@ namespace Chromium {
 		std::pair<bool, std::string> getEntityClass(std::string entityName);
 		void do_sendJsonStartSession(std::string entityName, std::string entityClass);
 		void do_relink();
-		std::string restroreTransId(std::string payLoad);
+		std::pair<int, std::string> restroreTransId(std::string payLoad);
 		void updateNotifyPool(unsigned hdl, unsigned transId);	//if transId == 0 , unregister the item, else insert a register
 
 
@@ -106,16 +106,10 @@ namespace Chromium {
 		EntitySessionManager* m_esm;
 		boost::asio::io_service m_ios;
 		boost::thread m_doRunThread, m_doReLinkThread;
-		std::map<unsigned int, websocketpp::connection_hdl> m_connection_hdls;
-		std::map<unsigned int, websocketpp::connection_hdl> m_connection_ws_sm2_hdls;
-		std::map<unsigned int, websocketpp::connection_hdl> m_connection_wss_hdls;
-		std::map<unsigned int, std::shared_ptr<SM2_Encrypt_Manager>> m_ws_sm2_hdls_manager;
-		std::map<std::string, std::vector<std::pair<websocketpp::connection_hdl, std::string>> > m_msg_pool;
-		std::map<std::string, std::string> m_entityAndClass;//不知道为什么不能用map<string,map<>>,猜测应该是websocketpp::connection_hdl生成问题
 		CEntityBase* m_pEntity;
 		boost::mutex m_dealMsgLock;
 		bool m_initSuccess;
-		std::map<unsigned, unsigned> m_notifyPool; //hdl和notify transId对应
+		
 	};
 }
 #endif

+ 67 - 27
Module/mod_chromium/EntitySessionManager.cpp

@@ -98,43 +98,53 @@ namespace Chromium {
 		return;
 	}
 
-	RequestProcessType EntitySessionManager::RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID) {
+	RequestProcessType EntitySessionManager::RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		if (msg == NULL)
 			return PROCESS_NOTHING;
 		RequestProcessType ret = PROCESS_NOTHING;
 
 		switch (msg->getMessageType() & 0x0000FFFF) {
 		case MessageType::Info:
-			ret = ProcessWithInfo(msg, entityName, hdlID);
+			ret = ProcessWithInfo(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::BeginSession:
-			ret = ProcessWithBeginSession(msg, entityName, hdlID);
+			ret = ProcessWithBeginSession(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::EndSession:
 			ret = ProcessWithEndSession(msg, entityName, hdlID);
 			break;
 		case MessageType::Request:
-			ret = ProcessWithRequest(msg, entityName, hdlID);
+			ret = ProcessWithRequest(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::Register:
-			ret = ProcessWithRegister(msg, entityName, hdlID);
+			ret = ProcessWithRegister(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::Unregister:
 			ret = ProcessWithUnregister(msg, entityName, hdlID);
 			break;
-		case MessageType::Event:
+		case MessageType::Event://receive
 			ret = PROCESS_SEND;
 			break;
 		case MessageType::LogEventMsgType:
+			/*
+			do not print
+			"eventCode": 1074790401,
+			"message": "RvcCore MouseOperation onClick",
+			"operate": "send",
+			"payload": "{\"messageType\":9,\"securityLevel\":2,\"eventCode\":1074790401,\"message\":\"RvcCore MouseOperation onClick\"}",
+			*/
+			if(msgInfo.eventCode != 0x40100001)
+				LogManager::getInstance().logWsLogEvent(msgInfo.hdlId, msgInfo.securityLevel, msgInfo.eventCode, msgInfo.message, 0, "send", msgInfo.payLoad);
 			ret = PROCESS_SEND;
 			break;
 		case MessageType::LogWarnMsgType:
+			LogManager::getInstance().logWsLogWarn(msgInfo.hdlId, msgInfo.securityLevel, msgInfo.eventCode, msgInfo.message, 0, "send", msgInfo.payLoad);
 			return PROCESS_SEND;
 		case MessageType::SetVarReq:
-			ret = ProcessWithSetVarReq(msg, entityName, hdlID);
+			ret = ProcessWithSetVarReq(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::GetVarReq:
-			ret = ProcessWithGetVarReq(msg, entityName, hdlID);
+			ret = ProcessWithGetVarReq(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::Broadcast:
 			return PROCESS_NOTHING;
@@ -150,15 +160,17 @@ namespace Chromium {
 		return ret;
 	}
 
-	RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID) {
+	RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		auto it = m_session_map.find(entityName);
 		if (it == m_session_map.end() || -1 == it->second)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
+			LogManager::getInstance().logWebSocketInfo(hdlID, msg->getTransID(), -1, msgInfo.entityName, msgInfo.functionName, 1,
+				"startSession", Error_NoTarget, "no session found", msgInfo.payLoad);
 			return PROCESS_STARTSESSION;
 		}
 		msg->setSessionID(it->second, false);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithInfo, replace sessionID:%d", it->second);
+		LogManager::getInstance().logWebSocketInfo(hdlID, msg->getTransID(), it->second, msgInfo.entityName, msgInfo.functionName, (msgInfo.warnMsg.length() ==0 ? 0 : 1),
+			"send", 0, msgInfo.warnMsg, msgInfo.payLoad);
 		return PROCESS_SEND;
 	}
 
@@ -179,18 +191,22 @@ namespace Chromium {
 		auto curSession = t_BeginSessionTime.find(entityName);
 		if (curSession == t_BeginSessionTime.end() || curSession->second < now_time - 5)
 		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("checkBeginSession record begin session msg, oldTime:%lld, newTime:%lld", curSession != t_BeginSessionTime.end() ? curSession->second : -1, now_time);
+			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("checkBeginSession record begin session msg, oldTime:%lld, newTime:%lld", curSession != t_BeginSessionTime.end() ? curSession->second : -1, now_time);
 			return true;//5s内不重复发起session
 		}
 		else
 			return false;
 	}
 
-	RequestProcessType EntitySessionManager::ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID) {
+	RequestProcessType EntitySessionManager::ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithBeginSession");
 		auto s = GetSessionIDByEntityName(entityName);
 		if (s.first && -1 != s.second)
+		{
+			LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.className, 1, "none", msgInfo.payLoad, 
+				Error_Duplication, "session already existed");
 			return PROCESS_FINDSESSION;
+		}
 
 		if (checkBeginSession(entityName))
 		{
@@ -198,10 +214,15 @@ namespace Chromium {
 			int transID = MakeNewTransID(msg, hdlID);
 			msg->setTransID(transID);
 			updateBeginSessionTime(entityName);
+			LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, transID, msgInfo.entityName, msgInfo.className, 0, "send", msgInfo.payLoad);
 			return PROCESS_SEND;
 		}
 		else
+		{
+			LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.className, 1, "record", msgInfo.payLoad,
+				Error_Duplication, "already begin session in 5 seconds");
 			return PROCESS_RECORDMSG;//5s内发起过session
+		}
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithEndSession(CMessage* msg, std::string entityName,
@@ -211,23 +232,28 @@ namespace Chromium {
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithRequest(CMessage* msg, std::string entityName,
-		unsigned int hdlID) {
+		unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		
 		auto it = m_session_map.find(entityName);
 		if (it == m_session_map.end() || -1 == it->second)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
+			LogManager::getInstance().logWebSocketRequest(msgInfo.hdlId, msgInfo.transId, -1, -1, msgInfo.entityName, msgInfo.functionName, 1,
+				"startSession", msgInfo.payLoad, Error_NoTarget, "no session found, try startSession");
 			return PROCESS_STARTSESSION;
 		}
 		msg->setSessionID(it->second, true);
 		auto transId = MakeNewTransID(msg, hdlID);
 		msg->setTransID(transId);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
+
+		LogManager::getInstance().logWebSocketRequest(msgInfo.hdlId, msgInfo.transId, transId, it->second, msgInfo.entityName, msgInfo.functionName,
+			(msgInfo.warnMsg.length() == 0 ? 0 : 1), "send", msgInfo.payLoad, Error_Succeed, msgInfo.warnMsg);
+
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
 		return PROCESS_SEND;
 	}
 
-	RequestProcessType EntitySessionManager::ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister");
+	RequestProcessType EntitySessionManager::ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister");
 		auto _broadcast_it = m_broadcast_map.find(entityName);
 		if (_broadcast_it == m_broadcast_map.end())
 		{
@@ -235,6 +261,8 @@ namespace Chromium {
 			int transid = MakeNewTransID(msg, hdlID);
 			msg->setTransID(transid);
 			m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
+			LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, transid, msgInfo.entityName,
+				msgInfo.className, 0, "send", msgInfo.payLoad, Error_Succeed, "first register");
 			return PROCESS_SEND;
 		}
 
@@ -245,7 +273,8 @@ namespace Chromium {
 			int transid = MakeNewTransID(msg, hdlID);
 			msg->setTransID(transid);
 			m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister %s first register, send", entityName.c_str());
+			LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, transid, msgInfo.entityName,
+				msgInfo.className, 0, "send", msgInfo.payLoad, Error_Succeed, "first register");
 			return PROCESS_SEND;
 		}
 		// 已经有过订阅 在链表后加
@@ -253,6 +282,8 @@ namespace Chromium {
 		if (pNode->hdlID == hdlID)
 		{
 			// 该客户端订阅过,避免重复订阅
+			LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, -1, msgInfo.entityName,
+				msgInfo.className, 0, "none", msgInfo.payLoad, Error_Duplication, "already register");
 			return PROCESS_NOTHING;
 		}
 		while (pNode->next != NULL) {
@@ -268,8 +299,9 @@ namespace Chromium {
 		pNode->next->next = NULL;
 		pNode->next->hdlID = hdlID;
 		pNode->next->transID = msg->getTransID();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)
-			("EntitySessionManager::ProcessWithRegister %s already register, add hdl %d", entityName.c_str(), hdlID);
+		CSimpleString warnStr = CSimpleString::Format("EntitySessionManager::ProcessWithRegister %s already register, add hdl %d", entityName.c_str(), hdlID);
+		LogManager::getInstance().logWebSocketRegister(hdlID, pNode->next->transID, -1, msgInfo.entityName,
+			msgInfo.className, 1, "none", msgInfo.payLoad, Error_Duplication, warnStr.GetData());
 		return PROCESS_NOTHING;
 	}
 
@@ -327,16 +359,22 @@ namespace Chromium {
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithSetVarReq(CMessage* msg, std::string entityName,
-		unsigned int hdlID) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
-		msg->setTransID(MakeNewTransID(msg, hdlID));
+		unsigned int hdlID, const ws_msgInfo& msgInfo) {
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
+		int transId = MakeNewTransID(msg, hdlID);
+		msg->setTransID(transId);
+		LogManager::getInstance().logWebSocketSetVar(msgInfo.hdlId, msgInfo.transId, transId, msgInfo.name, msgInfo.value, 0, "send", msgInfo.payLoad);
 		return PROCESS_SEND;
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithGetVarReq(CMessage* msg, std::string entityName,
-		unsigned int hdlID) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
-		msg->setTransID(MakeNewTransID(msg, hdlID));
+		unsigned int hdlID, const ws_msgInfo& msgInfo) {
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
+		int transId = MakeNewTransID(msg, hdlID);
+		msg->setTransID(transId);
+		LogManager::getInstance().logWebSocketGetVar(msgInfo.hdlId, msgInfo.transId, transId, msgInfo.name, 0, "send", msgInfo.payLoad);
+
+
 		return PROCESS_SEND;
 	}
 
@@ -367,6 +405,8 @@ namespace Chromium {
 		{
 			char sessionJs[10240] = "";
 			sprintf(sessionJs, "{\"messageType\":%d,\"transID\":%d,\"InitCfg\":%d,\"%s\":%s}", 16, transId, isInitCfg, PARAMLIST_HEAD, sessionJson.second.c_str());
+			LogManager::getInstance().logEntityStatus(CSimpleString::Format("GetSessionRequest, InitCfg\":%d,\"entityConnect\":%s", isInitCfg, sessionJson.second.c_str()).GetData(),
+				LOG_LEVEL_INFO, 0, "send");
 			return std::make_pair(true, sessionJs);
 		}
 		return std::make_pair(false, "error generateJsonStr");

+ 8 - 9
Module/mod_chromium/EntitySessionManager.h

@@ -6,7 +6,7 @@
 #include <string>
 #include "CMessage.h"
 // #include "CSocketClient.h"
-// #include "CWSCodec.h"
+#include "CWSCodec.h"
 
 namespace Chromium {
 
@@ -37,8 +37,7 @@ namespace Chromium {
 
 		std::pair<int, std::string> GetStartSessionRequest(std::string entityname, std::string className);	//返回分配的transId和生成的beginSession串
 		std::pair<int, std::string> GetAllSessionRequest(int transId, bool isInitCfg);
-		RequestProcessType RequestProcess(CMessage* msg, std::string entityName,
-			unsigned int hdlID);
+		RequestProcessType RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo &msgInfo);
 		AckProcessType AckProcess(CMessage* msg, unsigned int& hdlID);
 		AckProcessType AskProcessEvent(CMessage* msg, std::vector<std::pair<int, int>>& transIdandHdlIDArr);
 		std::pair<AckProcessType, std::string> AskProcessSession(CMessage* msg, unsigned int& hdlID);
@@ -74,14 +73,14 @@ namespace Chromium {
 		std::string UpdateSessionMap(int transid, int sessionId);	//更新session表并返回更新的实体名
 
 		// process with requests
-		RequestProcessType ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID);
+		RequestProcessType ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
+		RequestProcessType ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
 		RequestProcessType ProcessWithEndSession(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithRequest(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID);
+		RequestProcessType ProcessWithRequest(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
+		RequestProcessType ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
 		RequestProcessType ProcessWithUnregister(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithSetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithGetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID);
+		RequestProcessType ProcessWithSetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
+		RequestProcessType ProcessWithGetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
 
 		AckProcessType ProcessWithAck(CMessage* msg, unsigned int& hdlID);
 		AckProcessType ProcessWithRecvEvent(CMessage* msg, unsigned int& hdlID);

+ 10 - 1
Module/mod_chromium/ReadMe.md

@@ -8,4 +8,13 @@
 * {"entity":"ResourceWatcher","class":"ResourceWatcherService","transID":1,"methodID":6,"signature":651862197,"timeout":60000,"messageType":3,"filter":1,"sessionID":190924109}
 
 # RequestAck:
-* {"messageType":4,"sessionID":190924110,"transID":3,"isEnd":1,"errorCode":0,"errorMsg":"","errMsg":"密钥集丢失(私钥为空),请重置秘钥进行初始化","reserved1":"","reserved2":"","{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}":"{\"errMsg\":\"密钥集丢失(私钥为空),请重置秘钥进行初始化\",\"reserved1\":\"\",\"reserved2\":\"\"}
+* {"messageType":4,"sessionID":190924110,"transID":3,"isEnd":1,"errorCode":0,"errorMsg":"","errMsg":"密钥集丢失(私钥为空),请重置秘钥进行初始化","reserved1":"","reserved2":"","{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}":"{\"errMsg\":\"密钥集丢失(私钥为空),请重置秘钥进行初始化\",\"reserved1\":\"\",\"reserved2\":\"\"}
+
+# LogEventMsgType:
+* {"messageType":9,"securityLevel":2,"eventCode":1074790401,"message":"RvcCore MouseOperation onClick"}
+
+# Event:
+* {"messageType":8,"transID":16777233,"eventID":0,"signatureID":175614460,"state":2,"status":"Customer:Control","session_id":"2E23B43E00000013","{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}":"{\"state\":2,\"status\":\"Customer:Control\",\"session_id\":\"2E23B43E00000013\"}"}
+
+# Info:
+* {"messageType":0,"entity":"CardReadAdapter","class":"CardReadAdapterService","sessionID":3753187,"methodID":1,"signature":-342104338,"ParentSpanId":"0","TraceId":"3741f0ce50404c37b436b0df16ab412c","SpanId":"487c70f8bc4c4177","RVCSessionID":"7555980262-1720747934874000"}

+ 664 - 28
Module/mod_chromium/baseEx.cpp

@@ -33,18 +33,7 @@ using namespace boost::interprocess;
 #include <signal.h>
 #endif
 
-void* logProducer = nullptr;
-std::map<std::string, void*> g_logProducerArr;
-bool g_useMagic = false;
-bool g_loggerInitSuccess = false;
-bool g_logToFile = true;
-bool g_withMedia = false;
-bool g_withConsole = false;
-bool g_withSpecialTest = false;
-bool g_withLinkLog = false;
-bool g_hasInitCfg = false;
-bool g_unsafeAd = false;
-int g_sogouForce = 0;
+
 std::string g_usercodeTranslateFile = "";
 std::map<std::string, std::vector<std::string>> g_networkParse;
 std::map<std::string, clock_t> g_networkExpiredData;
@@ -133,12 +122,14 @@ struct cefclientLog {
 
 bool InitFileLogger(std::string dbgPath)
 {
-	return g_loggerInitSuccess = logger::init(dbgPath.c_str(), "cefLog");
+	auto ret = logger::init(dbgPath.c_str(), "cefLog");
+	ConfigManager::getInstance().setLoggerInitSuccess(ret);
+	return ret;
 }
 
 void DbgToFileLogger(std::string msg)
 {
-	if(g_loggerInitSuccess)
+	if(ConfigManager::getInstance().isLoggerInitSuccess())
 		logger::showLog(msg);
 }
 
@@ -152,7 +143,7 @@ void DbgEx(const char* str, ...)
 	char* buf = (char*)malloc(n + 1);
 	vsprintf(buf, str, arg);
 	auto modifyStr = CSimpleString::Format("%s", buf);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).withExtendLog(g_logToFile).setResultMsg(modifyStr.GetData())();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).withExtendLog(!ConfigManager::getInstance().m_withNoFileLog).setResultMsg(modifyStr.GetData())();
 	free(buf);
 #else
 	auto modifyStr = CSimpleString::Format("%s", str);
@@ -252,8 +243,8 @@ DWORD SaveCefclientLog(std::string magicStr)
 		boost::interprocess::permissions cur;
 		cur.set_unrestricted();
 		message_queue mq(create_only, dstGuid.c_str(), 100, sizeof(cefclientLog), cur);
-		g_useMagic = true;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SaveCefclientLog thread begin");
+		ConfigManager::getInstance().setUseMagic(true);
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SaveCefclientLog thread begin");
 		while (true)
 		{
 			cefclientLog t_data;
@@ -265,14 +256,14 @@ DWORD SaveCefclientLog(std::string magicStr)
 			unsigned int t_priority = 0;
 			mq.receive(&t_data, sizeof(cefclientLog), t_recvSize, t_priority);
 			std::string source = std::string(t_data.m_filename) + "(" + std::to_string((ULONGLONG)t_data.m_filePos) + ")";
-#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
+#ifdef OUTPUT_DETAIL_LOG /*DevOps流水线编译,ST环境*/
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
 #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
 #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(false).setResultMsg(t_data.m_cefLog)();
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(false).setResultMsg(t_data.m_cefLog)();
 #else
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(false).setResultMsg(t_data.m_cefLog)();
 #endif // DEVOPS
 			if (sizeof(cefclientLog) != t_recvSize)
 				break;
@@ -289,11 +280,11 @@ DWORD SaveCefclientLog(std::string magicStr)
 	}
 	catch (interprocess_exception& ex) {
 		message_queue::remove(dstGuid.c_str());
-		g_useMagic = false;
+		ConfigManager::getInstance().setUseMagic(false);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s run exception, for %s", dstGuid.c_str(), ex.what());
 		return 1;
 	}
-	g_useMagic = false;
+	ConfigManager::getInstance().setUseMagic(false);
 	message_queue::remove(dstGuid.c_str());
 	return 0;
 }
@@ -374,7 +365,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 {
 	const std::string headerStr = "UserError=";
 	if (srcMsg.find(headerStr) != 0)
-		return std::make_pair(0, ErrMsgStruct("", srcMsg));
+		return std::make_pair(0, ErrMsgStruct("", srcMsg, headerStr));
 
 	unsigned long userCode = std::stoi(srcMsg.substr(headerStr.length()));
 	std::string userCodeStr = CSimpleString::Format("0x%X", userCode).GetData();
@@ -383,7 +374,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 	if (g_UserCodeToMsgTip.size() == 0)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F0").setAPI(__FUNCTION__)("RTA42F0|微服务异常|(%s)", srcMsg.c_str());
-		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str()).GetData()));
+		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str(), userCodeStr).GetData()));
 	}
 
 	if (g_UserCodeToMsgTip.find(userCodeStr) != g_UserCodeToMsgTip.end())
@@ -394,7 +385,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 	else
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F1").setAPI(__FUNCTION__)("RTA42F1|错误映射异常|(%s)", srcMsg.c_str());
-		return std::make_pair(userCode, ErrMsgStruct("RTA42F1", CSimpleString::Format("RTA42F1|错误映射异常|(%s)", srcMsg.c_str()).GetData()));
+		return std::make_pair(userCode, ErrMsgStruct("RTA42F1", CSimpleString::Format("RTA42F1|错误映射异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
 	}
 }
 
@@ -928,4 +919,649 @@ std::vector<int> getUosBrowserPIDs(int UseUOSBrowser)
 	}
 	return pids;
 }
-#endif
+#endif
+
+
+ConfigManager& ConfigManager::getInstance() {
+	static ConfigManager instance;
+	return instance;
+}
+
+ConfigManager::ConfigManager()
+	: m_iTcpBridgePort(4504), m_strCustomMainUrl(""), m_strCustomAdUrl(""), m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
+	, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false), m_withMedia(false), m_withSpecialTest(false), m_withConsole(false),
+	m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false)
+{
+	void* logProducer = nullptr;
+	std::map<std::string, void*> g_logProducerArr;
+	bool g_useMagic = false;
+	bool g_loggerInitSuccess = false;
+	bool g_withSpecialTest = false;
+	bool g_hasInitCfg = false;//can discard
+	int g_sogouForce = 0;
+}
+
+
+LogManager& LogManager::getInstance() {
+	static LogManager instance;
+	return instance;
+}
+
+void LogManager::logWebSocketBuild(int64_t hdl, const std::string& url, const std::string& isSecurity) {
+	Json::Value log;
+	log["hdl"] = hdl;
+	log["78173721_logType"] = "ws_build";
+
+	Json::Value detail;
+	detail["url"] = url;
+	detail["isSecurity"] = isSecurity;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	writeLog(log);
+}
+
+void LogManager::writeLog(const Json::Value& log) {
+	Json::FastWriter writer;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(writer.write(log).c_str());
+}
+
+std::string LogManager::getCurrentTimestamp() {
+	using namespace std::chrono;
+
+	auto now = system_clock::now();
+	auto ms = duration_cast<milliseconds>(now.time_since_epoch()) % 1000;
+	auto timer = system_clock::to_time_t(now);
+
+	std::ostringstream oss;
+	oss << std::put_time(std::localtime(&timer), "%Y-%m-%d %H:%M:%S")
+		<< '.' << std::setfill('0') << std::setw(3) << ms.count();
+
+	return oss.str();
+}
+
+void LogManager::logWebSocketBeginSession(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& entity,
+	const std::string& entityClass,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = hdl;
+	log["78173721_logType"] = "ws_beginSession";
+
+	Json::Value detail;
+	detail["web_transID"] = web_transID;
+	detail["inner_transID"] = inner_transID;
+	detail["entity"] = entity;
+	detail["class"] = entityClass;
+	detail["ret"] = ret;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketClose(int64_t hdl) {
+	Json::Value log;
+	log["hdl"] = hdl;
+	log["78173721_logType"] = "ws_close";
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	writeLog(log);
+}
+
+void LogManager::logWebSocketInfo(int64_t hdl,
+	int64_t web_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	const std::string& function,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason,
+	const std::string& payload) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_info";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["function"] = function;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketRegister(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& entity,
+	const std::string& entityClass,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_register";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["entity"] = entity;
+	detail["class"] = entityClass;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketRequest(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	const std::string& function,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_request";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["function"] = function;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketSetVar(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& name,
+	const std::string& value,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_setvar";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["name"] = name;
+	detail["value"] = value;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketGetVar(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& name,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_getvar";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["name"] = name;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketBroadcast(int64_t hdl,
+	const std::string& entity,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_broadcast";
+
+	Json::Value detail;
+	detail["entity"] = entity;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmEndSession(int64_t hdl,
+	const std::string& entity,
+	int64_t sessionId,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_endsession";
+
+	Json::Value detail;
+	detail["entity"] = entity;
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmRequestAck(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	const std::string& function,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	const std::string& srcByte,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_requestAck";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["function"] = function;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["srcByte"] = srcByte;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmEvent(int64_t hdl,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	int ret,
+	const std::string& operate,
+	const std::vector<std::pair<int, int>>& transIdAndhdl_arr,
+	const std::string& payload,
+	const std::string& srcByte,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_event";
+
+	Json::Value detail;
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+
+	Json::Value transIdAndhdl_json(Json::arrayValue);
+	for (const auto& pair : transIdAndhdl_arr) {
+		Json::Value pairJson(Json::objectValue);
+		pairJson["transId"] = Json::Int64(pair.first);
+		pairJson["hdl"] = Json::Int64(pair.second);
+		transIdAndhdl_json.append(pairJson);
+	}
+	detail["transIdAndhdl_arr"] = transIdAndhdl_json;
+
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["srcByte"] = srcByte;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmSessionAck(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	const std::string& srcByte,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_sessionAck";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["srcByte"] = srcByte;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWsLogEvent(
+	int64_t hdl,
+	int securityLevel,
+	int eventCode,
+	const std::string& message,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_logEvent";
+
+	Json::Value detail;
+	detail["securityLevel"] = securityLevel;
+	detail["eventCode"] = eventCode;
+	detail["message"] = message;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWsLogWarn(
+	int64_t hdl,
+	int securityLevel,
+	int eventCode,
+	const std::string& message,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_logWarn";
+
+	Json::Value detail;
+	detail["securityLevel"] = securityLevel;
+	detail["eventCode"] = eventCode;
+	
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["message"] = message;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logEntityOnLog(
+	const std::string& entity,
+	int64_t usercode,
+	const std::string& usercodeStr,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_onlog";
+
+	Json::Value detail;
+	detail["entity"] = entity;
+	detail["usercode"] = Json::Int64(usercode);
+	detail["usercodeStr"] = usercodeStr;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logEntityBegin(int no_startup) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_begin";
+
+	Json::Value detail;
+	detail["no_startup"] = no_startup;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}
+
+void LogManager::logEntityOpenPage(
+	const std::string& pageType,
+	int64_t pid,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_openPage";
+
+	Json::Value detail;
+	detail["pageType"] = pageType;
+	detail["pid"] = Json::Int64(pid);
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}
+
+void LogManager::logEntityStageChange(
+	const std::string& stage,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_stageChange";
+
+	Json::Value detail;
+	detail["stage"] = stage;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}
+
+void LogManager::logEntityStatus(
+	const std::string& status,
+	int level,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_status";
+
+	Json::Value detail;
+	detail["status"] = status;
+	detail["level"] = level;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}

+ 404 - 11
Module/mod_chromium/baseEx.h

@@ -3,17 +3,11 @@
 #include<vector>
 #include<string>
 #include<map>
+#include<deque>
+#include "websocketpp/config/asio.hpp"
+#include "websocketpp/server.hpp"
+#include "json/json.h"
 
-extern void* logProducer;
-extern std::map<std::string, void*> g_logProducerArr;
-extern bool g_useMagic;
-extern bool g_logToFile;
-extern bool g_withMedia;
-extern bool g_withConsole;
-extern bool g_withLinkLog;
-extern bool g_hasInitCfg;
-extern bool g_unsafeAd;
-extern int g_sogouForce;
 
 #define DEFAULT_KEY_LEN 256
 
@@ -35,9 +29,11 @@ void InitUserCodeToMsgTip(CAutoArray<CSimpleStringA>& strErrorCodeArr, CAutoArra
 struct ErrMsgStruct {
 	std::string VTMCode;
 	std::string errMsg;
+	std::string userCode;
 
 	// 带参数的构造函数,参数有默认值
-	ErrMsgStruct(const std::string& tmp_VTMCode = "", const std::string& tmp_errMsg = "") : VTMCode(tmp_VTMCode), errMsg(tmp_errMsg) {}
+	ErrMsgStruct(const std::string& tmp_VTMCode = "", const std::string& tmp_errMsg = "", const std::string& tmp_userCode = "") 
+		: VTMCode(tmp_VTMCode), errMsg(tmp_errMsg), userCode(tmp_userCode) {}
 };
 
 
@@ -112,3 +108,400 @@ private:
 	SM2ProtocolState m_state;
 	
 };
+
+struct SYS_EVENT_PARAM
+{
+	std::string key;
+	std::string value;
+	std::string oldValue;
+	std::string entityName;
+
+	// 默认构造函数
+	SYS_EVENT_PARAM() = default;
+
+	// 带参数的构造函数
+	SYS_EVENT_PARAM(const std::string& k, const std::string& v, const std::string& ov, const std::string& en)
+		: key(k), value(v), oldValue(ov), entityName(en) {}
+
+	// 拷贝构造函数
+	SYS_EVENT_PARAM(const SYS_EVENT_PARAM& other)
+		: key(other.key), value(other.value), oldValue(other.oldValue), entityName(other.entityName) {}
+
+	// 拷贝赋值运算符
+	SYS_EVENT_PARAM& operator=(const SYS_EVENT_PARAM& other) {
+		if (this != &other) {
+			key = other.key;
+			value = other.value;
+			oldValue = other.oldValue;
+			entityName = other.entityName;
+		}
+		return *this;
+	}
+
+	// 禁用移动构造函数
+	SYS_EVENT_PARAM(SYS_EVENT_PARAM&&) = delete;
+
+	// 禁用移动赋值运算符
+	SYS_EVENT_PARAM& operator=(SYS_EVENT_PARAM&&) = delete;
+};
+
+class ConfigManager {
+public:
+    static ConfigManager& getInstance();
+private:
+	//old global params
+	void* logProducer;
+	std::map<std::string, void*> g_logProducerArr;
+	bool g_useMagic;
+	bool g_hasInitCfg;
+	int g_sogouForce;
+	bool g_loggerInitSuccess;
+public:
+	void* getLogProducer() const { return logProducer; };
+	void setLogProducer(void* t_logProducer) { logProducer = t_logProducer; };
+
+	std::map<std::string, void*>& getLogProducerArr() { return g_logProducerArr; };
+
+	bool isUseMagic() const{ return g_useMagic; };
+	void setUseMagic(bool useMagic) { g_useMagic = useMagic; };
+
+
+	bool isHasInitCfg() const { return g_hasInitCfg; };
+	void setHasInitCfg(bool hasInitCfg) { g_hasInitCfg = hasInitCfg; };
+
+	int getSogouForce() const { return g_sogouForce; };
+	void setSogouForce(int sogouForce) { g_sogouForce = sogouForce; };
+
+	bool isLoggerInitSuccess() const { return g_loggerInitSuccess; };
+	void setLoggerInitSuccess(bool loggerInitSuccess) { g_loggerInitSuccess = loggerInitSuccess; };
+
+//params from chromium
+private:
+	CSystemStaticInfo m_sysInfo;
+	int m_iTcpBridgePort;
+	
+	//for now on, easy modify
+
+public:
+	std::string m_strCustomMainUrl, m_strCustomAdUrl;
+	bool m_runAd/*广告*/, m_runMain/*业务*/, m_runExtend/*低柜副屏*/, m_runLogin/*用户桌面,可能木有用*/, m_withBrowser/*是否需要与browser交互*/;
+	bool m_withDebugMode/*是否启动debug模式*/, m_withMagic/*启用随机共享内存*/, m_withNoFileLog/*是否不需要本地日志落盘*/, m_withMedia/*开启多媒体选项*/;
+	bool m_withUnsafeAd/*Ad页面忽略安全选项*/;
+	bool m_withConsole;
+	bool m_withSpecialTest/*开启一些终端功能的测试*/, m_withLinkLog/*开启链路中的中间链路日志*/;
+	bool m_withMin, m_withClose, m_installMode;
+	std::deque<SYS_EVENT_PARAM> m_eventArr;
+	bool m_noStartupPage;
+	std::map<std::string, std::vector<int>> m_commonPageArr;
+
+public:
+	CSystemStaticInfo& getSysInfo() { return m_sysInfo; };
+
+	int getTcpBridgePort() const { return m_iTcpBridgePort; };
+	void setTcpBridgePort(int iTcpBridgePort) { m_iTcpBridgePort = iTcpBridgePort; };
+
+//params from CModTools
+public:
+	CSimpleString m_strSite, m_strMachineType;
+	CSimpleString m_UserMgrUrlStr, m_UserMgrUrlNoSidebarStr, m_UserMgrUrlNoSidebarMutiStr, m_UserMgrUrlFultureStr, m_UserMgrAdStr;
+	std::string m_strCacheHead;
+
+
+//params for CWebsocketServer
+public:
+	std::map<unsigned int, websocketpp::connection_hdl> m_connection_hdls;
+	std::map<unsigned int, websocketpp::connection_hdl> m_connection_ws_sm2_hdls;
+	std::map<unsigned int, websocketpp::connection_hdl> m_connection_wss_hdls;
+	std::map<unsigned int, std::shared_ptr<SM2_Encrypt_Manager>> m_ws_sm2_hdls_manager;
+	std::map<std::string, std::vector<std::pair<websocketpp::connection_hdl, std::string>> > m_msg_pool;
+	std::map<std::string, std::string> m_entityAndClass;//不知道为什么不能用map<string,map<>>,猜测应该是websocketpp::connection_hdl生成问题
+	std::map<unsigned, unsigned> m_notifyPool; //hdl和notify transId对应
+
+private:
+    ConfigManager();
+    ConfigManager(const ConfigManager&) = delete;
+    ConfigManager& operator=(const ConfigManager&) = delete;
+};
+
+
+class LogManager {
+public:
+	static LogManager& getInstance();
+
+	void logWebSocketBuild(int64_t hdl, const std::string& url, const std::string& isSecurity);
+	void logWebSocketClose(int64_t hdl);
+	/**
+	 * @brief 记录 WebSocket 会话开始的日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param transID 事务ID
+	 * @param entity 实体名称
+	 * @param entityClass 实体类名
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param retDetail 详细的返回代码
+	 * @param reason 警告或失败的原因
+	 * @param srcMsg 源消息
+	 */
+	void logWebSocketBeginSession(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& entity,
+		const std::string& entityClass,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	/**
+	 * @brief 记录 WebSocket 信息日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param sessionId 会话 ID
+	 * @param entity 实体名称
+	 * @param function 函数名称
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param retDetail 详细的返回代码
+	 * @param reason 警告或失败的原因
+	 * @param payload 有效载荷
+	 */
+	void logWebSocketInfo(int64_t hdl,
+		int64_t web_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		const std::string& function,
+		int ret,
+		const std::string& operate,
+		int retDetail,
+		const std::string& reason,
+		const std::string& payload);
+
+	/**
+	 * @brief 记录 WebSocket 注册信息日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param entity 实体名称
+	 * @param entityClass 实体类名
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketRegister(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& entity,
+		const std::string& entityClass,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+
+	/**
+	 * @brief 记录 WebSocket 请求信息日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param sessionId 会话 ID
+	 * @param entity 实体名称
+	 * @param function 函数名称
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketRequest(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		const std::string& function,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	/**
+	 * @brief 记录 WebSocket 设置变量的日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param name 变量名称
+	 * @param value 变量值
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketSetVar(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& name,
+		const std::string& value,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	/**
+	 * @brief 记录 WebSocket 获取变量的日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param name 变量名称
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketGetVar(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& name,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logWebSocketBroadcast(int64_t hdl,
+		const std::string& entity,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmEndSession(int64_t hdl,
+		const std::string& entity,
+		int64_t sessionId,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmRequestAck(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		const std::string& function,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		const std::string& srcByte,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmEvent(int64_t hdl,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		int ret,
+		const std::string& operate,
+		const std::vector<std::pair<int, int>>& transIdAndhdl_arr,
+		const std::string& payload,
+		const std::string& srcByte,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmSessionAck(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		const std::string& srcByte,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logWsLogEvent(
+		int64_t hdl,
+		int securityLevel,
+		int eventCode,
+		const std::string& message,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logWsLogWarn(
+		int64_t hdl,
+		int securityLevel,
+		int eventCode,
+		const std::string& message,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityOnLog(
+		const std::string& entity,
+		int64_t usercode,
+		const std::string& usercodeStr,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityBegin(int no_startup);
+
+	void logEntityOpenPage(
+		const std::string& pageType,
+		int64_t pid,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityStageChange(
+		const std::string& stage,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityStatus(
+		const std::string& status,
+		int level,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+private:
+	LogManager() = default;
+	LogManager(const LogManager&) = delete;
+	LogManager& operator=(const LogManager&) = delete;
+
+	void writeLog(const Json::Value& log);
+	std::string getCurrentTimestamp();
+};
+
+

+ 168 - 135
Module/mod_chromium/mod_chromium.cpp

@@ -76,10 +76,7 @@ namespace Chromium {
 	}
 
 
-	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_iTcpBridgePort(4504), m_pTimerListener(NULL), m_strCustomMainUrl(true)
-		, m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
-		, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false), m_withMedia(false), m_withSpecialTest(false), m_withConsole(false),
-		m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false)
+	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_pTimerListener(NULL)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CChromiumEntity constructor");
 
@@ -181,10 +178,10 @@ namespace Chromium {
 			std::this_thread::sleep_for(std::chrono::seconds(2));
 			auto dstPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
 
-			if (m_commonPageArr.find(strTitle) == m_commonPageArr.end())
+			if (ConfigManager::getInstance().m_commonPageArr.find(strTitle) == ConfigManager::getInstance().m_commonPageArr.end())
 			{
 				std::vector<int> tmp;
-				m_commonPageArr[strTitle] = tmp;
+				ConfigManager::getInstance().m_commonPageArr[strTitle] = tmp;
 			}
 			std::vector<int> difference;
 			// 使用 std::set_difference 查找差值
@@ -198,7 +195,7 @@ namespace Chromium {
 			for (auto it : difference)
 			{
 				//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("open commonPage %d", it);
-				m_commonPageArr[strTitle].push_back(it);
+				ConfigManager::getInstance().m_commonPageArr[strTitle].push_back(it);
 			}
 #endif
 			ctx->Answer(ret.first, ret.first);
@@ -218,9 +215,9 @@ namespace Chromium {
 			std::this_thread::sleep_for(std::chrono::seconds(1));
 			CModTools::get_mutable_instance().stopCommonPage(strName);
 #else
-			if (m_commonPageArr.find(strName) != m_commonPageArr.end())
+			if (ConfigManager::getInstance().m_commonPageArr.find(strName) != ConfigManager::getInstance().m_commonPageArr.end())
 			{
-				auto arr = m_commonPageArr[strName];
+				auto arr = ConfigManager::getInstance().m_commonPageArr[strName];
 				for (auto it : arr)
 				{
 					CSimpleStringA cmd = CSimpleStringA::Format("sudo kill -9 %d", it);
@@ -228,7 +225,7 @@ namespace Chromium {
 					system(cmd.GetData());
 				}
 				arr.clear();
-				m_commonPageArr[strName] = arr;
+				ConfigManager::getInstance().m_commonPageArr[strName] = arr;
 			}
 			std::this_thread::sleep_for(std::chrono::seconds(1));
 #endif // RVC_OS_WIN
@@ -312,7 +309,7 @@ namespace Chromium {
 
 	void CChromiumEntity::OnPreStart_Init(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
-		LOG_FUNCTION();
+		LogManager::getInstance().logEntityStageChange("OnPreStart_Init", 0, "begin");
 #ifdef OPEN_PERF
 		auto profStr = CSimpleString::Format("chromiumAnalyze_%s.prof", generateTimeStr(true).c_str());
 		std::thread([](std::string str) {
@@ -334,23 +331,24 @@ namespace Chromium {
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("strArgs[%d] = %s", i, strArgs[i].GetData());
 				}
 				if (ArgsCount == 1) {
-					m_strCustomMainUrl = strArgs[0];
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main ulr: %s", m_strCustomMainUrl.GetData());
+					ConfigManager::getInstance().m_strCustomMainUrl = strArgs[0].GetData();
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main ulr: %s", ConfigManager::getInstance().m_strCustomMainUrl.c_str());
 				}
 				else if (ArgsCount == 2)
 				{
-					m_strCustomMainUrl = strArgs[0];
-					m_strCustomAdUrl = strArgs[1];
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s, ad url: %s", m_strCustomMainUrl.GetData(), m_strCustomAdUrl.GetData());
+					ConfigManager::getInstance().m_strCustomMainUrl = strArgs[0].GetData();
+					ConfigManager::getInstance().m_strCustomAdUrl = strArgs[1].GetData();
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s, ad url: %s"
+						, ConfigManager::getInstance().m_strCustomMainUrl.c_str(), ConfigManager::getInstance().m_strCustomAdUrl.c_str());
 				}
 #endif
 
-				GetFunction()->GetSystemStaticInfo(m_sysInfo);
+				GetFunction()->GetSystemStaticInfo(ConfigManager::getInstance().getSysInfo());
 				if (!IsConfigMode()) {
 				CSmartPointer<IConfigInfo> spConfig;
 				if (Error_Succeed == GetFunction()->OpenConfig(Config_CenterSetting, spConfig))//特别坑,这个OpenConfig返回一直都是success
 				{
-					auto webMaskKey = CSimpleString::Format("WebMask_%s", m_sysInfo.strMachineType.GetData());
+					auto webMaskKey = CSimpleString::Format("WebMask_%s", ConfigManager::getInstance().getSysInfo().strMachineType.GetData());
 					CSimpleString webMaskStr;
 					bool no_startup = false;
 					if (Error_Succeed == spConfig->ReadConfigValue("Chromium", webMaskKey.GetData(), webMaskStr))
@@ -360,69 +358,71 @@ namespace Chromium {
 						{
 							auto trimStr = maskArr[i].Trim();
 							if (!trimStr.Compare("ad", true))//will open ad browser
-								m_runAd = true;
+								ConfigManager::getInstance().m_runAd = true;
 							else if (!trimStr.Compare("main", true))//will open main browser
-								m_runMain = true;
+								ConfigManager::getInstance().m_runMain = true;
 							else if (!trimStr.Compare("extend", true))//will open extend browser
-								m_runExtend = true;
+								ConfigManager::getInstance().m_runExtend = true;
 							else if (!trimStr.Compare("login", true))//will open login(User Desktop) browser
-								m_runLogin = true;
+								ConfigManager::getInstance().m_runLogin = true;
 							else if (!trimStr.Compare("with_browser", true))//will not open any browser
-								m_withBrowser = true;
+								ConfigManager::getInstance().m_withBrowser = true;
 							else if (!trimStr.Compare("with_min", true))//the errPage contains min button
-								m_withMin = true;
+								ConfigManager::getInstance().m_withMin = true;
 							else if (!trimStr.Compare("with_close", true))//the errPage contains close button
-								m_withClose = true;
+								ConfigManager::getInstance().m_withClose = true;
 							else if (!trimStr.Compare("with_debugmode", true))//the browser will open remote control function
-								m_withDebugMode = true;
+								ConfigManager::getInstance().m_withDebugMode = true;
 							else if (!trimStr.Compare("with_magic", true))//the browser will open special queue for log sender.
-								m_withMagic = true;
+								ConfigManager::getInstance().m_withMagic = true;
 							else if (!trimStr.Compare("with_media", true))//the browser will support media play and RTC function
-								m_withMedia = true;
+								ConfigManager::getInstance().m_withMedia = true;
 							else if (!trimStr.Compare("with_unsafe_ad", true))
-								m_withUnsafeAd = g_unsafeAd = true;
+								ConfigManager::getInstance().m_withUnsafeAd = true;
 							else if (!trimStr.Compare("with_specialTest", true))//chromium will run specical test
-								m_withSpecialTest = true;
+								ConfigManager::getInstance().m_withSpecialTest = true;
 							else if (!trimStr.Compare("with_LinkLog", true))//control do_sendJson to print more logs(request)
-								m_withLinkLog = true;
+								ConfigManager::getInstance().m_withLinkLog = true;
 							else if (!trimStr.Compare("with_nofilelog", true))//DbgEx do not print logs to local storage, but DbgEx() is discard.
-								m_withNoFileLog = true;
+								ConfigManager::getInstance().m_withNoFileLog = true;
 							else if (!trimStr.Compare("with_console", true))//control browser will print console logs
-								g_withConsole = m_withConsole = true;
+								ConfigManager::getInstance().m_withConsole = true;
 							else if (!trimStr.Compare("no_startup", true))//control browser will print console logs
 								no_startup = true;
 							else if (!trimStr.Compare("sogou_force", true))//force click setfocus page every time
-								g_sogouForce = 1;
+								ConfigManager::getInstance().setSogouForce(1);
 							else if (!trimStr.Compare("sogou_no", true))//not adapt to sogou
-								g_sogouForce = 2;
+								ConfigManager::getInstance().setSogouForce(2);
 						}
 						CSmartPointer<IConfigInfo> chromiumCfg;
-						if (m_runMain == true && Error_Succeed == GetFunction()->OpenConfig(Config_Cache, chromiumCfg))
+						if (ConfigManager::getInstance().m_runMain == true && Error_Succeed == GetFunction()->OpenConfig(Config_Cache, chromiumCfg))
 							chromiumCfg->WriteConfigValueInt("Run", "no_startup", no_startup ? 1 : 0);
 
 
 
 #if (defined _WIN32 || defined _WIN64)
-						if (m_withDebugMode)
-							CModTools::get_mutable_instance().setWithDebugMode(m_withDebugMode);
 #else
 						//对于UOS来说,没有最小化和关闭按钮
-						m_withMin = false;
-						m_withClose = false;
+						ConfigManager::getInstance().m_withMin = false;
+						ConfigManager::getInstance().m_withClose = false;
 #endif
+						CSimpleString msg = CSimpleString::Format("MachineType: %s, find %s, readStr:%s, m_runAd:%d, m_runMain:%d, m_runExtend:%d, m_runLogin:%d, \
+							m_withBrowser:%d, with_min:%d, with_close:%d, m_withDebugMode:%d, m_withMagic:%d, m_withNoFileLog:%d, m_withMedia:%d, m_withSpecialTest:%d, m_withConsole:%d, m_withLinkLog:%d",
+							ConfigManager::getInstance().getSysInfo().strMachineType.GetData(), webMaskKey.GetData(), webMaskStr.GetData(),
+							ConfigManager::getInstance().m_runAd, ConfigManager::getInstance().m_runMain, ConfigManager::getInstance().m_runExtend, 
+							ConfigManager::getInstance().m_runLogin, ConfigManager::getInstance().m_withBrowser, ConfigManager::getInstance().m_withMin,
+							ConfigManager::getInstance().m_withClose, ConfigManager::getInstance().m_withDebugMode, ConfigManager::getInstance().m_withMagic, 
+							ConfigManager::getInstance().m_withNoFileLog, ConfigManager::getInstance().m_withMedia, ConfigManager::getInstance().m_withSpecialTest, 
+							ConfigManager::getInstance().m_withConsole, ConfigManager::getInstance().m_withLinkLog);
+						LogManager::getInstance().logEntityStatus(msg.GetData(), LOG_LEVEL_INFO, 0, "none");
+						/*
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MachineType: %s, find %s, readStr:%s, m_runAd:%d, m_runMain:%d, m_runExtend:%d, m_runLogin:%d, \
 							m_withBrowser:%d, with_min:%d, with_close:%d, m_withDebugMode:%d, m_withMagic:%d, m_withNoFileLog:%d, m_withMedia:%d, m_withSpecialTest:%d, m_withConsole:%d, m_withLinkLog:%d",
 							m_sysInfo.strMachineType.GetData(), webMaskKey.GetData(), webMaskStr.GetData(), m_runAd, m_runMain, m_runExtend, m_runLogin, m_withBrowser
 						,m_withMin, m_withClose, m_withDebugMode, m_withMagic, m_withNoFileLog, m_withMedia, m_withSpecialTest, m_withConsole, m_withLinkLog);
+						*/
+
 						
-						if (m_withMin)
-							CModTools::get_mutable_instance().setWithMin(m_withMin);
-						if (m_withClose)
-							CModTools::get_mutable_instance().setWithClose(m_withClose);
-						
-						g_logToFile = !m_withNoFileLog;
-						g_withMedia = m_withMedia;
-						g_withLinkLog = m_withLinkLog;
 
 
 						int forceCacheClean = false;
@@ -438,32 +438,37 @@ namespace Chromium {
 					else
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("can not find %s, use default", webMaskKey.GetData());
 				}
-				if (!m_runAd && !m_runMain && !m_runExtend && !m_withBrowser)
+				if (!ConfigManager::getInstance().m_runAd &&
+					!ConfigManager::getInstance().m_runMain &&
+					!ConfigManager::getInstance().m_runExtend &&
+					!ConfigManager::getInstance().m_withBrowser)
 				{
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("can not open centerSetting, maybe fault");
 				}
 #ifdef RVC_OS_WIN
-				if (m_withMagic)
+				if (ConfigManager::getInstance().m_withMagic)
 				{
 					std::string magicStr = CModTools::get_mutable_instance().getMagicStr();
 					boost::thread(boost::bind(SaveCefclientLog, magicStr)).detach();
 				}
 #endif
 		}
-		if (m_withSpecialTest)
+		if (ConfigManager::getInstance().m_withSpecialTest)
 		{
 			CSimpleString strPath;
 			GetFunction()->GetPath("Downloads", strPath);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Downloads path %s, ", strPath.GetData());
 		}
+		LogManager::getInstance().logEntityStageChange("OnPreStart_Init", 0, "end");
 	}
 
 	bool CChromiumEntity::OnPreStart_socketStart(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
+		LogManager::getInstance().logEntityStageChange("OnPreStart_socketStart", 0, "begin");
 		ErrorCodeEnum Error;
-		if (Error_Succeed != (Error = GetFunction()->StartTcpBridgeServer(m_iTcpBridgePort)))
+		if (Error_Succeed != (Error = GetFunction()->StartTcpBridgeServer(ConfigManager::getInstance().getTcpBridgePort())))
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start tcp bridge server failed!");
+			LogManager::getInstance().logEntityStageChange("OnPreStart_socketStart", 2, "end", Error_Unexpect, "start tcp bridge server failed!");
 			pTransactionContext->SendAnswer(Error);
 			return false;
 		}
@@ -475,11 +480,13 @@ namespace Chromium {
 		m_pWsServer = new CWebsocketServer(strStructPath, this);
 		m_pWsServer->run();
 
+		LogManager::getInstance().logEntityStageChange("OnPreStart_socketStart", 0, "end");
 		return true;
 	}
 
 	bool CChromiumEntity::OnPreStart_register(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
+		LogManager::getInstance().logEntityStageChange("OnPreStart_register", 0, "begin");
 		ErrorCodeEnum Error;
 
 #if defined(RVC_OS_LINUX)
@@ -491,32 +498,43 @@ namespace Chromium {
         }
 #endif //RVC_OS_LINUX
 
-		if (!m_withBrowser)
+		if (!ConfigManager::getInstance().m_withBrowser)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe AccessAuthorization %s, %d",
-				Error_Succeed == (Error = GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "AccessAuthorization")) ? "success" : "failed", Error);
+			if (Error_Succeed == (Error = GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "AccessAuthorization")))
+				LogManager::getInstance().logEntityStatus("订阅AccessAuthorization消息成功", LOG_LEVEL_INFO, 0, "none");
+			else
+				LogManager::getInstance().logEntityStatus("订阅AccessAuthorization消息失败", LOG_LEVEL_ERROR, 2, "none", Error, "");
+
+
+			if (Error_Succeed == (Error = GetFunction()->SubscribeBroadcast("ResourceWatcher", NULL, this, m_uuidResourceWatch)))
+				LogManager::getInstance().logEntityStatus("订阅ResourceWatcher广播成功", LOG_LEVEL_INFO, 0, "none");
+			else
+				LogManager::getInstance().logEntityStatus("订阅ResourceWatcher广播失败", LOG_LEVEL_ERROR, 2, "none", Error, "");
 
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe ResourceWatcher %s, %d",
-				Error_Succeed == (Error = GetFunction()->SubscribeBroadcast("ResourceWatcher", NULL, this, m_uuidResourceWatch)) ? "success" : "failed", Error);
 
 
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("UIState", this))
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegistSysVarEvent UIState failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("TerminalStage", this))
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegistSysVarEvent TerminalStage failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("CardStoreInUse", this))
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegistSysVarEvent CardStoreInUse failed!");
+
+			if (Error_Succeed != (Error = GetFunction()->RegistSysVarEvent("UIState", this)))
+				LogManager::getInstance().logEntityStatus("订阅消息UIState失败", LOG_LEVEL_ERROR, 2, "none", Error, "RegistSysVarEvent UIState failed!");
+
+			if (Error_Succeed != (Error = GetFunction()->RegistSysVarEvent("TerminalStage", this)))
+				LogManager::getInstance().logEntityStatus("订阅消息TerminalStage失败", LOG_LEVEL_ERROR, 2, "none", Error, "RegistSysVarEvent TerminalStage failed!");
+
+			if (Error_Succeed != (Error = GetFunction()->RegistSysVarEvent("CardStoreInUse", this)))
+				LogManager::getInstance().logEntityStatus("订阅消息CardStoreInUse失败", LOG_LEVEL_ERROR, 2, "none", Error, "RegistSysVarEvent CardStoreInUse failed!");
 		}
 
+		LogManager::getInstance().logEntityStageChange("OnPreStart_register", 0, "end");
 		return true;
 }
 
 	bool CChromiumEntity::OnPreStart_openWeb()
 	{
-		if (m_runExtend)
+		LogManager::getInstance().logEntityStageChange("OnPreStart_openWeb", 0, "begin");
+		if (ConfigManager::getInstance().m_runExtend)
 			openExtendPage();
 
-		if (!m_runMain)//不启动页面
+		if (!ConfigManager::getInstance().m_runMain)//不启动页面
 			return true;
 
 		do
@@ -525,12 +543,13 @@ namespace Chromium {
 			ErrorCodeEnum rc = ErrorCodeEnum::Error_Succeed;
 			if ((rc = GetFunction()->GetSysVar("TerminalStage", t_terminalState)) != ErrorCodeEnum::Error_Succeed)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s read TerminalStage Error %d, maybe not exist", __FUNCTION__, rc);
+				LogManager::getInstance().logEntityStatus("读取TerminalStage失败,可能不存在", LOG_LEVEL_ERROR, 2, "none", rc, "");
+				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s read TerminalStage Error %d, maybe not exist", __FUNCTION__, rc);
 				break;
 			}
 		    else if ('A' != t_terminalState[0] &&  'Z' != t_terminalState[0])
 			{
-				if (m_withBrowser)
+				if (ConfigManager::getInstance().m_withBrowser)
 					break;//run IEBrowser
 				if ('X' == t_terminalState[0])
 				{
@@ -540,35 +559,38 @@ namespace Chromium {
 				else if ('S' == t_terminalState[0])
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::warnPrompt,
-						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page warnPrompt %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page warnPrompt %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
 				else if ('M' == t_terminalState[0])
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::audioErr,
-						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page audioErr %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page audioErr %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
 				else
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown,
-						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page breakdown %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page breakdown %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
+				LogManager::getInstance().logEntityStageChange("OnPreStart_openWeb", 1, "end", Error_Unexpect
+					, CSimpleString::Format("terminalStage is %s, access failed", t_terminalState.GetData()).GetData());
+				return true;
 			}
 			else
 			{
-				if (m_runAd) openAdPage();
+				if (ConfigManager::getInstance().m_runAd) openAdPage();
 				openMainPage();
 #if (defined _WIN32 || defined _WIN64)
-				if (m_withDebugMode)
+				if (ConfigManager::getInstance().m_withDebugMode)
 					getNetworkInfo(L"127.0.0.1:9222", L"", &DbgByCefControl);
 #endif
 			}
 		} while (false);
 		
 
-
+		LogManager::getInstance().logEntityStageChange("OnPreStart_openWeb", 0, "end");
 		return true;
 	}
 
@@ -588,37 +610,29 @@ namespace Chromium {
 	void CChromiumEntity::openAdPage()
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Ad);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page Ad %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::Ad)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 	void CChromiumEntity::openExtendPage()
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::extend);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page extend %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::extend)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 
 	void CChromiumEntity::openInstallPage()
 	{
-		/*
-		LogWarn(Severity_Middle, Error_NotSupport, LOG_WARN_CHROMIUM_INSTALL_NOTSURPORT,
-			CSimpleStringA::Format("Not surport install mode").GetData());
-		return;
-		*/
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Install);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page install %s, pid:%d",
-			Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::Install)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 
 	void CChromiumEntity::openStartupPage()
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::startup);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page startup %s, pid:%d",
-			Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::startup)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 	void CChromiumEntity::openPerformanceMonitorPage() 
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::performance_monitor);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page performance_monitor %s, pid:%d",
-			Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::performance_monitor)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 
 
@@ -635,9 +649,9 @@ namespace Chromium {
 #if (defined _WIN32 || defined _WIN64)
 			if (m_strArgs.GetCount())
 			{
-				if (!m_strCustomMainUrl.IsNullOrEmpty())
+				if (ConfigManager::getInstance().m_strCustomMainUrl.length() > 0)
 					openMainPage();
-				if (!m_strCustomAdUrl.IsNullOrEmpty())
+				if (ConfigManager::getInstance().m_strCustomAdUrl.length() > 0)
 					openAdPage();
 				return;
 			}
@@ -648,7 +662,6 @@ namespace Chromium {
 		}
 		else
 		{
-			
 			openInstallPage();
 			LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_INSTALLPAGE, CSimpleStringA::Format("open install page"));
 		}
@@ -662,7 +675,11 @@ namespace Chromium {
 		if (Error_Succeed == GetFunction()->OpenConfig(Config_Cache, chromiumCfg))
 			chromiumCfg->ReadConfigValueInt("Run", "no_startup", noStartup);
 
-		m_noStartupPage = (noStartup == 1);
+		ConfigManager::getInstance().m_noStartupPage = (noStartup == 1);
+
+		LogManager::getInstance().logEntityBegin(noStartup);
+
+		setReduceSpbaseLog(0);
 
 
 #if defined(RVC_OS_LINUX)
@@ -704,8 +721,8 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnPreStart - startFun");
 			// init cef logger first
 #if (defined _WIN32 || defined _WIN64)
-			if (!logProducer)
-				logProducer = create_log_producer_storage("cefclient_logger", "0", "", "", "");
+			if (nullptr == ConfigManager::getInstance().getLogProducer())
+				ConfigManager::getInstance().setLogProducer(create_log_producer_storage("cefclient_logger", "0", "", "", ""));
 #else
 			CSimpleString dbgPath;
 			GetFunction()->GetPath("Dbg", dbgPath);
@@ -718,19 +735,19 @@ namespace Chromium {
 			if (!OnPreStart_socketStart(m_strArgs, m_pTransactionContext)) {//OnPreStart_socketStart()->new CWebsocketServer(strStructPath, this) 时间过长
 				return;
 			}
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnPreStart - OnPreStart_socketStartF end");
-
 
 			//the system info may be not complete.If the device is not install ,it can't not read the terminalNo.
 			CSystemStaticInfo t_sysInfo;
 			GetFunction()->GetSystemStaticInfo(t_sysInfo);
 			if (t_sysInfo.strTerminalID.GetLength() == 0)// the machine is in install mode, hence start a simple init and open the install page 
 			{
-				if(!m_noStartupPage) openStartupPage();//open startup page in install mode
-				m_installMode = true;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe VtmLoader %s",
-					(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open install page");
+				if(!ConfigManager::getInstance().m_noStartupPage) openStartupPage();//open startup page in install mode
+				ConfigManager::getInstance().m_installMode = true;
+				ErrorCodeEnum rc = Error_Succeed;
+				if (Error_Succeed == (rc = GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")))
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader消息成功", LOG_LEVEL_INFO, 0, "none");
+				else
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader消息失败", LOG_LEVEL_ERROR, 2, "none", rc, "");
 
 				//if in install mode, need clear 
 				CSimpleString tmpCacheDir;
@@ -751,8 +768,8 @@ namespace Chromium {
 					{
 						LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_CACHE_CLEAER, CSimpleStringA::Format("clear chromium browser cache %s %s", it.c_str(),
 							RemoveDirRecursive(it.c_str()) ? "success" : "fail"));
-		}
-	};
+					}
+				};
 				runCacheClean(tmpDirArr);
 
 #else
@@ -805,7 +822,7 @@ namespace Chromium {
 				if (Error_Succeed == ret)
 					InitUserCodeToMsgTip(strErrorCodeArr, strDescriptionArr, strRemarkArr);
 
-				if (m_withSpecialTest)
+				if (ConfigManager::getInstance().m_withSpecialTest)
 				{
 					CSimpleStringA strDescription, strVTMCode;
 					GetFunction()->GetVTMErrMsg(123456, strDescription, strVTMCode);
@@ -816,9 +833,12 @@ namespace Chromium {
 			}
 			else
 			{
-				if (!m_noStartupPage) openStartupPage();//open startup page in normal mode
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe VtmLoader %s",
-					(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
+				if (!ConfigManager::getInstance().m_noStartupPage) openStartupPage();//open startup page in normal mode
+				ErrorCodeEnum rc = Error_Succeed;
+				if (Error_Succeed == (rc = GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")))
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader成功", LOG_LEVEL_INFO, 0, "none");
+				else
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader失败", LOG_LEVEL_ERROR, 2, "none", rc, "");
 			}
 				
 		};
@@ -868,7 +888,7 @@ namespace Chromium {
 	}
 
 	bool CChromiumEntity::CheckIsCardStore() {
-		return m_sysInfo.strMachineType.IsEndWith("CardStore", true) || m_sysInfo.strMachineType.IsEndWith("CardPrinter", true);
+		return ConfigManager::getInstance().getSysInfo().strMachineType.IsEndWith("CardStore", true) || ConfigManager::getInstance().getSysInfo().strMachineType.IsEndWith("CardPrinter", true);
 	}
 
 	void CChromiumEntity::DoWithSysVarEvent()
@@ -876,14 +896,14 @@ namespace Chromium {
 		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create thread:%s", __FUNCTION__);
 		while (true)
 		{
-			if (m_eventArr.size() == 0)
+			if (ConfigManager::getInstance().m_eventArr.size() == 0)
 			{
 				boost::this_thread::sleep_for(boost::chrono::microseconds(100));
 				continue;
 			}
 			m_eventContorl.lock();
-			SYS_EVENT_PARAM curEvent = m_eventArr.front();
-			m_eventArr.pop_front();
+			SYS_EVENT_PARAM curEvent = ConfigManager::getInstance().m_eventArr.front();
+			ConfigManager::getInstance().m_eventArr.pop_front();
 			m_eventContorl.unlock();
 			if ((strnicmp(curEvent.key.c_str(), "UIState", strlen("UIState")) == 0))
 			{
@@ -914,7 +934,7 @@ namespace Chromium {
 							auto srcPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
 #endif // RVC_OS_UOS
 
-							if (m_runAd) openAdPage();
+							if (ConfigManager::getInstance().m_runAd) openAdPage();
 							openMainPage();
 							CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown);
 
@@ -947,7 +967,7 @@ namespace Chromium {
 				{
 					try
 					{
-						if (!m_withBrowser)
+						if (!ConfigManager::getInstance().m_withBrowser)
 						{
 #if defined(RVC_OS_LINUX)
 							auto srcPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
@@ -972,7 +992,7 @@ namespace Chromium {
 								reson = ERR_PAGE_REASON::audioErr;
 
 							auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(reson, 
-								std::tuple < std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+								std::tuple < std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
 							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open err page %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 							CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::main);
 						}
@@ -991,7 +1011,7 @@ namespace Chromium {
 					if (0 == CSimpleStringA("Y").Compare(curEvent.value.c_str(), true))
 					{
 						auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::CardStoreIsBusy,
-							std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+							std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CardStoreIsBusy, open page CardStoreIsBusy %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 					}
 					else
@@ -1027,7 +1047,7 @@ namespace Chromium {
 		curEvent.oldValue = std::string(pszOldValue);
 		curEvent.entityName = std::string(pszEntityName);
 		boost::unique_lock<boost::mutex> eventArrLock(m_eventContorl);
-		m_eventArr.push_back(curEvent);
+		ConfigManager::getInstance().m_eventArr.push_back(curEvent);
 
 	}
 
@@ -1067,11 +1087,11 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("strArgs[%d] = %s", i, strArgs[i].GetData());
         }
         if (ArgsCount == 1) {
-            m_strCustomMainUrl = strArgs[0];
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s", m_strCustomMainUrl.GetData());
-			if (!m_strCustomMainUrl.IsNullOrEmpty()) {
+			ConfigManager::getInstance().m_strCustomMainUrl = strArgs[0].GetData();
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s", ConfigManager::getInstance().m_strCustomMainUrl.c_str());
+			if (!ConfigManager::getInstance().m_strCustomMainUrl.length() > 0) {
                 LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_DETECT_CUSTOM_FULTURE_URL_FROM_START,
-						CSimpleStringA::Format("从模块入参获取自定义链接:%s", m_strCustomMainUrl.GetData()));
+						CSimpleStringA::Format("从模块入参获取自定义链接:%s", ConfigManager::getInstance().m_strCustomMainUrl.c_str()));
 			}
 		} else {
             CSmartPointer<IConfigInfo> pConfig;
@@ -1082,11 +1102,12 @@ namespace Chromium {
 			if (cnt > 0 && currentUsing > 0) {
 				CSimpleStringA strAdUrl(true);
                 CSimpleStringA strSection = CSimpleStringA::Format("CustomWebUrl%d", currentUsing);
-                pConfig->ReadConfigValue(strSection, "FultureUrl", m_strCustomMainUrl);
+				CSimpleString t_mainUrl = ConfigManager::getInstance().m_strCustomMainUrl.c_str();
+                pConfig->ReadConfigValue(strSection, "FultureUrl", t_mainUrl);
                 pConfig->ReadConfigValue(strSection, "AdUrl", strAdUrl);
-				if (!m_strCustomMainUrl.IsNullOrEmpty()) {
+				if (!t_mainUrl.IsNullOrEmpty()) {
                     LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_DETECT_CUSTOM_FULTURE_URL_FROM_CONFIG,
-							CSimpleStringA::Format("从本地维护桌面获取自定义链接:%s", m_strCustomMainUrl.GetData()));
+							CSimpleStringA::Format("从本地维护桌面获取自定义链接:%s", t_mainUrl.GetData()));
 				}
 			}
 		}
@@ -1097,19 +1118,25 @@ namespace Chromium {
 		const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
 		const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
 	{
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnLog %x from entity %s, msg : %s", dwUserCode, NULL == pszEntityName ? "" : pszEntityName, NULL == pszMessage ? "" : pszMessage);
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnLog %x from entity %s, msg : %s", dwUserCode, NULL == pszEntityName ? "" : pszEntityName, NULL == pszMessage ? "" : pszMessage);
 		switch (dwUserCode)
 		{
 		case Event_VtmLoader_GetConfig_Suc:
-			g_hasInitCfg = true;
+			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetConfig_Suc",
+				0, "none", Error_Succeed, "setHasInitCfg");
+			ConfigManager::getInstance().setHasInitCfg(true);
 		case Event_VtmLoader_GetConfig_Fail:
 			refreshLogLevel();//后置后需要刷新log level,因为chromium是先启动的实体
-			if (m_installMode)//Do not init Entity again in install mode
+			if (ConfigManager::getInstance().m_installMode)//Do not init Entity again in install mode
 				break;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open error or normal page");
+			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open error or normal page");
+			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetConfig_Suc",
+				0, "openPage", Error_Succeed, "startWithCfg:open error or normal page");
 			startWithCfg();//open errPage or normal page
 			break;
 		case Event_VtmLoader_GetVTMERRMSG_Suc:
+			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",
+				0, "none");
 			/*
 				CSimpleString translatePath;
 				GetFunction()->GetPath("Cfg", translatePath);
@@ -1119,9 +1146,10 @@ namespace Chromium {
 			*/
 			if (!GetFunction()->HasPrivilege())
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no privilege");
+				LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",
+					2, "none", Error_NoPrivilege, "no privilege");
 				break;
-		}
+			}
 			{
 				CAutoArray<CSimpleStringA> strErrorCodeArr;
 				CAutoArray<CSimpleStringA> strDescriptionArr;
@@ -1130,9 +1158,14 @@ namespace Chromium {
 				if (Error_Succeed == ret)
 					InitUserCodeToMsgTip(strErrorCodeArr, strDescriptionArr, strRemarkArr);
 				else
-					LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHROMIUM_VTMUSERMSG_ERR, CSimpleStringA::Format("GetVTMErrMsgArr err:%d", ret));
+				{
+					CSimpleString warnMsg = CSimpleStringA::Format("GetVTMErrMsgArr err:%d", ret);
+					LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHROMIUM_VTMUSERMSG_ERR, warnMsg.GetData());
+					LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",
+						2, "none", Error_Bug, warnMsg.GetData());
+				}
 
-				if (m_withSpecialTest)
+				if (ConfigManager::getInstance().m_withSpecialTest)
 				{
 					CSimpleStringA strDescription, strVTMCode;
 					GetFunction()->GetVTMErrMsg(123456, strDescription, strVTMCode);
@@ -1181,7 +1214,7 @@ namespace Chromium {
 
 		CModTools::get_mutable_instance().unlockGuard();
 		/*
-		if (m_runAd)
+		if (ConfigManager::getInstance().m_runAd)
 		{
 			CModTools::get_mutable_instance().m_isAdOpen = false;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnBrowserCacheClean open add page");
@@ -1208,7 +1241,7 @@ namespace Chromium {
 			delete m_pTimerListener;
 			m_pTimerListener = NULL;
 		}
-		if(!m_installMode)
+		if(!ConfigManager::getInstance().m_installMode)
 			OnPreStart_openWeb();//重新调用open web
 
 #endif 

+ 7 - 56
Module/mod_chromium/mod_chromium.h

@@ -41,42 +41,6 @@ namespace Chromium {
 	#define BROWSER_TIMER_ID 0xF002
 	#define BROWSER_TIMER_INTERVAL 3600000
 
-	struct SYS_EVENT_PARAM
-	{
-		std::string key;
-		std::string value;
-		std::string oldValue;
-		std::string entityName;
-
-		// 默认构造函数
-		SYS_EVENT_PARAM() = default;
-
-		// 带参数的构造函数
-		SYS_EVENT_PARAM(const std::string& k, const std::string& v, const std::string& ov, const std::string& en)
-			: key(k), value(v), oldValue(ov), entityName(en) {}
-
-		// 拷贝构造函数
-		SYS_EVENT_PARAM(const SYS_EVENT_PARAM& other)
-			: key(other.key), value(other.value), oldValue(other.oldValue), entityName(other.entityName) {}
-
-		// 拷贝赋值运算符
-		SYS_EVENT_PARAM& operator=(const SYS_EVENT_PARAM& other) {
-			if (this != &other) {
-				key = other.key;
-				value = other.value;
-				oldValue = other.oldValue;
-				entityName = other.entityName;
-			}
-			return *this;
-		}
-
-		// 禁用移动构造函数
-		SYS_EVENT_PARAM(SYS_EVENT_PARAM&&) = delete;
-
-		// 禁用移动赋值运算符
-		SYS_EVENT_PARAM& operator=(SYS_EVENT_PARAM&&) = delete;
-	};
-
 
 	class CChromiumEntity;
 
@@ -123,13 +87,13 @@ namespace Chromium {
 		//void CefClintNotify();
 		void exitClean();
 		void FetchCustomMainUrl(CAutoArray<CSimpleStringA>& strArgs);
-		bool HasCustomMainUrl() const { return !m_strCustomMainUrl.IsNullOrEmpty(); }
-		const char* GetCustomMainUrl()  const { return m_strCustomMainUrl; }
-		bool HasCustomAdUrl() const { return !m_strCustomAdUrl.IsNullOrEmpty(); }
-		const char* GetCustomAdUrl()  const { return m_strCustomAdUrl; }
+		bool HasCustomMainUrl() const { return ConfigManager::getInstance().m_strCustomMainUrl.length() > 0; }
+		const char* GetCustomMainUrl()  const { return ConfigManager::getInstance().m_strCustomMainUrl.c_str(); }
+		bool HasCustomAdUrl() const { return ConfigManager::getInstance().m_strCustomAdUrl.length() > 0; }
+		const char* GetCustomAdUrl()  const { return ConfigManager::getInstance().m_strCustomAdUrl.c_str(); }
 		bool IsConfigMode()
 		{
-			return m_installMode;
+			return ConfigManager::getInstance().m_installMode;
 		}
 
 	private:
@@ -149,31 +113,18 @@ namespace Chromium {
 		bool CheckIsCardStore();
 
 	private:
-		CSystemStaticInfo m_sysInfo;
 		CWebsocketServer* m_pWsServer;
 		ITimerListener* m_pTimerListener, * pBusinessLimitTimerListener;//浏览器监控Timer,业务禁用Timer
-		int m_iTcpBridgePort;
 		HANDLE m_hIOCP;
 		HANDLE m_hThreadIOCP;
-		CSimpleStringA m_strCustomMainUrl, m_strCustomAdUrl;
-		bool m_runAd/*广告*/, m_runMain/*业务*/, m_runExtend/*低柜副屏*/, m_runLogin/*用户桌面,可能木有用*/, m_withBrowser/*是否需要与browser交互*/;
-		bool m_withDebugMode/*是否启动debug模式*/, m_withMagic/*启用随机共享内存*/, m_withNoFileLog/*是否不需要本地日志落盘*/, m_withMedia/*开启多媒体选项*/;
-		bool m_withUnsafeAd/*Ad页面忽略安全选项*/;
-		bool m_withConsole;
-		bool m_withSpecialTest/*开启一些终端功能的测试*/, m_withLinkLog/*开启链路中的中间链路日志*/;
-		bool m_withMin, m_withClose, m_installMode;
-		std::deque<SYS_EVENT_PARAM> m_eventArr;
-		//boost::container::deque<SYS_EVENT_PARAM> m_eventArr;
+
 		boost::mutex m_eventContorl, m_eventConditionMu; //sysvarEvent变化时阻塞修改
 		boost::mutex m_commonPageLock;//
 		boost::condition_variable_any m_eventCondition;//满足有数据时激活线程
 		CAutoArray<CSimpleStringA> m_strArgs;
 		CSmartPointer<ITransactionContext> m_pTransactionContext;
-		bool m_noStartupPage;
 		
-#ifdef RVC_OS_LINUX
-		std::map<std::string, std::vector<int>> m_commonPageArr;
-#endif
+		
 	public:
 		boost::timed_mutex m_firstStartMain;//首次启动主页
 		int getBrowserStartTimes();

+ 7 - 4
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -185,16 +185,19 @@ DWORD checkUrlActive(LPVOID param)
 	{
 		if (entityInfo->m_uploadLogInfo_waitSec <= 0)
 			break;
-		Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
 		unsigned long t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc;
 		unsigned long t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err;
+		unsigned long t_discard_full, t_discard_RTI1002, curLogNum;
 		entityInfo->GetEntityBase()->GetFunction()->GetPrivilegeFunction()->GetSendLogInfo(&t_upload_TerminalSys_Suc, &t_upload_TerminalUser_Suc,
 			&t_upload_BussinessSys_Suc, &t_upload_BussinessUser_Suc, &t_upload_beidou_Suc,
-			&t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err);
+			&t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err,
+			&t_discard_full, &t_discard_RTI1002, &curLogNum);
 		LogWarn(SeverityLevelEnum::Severity_Low, Error_Trace, WARN_SendEndpoint_LOG_INFO,
-			CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d"
+			CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
 				, t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
-				t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err).GetData());
+				t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err
+			, t_discard_full, t_discard_RTI1002, curLogNum).GetData());
+		Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
 	}
 	return 0;
 }