Browse Source

Merge branch 'ST2_0904_thirdparty_uploadLogs' into feture_hsps_gpio

chenliangyu 1 year ago
parent
commit
5a57d4f014

+ 6 - 6
CMakeSettings.json

@@ -22,9 +22,9 @@
       "ctestCommandArgs": "--output-on-failure",
       "inheritEnvironments": [ "linux_arm" ],
       "remoteMachineName": "${defaultRemoteMachineName}",
-      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src",
-      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}",
-      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}",
+      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/src",
+      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/out/build/${name}",
+      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/out/install/${name}",
       "remoteCopySources": true,
       "rsyncCommandArgs": "-t --delete --delete-excluded --exclude \"/build\" --exclude \"/out\" --exclude-from=.gitignore",
       "remoteCopyBuildOutput": false,
@@ -61,9 +61,9 @@
         }
       ],
       "remoteMachineName": "${defaultRemoteMachineName}",
-      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src",
-      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}",
-      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}",
+      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/src",
+      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/out/build/${name}",
+      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/out/install/${name}",
       "remoteCopySources": true,
       "rsyncCommandArgs": "-t --delete --delete-excluded --exclude \"/build\" --exclude \"/out\" --exclude-from=.gitignore",
       "remoteCopyBuildOutput": false,

+ 51 - 0
Framework/Common/SpDefine.h

@@ -0,0 +1,51 @@
+
+
+class SpDefine
+{
+private:
+	SpDefine() = delete;
+public:
+	//update token params
+#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+	static constexpr const char* channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
+	static constexpr const char*  tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
+	static constexpr const char*  CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn";
+	static constexpr const char*  CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
+	static constexpr const char* endpoint_env = "https://kafkaproxy.paasst.cmbchina.cn/api/kafka/log/send";
+#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+	static constexpr const char*  channelId = "7eb748cb71744c87b5c126e05af8cce7";
+	static constexpr const char*  tokenSecret = "eca529c78967c640561bd844229391c8a78af3";
+	static constexpr const char*  CommonLaunchUrl = "https://rvc-gateway.paasuat.cmbchina.cn";
+	static constexpr const char*  CenterConfigTotal = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig";
+	static constexpr const char* endpoint_env = "https://kafkaproxy.paasuat.cmbchina.cn/api/kafka/log/send";
+#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
+	static constexpr const char*  channelId = "572f7577fa9f425c8475a8d77db4ae31";
+	static constexpr const char*  tokenSecret = "eca129c78767c670561bd844629361c8a78af3";
+	static constexpr const char*  CommonLaunchUrl = "https://rvc-gateway.paas.cmbchina.cn";
+	static constexpr const char*  CenterConfigTotal = "https://accessproxy-service.paas.cmbchina.cn/centerconfig";
+	static constexpr const char* endpoint_env = "https://kafkaproxy.paas.cmbchina.cn/api/kafka/log/send";
+#else/*本地编译等非DevOps环境编译的版本*/
+	static constexpr const char*  channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
+	static constexpr const char*  tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
+	static constexpr const char*  CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn";
+	static constexpr const char*  CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
+	static constexpr const char* endpoint_env = "https://kafkaproxy.paasst.cmbchina.cn/api/kafka/log/send";
+#endif
+
+	//default endpoint and topic
+	static constexpr const char* endpoint = "https://kafkaproxy.paas.cmbchina.cn/api/kafka/log/send";
+	static constexpr const char* topicSys = "LR18_23_VTMTerminalLogService_L_sys_VTMTerminalSysLog_SRC_SZ";
+	static constexpr const char* topicUser = "LR18_23_VTMTerminalLogService_L_biz_VTMTerminalUserLog_SRC_SZ";
+	static constexpr const char* topicBeidou = "LR18_23_VTMTerminalLogService_L_trace_VTMTerminalTraceLog_SRC_SZ";
+	static constexpr const char* topicBussSys = "LR18_23_VTMTerminalLogService_L_sys_VTMBusiness_SRC_SZ";
+	static constexpr const char* topicBussUser = "LR18_23_VTMTerminalLogService_L_biz_VTMBusiness_SRC_SZ";
+	static constexpr const char* topicVTMWeb = "LR18_23_VTMWebSDKUserLog";
+
+	//const log params
+	static constexpr const char* cmptId = "LR04";
+	static constexpr const char* CmptName = "FrameworkLib";
+	static constexpr const char* deployUnitId = "LR04.02@FrameworkLib_PRD_PRD";
+	static constexpr const char* serviceUnitId = "LR04.02_FrameworkLib";
+
+
+};

+ 1 - 0
Framework/spbase/SpBase.cpp

@@ -667,6 +667,7 @@ extern "C" SPBASE_API int __stdcall SpRun(const char *mod_name, int epid, int ra
 		curModule = NULL;
 		goto on_error;
 	}
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("init moudle succ.");
 #else
 	g_module = new SpModule(mod, cfg_mod);
 	hModule = LoadModuleLibrary(mod);

+ 5 - 2
Framework/spbase/sp_mod.c

@@ -1811,7 +1811,8 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 			int state = BUS_STATE_OFF;
 			rc = sp_svc_get_state(mgr->shell_svc, mod->cfg->idx, &state);
 			WLog_DBG(TAG, "cfg::idx: %d, state: %d", mod->cfg->idx, state);
-			if (rc == 0) {
+			if (rc == 0) 
+			{
 				if (state != BUS_STATE_ON) {
 					DWORD dwRet;
 					dwRet = WaitForSingleObject(mod->process.handle, (DWORD)interval);	//wait for entity thread end
@@ -1824,7 +1825,9 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 					DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "mod is online now!, %s", mod->cfg->name);
 					break;
 				}
-			} else {
+			} 
+			else 
+			{
 				DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "get epid state failed!");
 				break;
 			}

+ 3 - 9
Framework/spshell/app.cpp

@@ -24,6 +24,7 @@
 #include "SpBase.h"
 #include "sp_dbg_export.h"
 #include "sp_gui.h"
+#include "SpDefine.h"
 
 #ifdef realloc
 	#undef realloc //(p, s)
@@ -850,17 +851,10 @@ void app_upload_last_log()
     if (env && env->cfg && env->cfg->root_ini && env->cfg->root_ini->terminal_no)
         t_terminalNo = env->cfg->root_ini->terminal_no;
 
-    const char* endpoint = "https://kafkaproxy.paas.cmbchina.cn/api/kafka/log/send";
-    const char* topicSys = "LR18_23_VTMTerminalLogService_L_sys_VTMTerminalSysLog_SRC_SZ";
-    const char* topicUser = "LR18_23_VTMTerminalLogService_L_biz_VTMTerminalUserLog_SRC_SZ";
-    const char* topicBeidou = "LR18_23_VTMTerminalLogService_L_trace_VTMTerminalTraceLog_SRC_SZ";
-    const char* topicBussSys = "LR18_23_VTMTerminalLogService_L_sys_VTMBusiness_SRC_SZ";
-    const char* topicBussUser = "LR18_23_VTMTerminalLogService_L_biz_VTMBusiness_SRC_SZ";
-	const char* topicVTMWeb = "LR18_23_VTMWebSDKUserLog";
-
 	char dstVer[SP_MAX_VER_LEN] = "";
 	auto ret = sp_cfg_getVer(dstVer);
 	if (ret != Error_Succeed)
 		sprintf_s(dstVer, SP_MAX_VER_LEN, "Unknown");
-    create_log_producer_send(endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser, topicVTMWeb, t_terminalNo, dstVer, "", 100);
+    create_log_producer_send(SpDefine::endpoint, SpDefine::topicSys, SpDefine::topicUser, SpDefine::topicBeidou,
+		SpDefine::topicBussSys, SpDefine::topicBussUser, SpDefine::topicVTMWeb, t_terminalNo, dstVer, "", 100);
 }

+ 10 - 4
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -612,6 +612,8 @@ bool CHealthManagerEntity::StartGuardian()
 
 	//oiltmp TODO 如果是未安装,不启动guardian
 	//root.ini 不存在,表示未安装
+	CSystemStaticInfo staticInfo;
+	GetFunction()->GetSystemStaticInfo(staticInfo);
 
 	/** 添加日志控制逻辑 Gifur@202414]*/
 	SP::Module::Comm::Settings::InitializeOtherLogSwitch(this, "guardian");
@@ -641,8 +643,12 @@ bool CHealthManagerEntity::StartGuardian()
 		}
 
 	}
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("guardian path[%s]", csBinPath.GetData());
-	csAll = csSep +  csBinPath + csSep;
+
+	csAll = csSep + csBinPath + csSep + " " + staticInfo.strTerminalID;//add terminalno to guardian
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("guardian path[%s], run script[%s]", csBinPath.GetData(), csAll.GetData());
+	
+	
 	LPTSTR szCmdline = _strdup(csAll);
 	if( !CreateProcessA( NULL,szCmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) 
 	{
@@ -657,8 +663,8 @@ bool CHealthManagerEntity::StartGuardian()
 	tk_process_t* process = NULL;
 	tk_process_option_t option;
 	csBinPath += "/guardian";
-	Dbg("path:%s", (const char*)csBinPath);
-	sprintf(app, "%s %s %d", (const char*)csBinPath, "oiltest", 1);
+	sprintf(app, "%s %s %s %d", (const char*)csBinPath, staticInfo.strTerminalID.GetData(), "oiltest", 1);
+	Dbg("path:%s, app:%s", (const char*)csBinPath, (const char*)app);
 	option.exit_cb = NULL;
 	option.file = NULL;
 	option.flags = 0;

+ 8 - 36
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -22,6 +22,7 @@
 #include "../mod_ContactlessCard/ContactlessCard_client_g.h"
 #include "../mod_FingerPrint/FingerPrint_client_g.h"
 #include "../mod_gpio/Gpio_client_g.h"
+#include "SpDefine.h"
 
 using namespace HealthManager;
 using namespace PinPad;
@@ -73,15 +74,15 @@ DWORD tokenUpdate(void* param)
 		if (elapsedTime >= (t_entity->m_refreshWaitSec * 1000))
 		{
 			// 如果距离上次更新时间已经超过了指定的刷新间隔
-		if (t_entity->refreshToken())
+			if (t_entity->refreshToken())
 			{
 				// 更新成功,更新上次更新时间
 				lastUpdateTime = currentTime;
 			}
-		else
+			else
 			{
 				// 更新失败,可以处理一些错误逻辑
-	}
+			}
 		}
 
 		// 等待一段时间后再次检查
@@ -1645,29 +1646,8 @@ bool CVtmLoaderFSM::GetConfig()
 		return false;
 	}
 	ErrorCodeEnum eErr = Error_Succeed;
-#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
-	CSimpleString channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
-	CSimpleString tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
-	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn";
-	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
-#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
-	CSimpleString channelId = "7eb748cb71744c87b5c126e05af8cce7";
-	CSimpleString tokenSecret = "eca529c78967c640561bd844229391c8a78af3";
-	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasuat.cmbchina.cn";
-	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig";
-#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
-	CSimpleString channelId = "572f7577fa9f425c8475a8d77db4ae31";
-	CSimpleString tokenSecret = "eca129c78767c670561bd844629361c8a78af3";
-	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paas.cmbchina.cn";
-	CSimpleString CenterConfigTotal = "https://accessproxy-service.paas.cmbchina.cn/centerconfig";
-#else/*本地编译等非DevOps环境编译的版本*/
-	CSimpleString channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
-	CSimpleString tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
-	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn";
-	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
-#endif
 	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始拉取配置");
-	VTMInitParam vtmInitParam(m_terminalNoFromWeb.GetData(), channelId, tokenSecret, CommonLaunchUrl, CenterConfigTotal);
+	VTMInitParam vtmInitParam(m_terminalNoFromWeb.GetData(), SpDefine::channelId, SpDefine::tokenSecret, SpDefine::CommonLaunchUrl, SpDefine::CenterConfigTotal);
 	if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->InitCfgUrl(vtmInitParam)))
 	{
 		LogWarn(Severity_High, Error_Unexpect, VtmLoader_GetConfig_InitCfgUrl_Failed, CSimpleStringA::Format("拉取配置,初始化配置地址失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
@@ -1699,8 +1679,6 @@ bool CVtmLoaderFSM::GetConfig()
 	refreshLogLevel();
 
 
-
-
 	//all cfg is ready, then init the entity
 
 	eErr = SubscribeEntitysEvents();
@@ -1740,16 +1718,10 @@ bool CVtmLoaderFSM::GetConfig()
 	}
 	else
 	{
-		const char* default_endpoint = "https://kafkaproxy.paas.cmbchina.cn/api/kafka/log/send";
-		const char* topicSys = "LR18_23_VTMTerminalLogService_L_sys_VTMTerminalSysLog_SRC_SZ";
-		const char* topicUser = "LR18_23_VTMTerminalLogService_L_biz_VTMTerminalUserLog_SRC_SZ";
-		const char* topicBeidou = "LR18_23_VTMTerminalLogService_L_trace_VTMTerminalTraceLog_SRC_SZ";
-		const char* topicBussSys = "LR18_23_VTMTerminalLogService_L_sys_VTMBusiness_SRC_SZ";
-		const char* topicBussUser = "LR18_23_VTMTerminalLogService_L_biz_VTMBusiness_SRC_SZ";
-		const char* topicVTMWeb = "LR18_23_VTMWebSDKUserLog";
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read endpoint and topic err, need check centersetting, use default %s-%s-%s-%s-%s-%s-%s"
-			, default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser, topicVTMWeb);
-		GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser, topicVTMWeb);
+			, SpDefine::endpoint, SpDefine::topicSys, SpDefine::topicUser, SpDefine::topicBeidou, SpDefine::topicBussSys, SpDefine::topicBussUser, SpDefine::topicVTMWeb);
+		GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(SpDefine::endpoint, SpDefine::topicSys, SpDefine::topicUser, SpDefine::topicBeidou,
+			SpDefine::topicBussSys, SpDefine::topicBussUser, SpDefine::topicVTMWeb);
 	}
 
 	

+ 1 - 0
Other/CMakeLists.txt

@@ -22,6 +22,7 @@ macro(deploy_others _module_prefix _module_name)
     set_property(TARGET ${_module_name} PROPERTY FOLDER "other/")
 
 endmacro(deploy_others)
+add_definitions(-DRVC_VERSION_STR="${RVC_VERSION}")
 
 add_subdirectory(libpublicFun)
 add_subdirectory(acmstrdec)

+ 7 - 0
Other/libRestfulFunc/RestfulFunc.h

@@ -217,9 +217,16 @@ private:
     restFul_GetTokenCallBack g_tokenCall;
     void InitGetToken(restFul_GetTokenCallBack t_getToken) {
         if (t_getToken)
+        {
+            m_withToken = true;
             g_tokenCall = t_getToken;
+        }            
         else
+        {
+            m_withToken = false;
             g_tokenCall = nullptr;
+        }
+            
 
         
     };

+ 7 - 2
Other/liblog4rvcother/CMakeLists.txt

@@ -13,17 +13,22 @@ set(${MODULE_PREFIX}_SRCS
     log4link.cpp
     )
 
+add_definitions(-DUSE_SKYEYELOG)
 
+#set(CMAKE_CXX_FLAGS "${CMAK_CXX_FLAGS} -g3")
 add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
 target_include_directories(${MODULE_NAME} 
     PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
-    PRIVATE ${RVC_COMMON_INCLUDE_DIR})
+    PRIVATE ${RVC_COMMON_INCLUDE_DIR}
+    ${OTHER_LIB_BASE_DIR}/libpublicFun
+    ${CONAN_INCLUDE_DIRS_JSONCPP})
+target_link_directories(${MODULE_NAME} PRIVATE ${CONAN_LIB_DIRS_JSONCPP})
 set_target_properties(${MODULE_NAME} PROPERTIES COMPILE_DEFINITIONS "LIBLOG4RVCOTHER_EXPORTS")
 set_target_properties(${MODULE_NAME} PROPERTIES DEBUG_POSTFIX "d")
 
 if(MSVC)
     list(APPEND OTHER_LIBS Psapi)
 endif(MSVC)
-target_link_libraries(${MODULE_NAME} CONAN_PKG::log4cplus ${OTHER_LIBS})
+target_link_libraries(${MODULE_NAME} CONAN_PKG::log4cplus ${OTHER_LIBS} libpublicFun ${CONAN_PKG_LIBS_JSONCPP})
 
 deploy_others(${MODULE_PREFIX} ${MODULE_NAME})

+ 18 - 0
Other/liblog4rvcother/log4cplus_helper.cpp

@@ -2,14 +2,18 @@
 #include <iostream>
 #include <string>
 #include <string.h>
+#include <mutex>
 
 #include "log4link.h"
+#include "exLog/skyeyeLog.h"
 
 #if defined(_WIN32) && defined (LOG4CPLUS_HAVE_WIN32_CONSOLE)
 #include <log4cplus/win32consoleappender.h>
 #define WIN32_CONSOLE 1
 #endif
 
+
+
 using namespace log4cplus;
 using namespace log4cplus::helpers;
 
@@ -299,7 +303,9 @@ namespace cmb {
 			_append_none = NULL;
 			_append_socket = NULL;
 			log4cplus::Logger::shutdown();
+#ifndef USE_SKYEYELOG
 			_upload_helper.unitialize();
+#endif
 			_initialized = false;
 		}
 	}
@@ -513,11 +519,22 @@ namespace cmb {
 
     void log4cplus_helper::initialize_linklog(const log_init_config& config)
     {
+#ifdef USE_SKYEYELOG
+		CreateDefaultLogger(config.terminalno, RVC_VERSION_STR, config.dev_name, "100");
+#else
 		_upload_helper.initialize(config);
+#endif
+
     }
 
     void log4cplus_helper::loglink(LOG_LEVEL_E level, vtm_string text)
     {
+#ifdef USE_SKYEYELOG
+		static std::mutex logMtx;
+		logMtx.lock();
+		GetDefaultLogger()(level, text.c_str());
+		logMtx.unlock();
+#else
         if (_upload_helper.is_initialized()) {
 			/*LOG_LEVEL_DEBUG = 0, LOG_LEVEL_INFO = 1, LOG_LEVEL_WARN = 2, LOG_LEVEL_ERROR = 3, LOG_LEVEL_FATAL = 4*/
 			const int converted_ll = ((int)(level)+1) * 10000;
@@ -529,5 +546,6 @@ namespace cmb {
 				_upload_helper.pinst_log_producer_client_add_log(_upload_helper._client, &logitem, 1, cur_time);
 			}
         }
+#endif
     }
 }

+ 2 - 0
Other/liblog4rvcother/log4cplus_helper.h

@@ -176,7 +176,9 @@ namespace cmb {
 		int _log_level;
 
 		bool _initialize_uploaded;
+#ifndef USE_SKYEYELOG
 		upload_helper _upload_helper;
+#endif
 	};
 }
 

+ 3 - 1
Other/liblog4rvcother/log4rvcother.cpp

@@ -81,6 +81,7 @@ namespace cmb {
 		config->log_dir = "";
 		config->log_level = CMB_LOG_LEVEL_OFF;
 		config->log_type = 0; /*OFF*/
+		
 
 		//if(env.record_type.find("CONSOLE") != std::string::npos)
 		//	config->log_type |= CMB_LOG_TYPE_CONSOLE;
@@ -158,13 +159,13 @@ namespace cmb {
 		log_init_config log_env_config;
 		std::string instance_name;
 		bool is_vtm_env(false);
+		std::string terminalno = config.terminalno;
 
 		if(log4plus_initialized) {
 			assert(log4rvcother::instance() != &default_instance);
 			ret_msg = "WARN: log instance has been initialized.";
 			goto error_point;
 		}
-
 		if(IsVTMProcess()) {
 			is_vtm_env = true;
 			ret_msg = env_string + "INFO: vtm runtime, it's VTMers' responsibility to do initialize job.";
@@ -210,6 +211,7 @@ namespace cmb {
 		/*提前在这里赋值,以便让 LOG4VTM 宏生效*/
 		log4plus_initialized = true;
         if (is_vtm_env && (lhs->log_type & CMB_LOG_TYPE_SOCKET) != 0) {
+			lhs->terminalno = terminalno;
             log4cplus_helper::get_instance()->initialize_linklog(*lhs);
         }
 		LOG4VTM(INFO, "==============Log4Vendor(" << instance_name << ") start==============");

+ 1 - 0
Other/liblog4rvcother/log4rvcother.h

@@ -140,6 +140,7 @@ namespace cmb
 		short log_level;      /*见上面 CMB_LOG_TRACE 等定义*/
 		std::string dev_name;  /*硬件名称,用于作为子目录的区分*/
 		std::string log_dir;  /*在 log_type 包含 CMB_LOG_TYPE_FILE 时,该参数才有效,用于记录日志的目录*/
+		std::string terminalno; /*创建log时必须,由healthmanager传入*/
 
 		log_init_config()
 			:log_type(CMB_LOG_TYPE_FILE)

+ 11 - 3
Other/libpublicFun/CMakeLists.txt

@@ -9,7 +9,11 @@ set(${MODULE_PREFIX}_SRCS
     ${ThirdPartyHeadRoot}/CJson/cJSON.c
     exLog/log.h
     exLog/log.cpp
+	exLog/skyeyeLog.h
+	exLog/skyeyeLog.cpp
     portCheck.cpp
+	${CMAKE_SOURCE_DIR}/ThirdParty/Include/uuid4/uuid4.cpp
+	
 )
 
 MESSAGE( STATUS "BOOST_ROOT = ${CONAN_BOOST_ROOT}")
@@ -38,20 +42,24 @@ endif()
 
 add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
 
-
+#set(CMAKE_CXX_FLAGS "${CMAK_CXX_FLAGS} -g3")
 # 依赖libscreencodec、acmstrdec、acmstrenc
 target_include_directories(${MODULE_NAME} PRIVATE
 	${RVC_COMMON_INCLUDE_DIR}
     ${RVC_WINPR_INCLUDE_DIR}
     ${THIRD_PARTY_BASE_DIR}/Include/CJson
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc
+	${CONAN_INCLUDE_DIRS_JSONCPP}
+	${CMAKE_SOURCE_DIR}/ThirdParty/Include/uuid4
     )
 
 target_compile_definitions(${MODULE_NAME} PUBLIC "LIBPUBLIC_EXPORTS")
+add_definitions(-DPUBLIC_EXPORTS)
 
-target_link_directories(${MODULE_NAME} PRIVATE ${CONAN_LIB_DIRS_BOOST})
+target_link_directories(${MODULE_NAME} PRIVATE ${CONAN_LIB_DIRS_BOOST} ${CONAN_LIB_DIRS_JSONCPP})
 
 # 添加需要依赖的其他共享库(包括系统库)
-target_link_libraries(${MODULE_NAME} CONAN_PKG::OpenSSL ${Boost_LIBRARIES})
+target_link_libraries(${MODULE_NAME} CONAN_PKG::OpenSSL ${Boost_LIBRARIES} RestfulFunc ${CONAN_PKG_LIBS_JSONCPP})
 
 deploy_others(${MODULE_PREFIX} ${MODULE_NAME})
 

+ 626 - 0
Other/libpublicFun/exLog/skyeyeLog.cpp

@@ -0,0 +1,626 @@
+#include "skyeyeLog.h"
+#include "RestfulFunc.h"
+#include "JsonConvertHelper.hpp"
+#include "json/json.h"
+#include <chrono>
+#include <thread>
+#include <mutex>
+#include "uuid4.h"
+#include "SpDefine.h"
+#include <list>
+#include <cstdarg>
+
+
+
+#if (defined _WIN32 || defined _WIN64)
+#include <Windows.h>
+#include <WinSock.h>
+#include <IPHlpApi.h>
+#pragma comment(lib, "IPHlpApi.lib")
+#pragma comment(lib, "Ws2_32.lib")
+#else
+#include <winpr/string.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <sys/un.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <net/if.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#endif
+
+#define MAX_LOG_LEN 1900
+void skyeye_GetToken(char* channelId, char* token, char* terminalno, char* reserve1);
+
+
+
+
+void GetUnitedTimeStr(time_t time, char* szTime)
+{
+	struct tm* tm = localtime(&time);
+	sprintf(szTime, "%04d-%02d-%02dT%02d:%02d:%02d.000000000Z",
+		tm->tm_year + 1900,
+		tm->tm_mon + 1,
+		tm->tm_mday,
+		tm->tm_hour,
+		tm->tm_min,
+		tm->tm_sec
+	);
+}
+
+int GetLocalIP(char* ip_str)
+{
+#ifdef _WIN32
+	struct hostent* ent;
+	char tmp[256] = "";
+	int i;
+
+	__try {
+		ent = gethostbyname(tmp);
+	}
+	__except (EXCEPTION_EXECUTE_HANDLER) {
+		strcpy(ip_str, "0.0.0.0");
+		return -1;
+	}
+
+	if (ent) {
+		for (i = 0; ent->h_addr_list[i]; ++i) {
+			if (ent->h_addrtype == AF_INET) {
+				struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
+				char* p = inet_ntoa(*in);
+				if (p[0] != '0') {
+					strcpy(ip_str, p);
+					return 0;
+				}
+			}
+		}
+	}
+#else
+	int sockfd = -1;
+	struct ifconf ifconf;
+	struct ifreq* ifreq = NULL;
+	char strbuf[256] = { 0 };
+	ifconf.ifc_len = 256;
+	ifconf.ifc_buf = strbuf;
+	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
+		ioctl(sockfd, SIOCGIFCONF, &ifconf); //get all socket info
+		ifreq = (struct ifreq*)ifconf.ifc_buf;
+		for (int i = (ifconf.ifc_len / sizeof(struct ifreq)); i > 0; i--) {
+			if (ifreq->ifr_flags == AF_INET) { //for ipv4
+				char* strIP = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
+				ifreq++;
+				if (NULL != strIP) {
+					if (NULL == strstr(strIP, "198.168.") && NULL == strstr(strIP, "127.0.0.1")) {
+						strcpy(ip_str, strIP);
+						close(sockfd);
+						return 0;
+					}
+				}
+			}
+		}
+		close(sockfd);
+	}
+
+#endif //_WIN32
+	return -1;
+
+}
+
+
+std::string get_format_uuid()
+{
+	char strbuffer[64] = "";
+	int uuidlen = 0;
+	uuid4_init();
+	uuid4_generate(strbuffer);
+	return strbuffer;
+}
+
+class TokenManager {
+private:
+	std::string endpoint;
+	std::string channelId;
+	std::string tokenSecret;
+	std::string terminalno;
+	std::string installVersion;
+
+	//need return channelId and token
+	std::string token;
+
+	//every 20 minites execute getToken task
+	std::chrono::system_clock::time_point lastExecutionTime;
+	std::chrono::minutes interval;
+
+
+public:
+	static TokenManager& getInstance()
+	{
+		static TokenManager cur;
+		return cur;
+	}
+	void InitTokenManager(int t_expired_min, std::string t_endpoint, std::string t_channelId,
+		std::string t_tokenSecret, std::string t_terminalno, std::string t_installVersion)
+	{
+		interval = std::chrono::minutes(t_expired_min);
+		endpoint = t_endpoint + "/api/auth/v2/token";
+		channelId = t_channelId;
+		tokenSecret = t_tokenSecret;
+		terminalno = t_terminalno;
+		installVersion = t_installVersion;
+		getToken();
+	}
+
+	std::string getTerminalNo()
+	{
+		return terminalno;
+	}
+
+	std::pair<std::string ,std::string> getToken()
+	{
+		auto execute_refreshToken = [this] {
+			HttpClientRequestConfig config(HttpRequestMethod::POST, endpoint, NULL);
+			HttpClientResponseResult result;
+
+
+			Json::Value businessId;
+			businessId["installVersion"] = installVersion;
+			businessId["terminalNo"] = terminalno;
+			Json::FastWriter writer;
+			std::string businessId_str = writer.write(businessId);
+
+			Json::Value root;
+			root["channelId"] = channelId;
+			root["clientSecret"] = tokenSecret;
+			root["businessId"] = businessId_str;
+			std::string root_str = writer.write(root);
+
+			config.SetJsonBody(root_str);
+
+			RestfulClient client = RestfulClient::getInstance();
+			client.Do(&config, &result);
+			if (result.ResponseOK()) {
+				//解析返回字符串
+				Json::Reader reader;
+				Json::Value rootRet;
+				if (!reader.parse(result.content, rootRet, false))
+					return;
+
+				token = rootRet["data"].asString();
+				if (token.length() > 0)
+					lastExecutionTime = std::chrono::system_clock::now();
+			}
+		};
+
+		if (endpoint.length() == 0 && channelId.length() == 0 && endpoint.length() == 0 
+			&& tokenSecret.length() == 0 && terminalno.length() == 0 && installVersion.length() == 0)
+			return std::make_pair("", "");
+
+
+		auto duration = std::chrono::duration_cast<std::chrono::minutes>(std::chrono::system_clock::now() - lastExecutionTime);
+		if (duration >= interval)//already expired
+		{
+			execute_refreshToken();
+			return std::make_pair(token.length() > 0 ? channelId : "", token.length() > 0 ? token : "");
+		}
+		else if (duration >= interval / 2)// pre update token
+		{
+			std::string oldToken = token;
+			std::thread (execute_refreshToken).detach();
+			return std::make_pair(oldToken.length() > 0 ? channelId : "", oldToken.length() > 0 ? oldToken : "");
+		}
+		else
+			return std::make_pair(token.length() > 0 ? channelId : "", token.length() > 0 ? token : "");
+
+	}
+};
+
+/*reference example
+* 
+{
+	"_CMB_LOG_SPEC_VERSION": "2.0",
+	"level": "DEBUG",
+	"ts": "2024-09-03T15:09:50.000000000Z",
+	"type": "BASETYPE",
+	"serviceUnitId": "LR04.02@FrameworkLib_PRD_PRD",
+	"log": {
+		"content": {
+			"CmptId": "LR04",
+			"CmptName": "FrameworkLib",
+			"LogFile": "SD",
+			"EvenTime": "2024-09-03 15:09:50.414",
+			"CostTime": 0,
+			"VtmUuid": "1f595ef586bc427fa49ee5bf9842e110",
+			"Version": "1.0",
+			"DateTime": "2024-09-03 15:09:50.414",
+			"ResultCode": "SUC0000",
+			"LogCode": "",
+			"API": "",
+			"TipMsg": "",
+			"BussID": "",
+			"SourceType": "",
+			"ResultMsg": "ReadConfigValue can not find value:site",
+			"TraceID": "",
+			"Item": "1",
+			"EntityName": "mod_chromium",
+			"LifeID": 4,
+			"TimeSn": 125,
+			"ServName": "7555980277",
+			"TerminalNo": "7555980277",
+			"SN": "7.5.1.1",
+			"ClientIP": "192.168.56.1"
+		}
+	}
+	
+}
+*/
+
+class skyeye_sender {
+private:
+	std::mutex m_mtx;
+	std::list<Link_private> m_msgArr;
+	int m_TimeSn;
+	std::chrono::system_clock::time_point m_beginTime;
+	std::string convertLinkPrivateToStr(const Link_private& cur)
+	{
+		static char local_ip_str[64] = "0.0.0.0";
+		static long ipInit = 0;
+		//get ip every 1000 times
+		if (ipInit % 1000 == 0)
+			GetLocalIP(local_ip_str);
+		ipInit++;
+
+
+		Json::Value root;
+		root["_CMB_LOG_SPEC_VERSION"] = "2.0";
+		root["level"] = cur.get_baseLogType();
+		root["ts"] = cur.recordTime;
+		root["type"] = "BASETYPE";
+		root["serviceUnitId"] = skyeye_logger::getDefaultLogger().m_constParam.m_serviceUnitId;
+		Json::Value root_log;
+		root_log["CmptId"] = skyeye_logger::getDefaultLogger().m_constParam.m_cmptId;
+		root_log["CmptName"] = skyeye_logger::getDefaultLogger().m_constParam.m_cmptName;
+		root_log["LogFile"] = cur.get_LogFile();
+		root_log["EvenTime"] = cur.recordTime;
+		root_log["CostTime"] = cur.CostTime;
+		root_log["VtmUuid"] = get_format_uuid();
+		root_log["Version"] = "1.0";
+		root_log["DateTime"] = cur.recordTime;
+		root_log["ResultCode"] = cur.ResultCode.length() > 0 ? cur.ResultCode : "";
+		root_log["LogCode"] = cur.LogCode;
+		root_log["API"] = cur.API;
+		root_log["TipMsg"] = cur.TipMsg;
+		root_log["BussID"] = cur.BussID;
+		root_log["SourceType"] = cur.SourceType;
+		root_log["ResultMsg"] = cur.ResultMsg;
+		root_log["TraceID"] = cur.TraceID;
+		root_log["Item"] = skyeye_logger::getDefaultLogger().m_constParam.m_item;
+		root_log["EntityName"] = skyeye_logger::getDefaultLogger().m_constParam.m_entityName;
+		auto currentTime = std::chrono::system_clock::now();
+		auto elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(currentTime - m_beginTime);
+		root_log["LifeID"] = elapsedTime.count();
+		root_log["TimeSn"] = ++m_TimeSn;
+		root_log["ServName"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
+		root_log["TerminalNo"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
+		root_log["SN"] = skyeye_logger::getDefaultLogger().m_constParam.m_version;
+		root_log["ClientIP"] = local_ip_str;
+		Json::Value content_log;
+		content_log["content"] = root_log;
+		root["log"] = content_log;
+
+		Json::FastWriter writer;
+		std::string dst = writer.write(root);
+		return dst;
+	}
+public:
+	static skyeye_sender& getInstance()
+	{
+		static skyeye_sender cur;
+		return cur;
+	}
+	void LogToSender(Link_private* msg)
+	{
+		
+		m_mtx.lock();
+		m_msgArr.push_back(*msg);
+		m_mtx.unlock();
+		
+	}
+	void InitSender(std::string t_endpoint, std::string t_topic)
+	{
+		
+		auto skyeye_sender = [this](std::string t_endpoint, std::string t_topic) {
+			while (true)
+			{
+				if (m_msgArr.empty())
+					std::this_thread::sleep_for(std::chrono::seconds(30));//every 30 seconds
+				std::vector<Link_private> sendArr;
+				m_mtx.lock();
+				//max send 12 logs
+				for (int i = 0; i < 12; i++)
+				{
+					if (m_msgArr.size() == 0)
+						break;
+
+					sendArr.emplace_back(m_msgArr.front());
+					m_msgArr.pop_front();
+				}
+				m_mtx.unlock();
+
+				if (sendArr.size() == 0)
+					continue; //no need to send
+
+				//generate send str
+				Json::Value root;
+				Json::Value arraylist;//消息列表
+				Json::FastWriter fw;//写入对象
+				for (int i = 0; i < sendArr.size(); i++)
+				{
+					arraylist[i] = convertLinkPrivateToStr(sendArr[i]);
+				}
+				root["message_list"] = arraylist;
+				root["topic"] = t_topic;
+				auto sendStr = fw.write(root);
+
+
+				//send
+				HttpClientResponseResult result;
+				HttpClientRequestConfig config(HttpRequestMethod::POST, t_endpoint, skyeye_GetToken);
+				config.SetTimeout(60);
+
+				config.SetJsonBody(sendStr.c_str());
+
+				RestfulClient client = RestfulClient::getInstance();
+				config.PreDo();
+				client.Do(&config, &result);
+				if (result.ResponseOK()) {
+					struct CommResponse
+					{
+						bool success;
+						std::string errorCode;
+						std::string returnCode;
+						std::string errorMsg;
+						std::string message;
+
+						JSONCONVERT2OBJECT_MEMEBER_REGISTER(success, errorCode, returnCode, errorMsg, message)
+							JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("success", "code", "return_code", "error_msg", "message")
+					} responseIns;
+
+					Json::Value rawRoot;
+					if (GetJsonRootObject(rawRoot, result.content) && Json2Object(responseIns, rawRoot)) {
+						if (!responseIns.success)
+						{
+							if (responseIns.errorCode.find("RTI1002") != -1)
+							{
+								m_mtx.lock();
+
+								for (auto it : sendArr)
+									m_msgArr.emplace_back(it);
+								m_mtx.unlock();
+								std::this_thread::sleep_for(std::chrono::seconds(30));//upload logs failed
+							}
+						}
+					}
+				}
+			}
+			
+		};
+		
+		std::thread(skyeye_sender, t_endpoint, t_topic).detach();
+	}
+
+	skyeye_sender()
+		: m_TimeSn(0)
+	{
+	};
+
+
+
+};
+
+#define MAX_TOKEN_LEN 256
+void skyeye_GetToken(char* channelId, char* token, char* terminalno, char* reserve1)
+{
+	auto tokenInfo = TokenManager::getInstance().getToken();
+	auto terminalnoInfo = TokenManager::getInstance().getTerminalNo();
+
+	snprintf(channelId, MAX_TOKEN_LEN, "%s", tokenInfo.first.c_str());
+	snprintf(token, MAX_TOKEN_LEN, "%s", tokenInfo.second.c_str());
+	snprintf(terminalno, MAX_TOKEN_LEN, "%s", terminalnoInfo.c_str());
+
+}
+
+skyeye_logger& skyeye_logger::getDefaultLogger()
+{
+	// TODO: 在此处插入 return 语句
+	static skyeye_logger cur;
+	if (cur.m_msg == nullptr)
+		cur.m_msg = new Link_private(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM);
+	else
+	{
+		delete cur.m_msg;
+		cur.m_msg = new Link_private(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM);
+	}
+	return cur;
+}
+
+skyeye_logger& skyeye_logger::setLogLevel(LOG_LEVEL_E t_level)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->Level = t_level;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setLogType(LOG_TYPE_E t_type)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->Type = t_type;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setResultCode(std::string t_ResultCode)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->ResultCode = t_ResultCode;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setTraceID(std::string t_TraceID)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->TraceID = t_TraceID;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setResultMsg(std::string t_ResultMsg)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->ResultMsg = t_ResultMsg;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setLogCode(std::string t_LogCode)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->LogCode = t_LogCode;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setAPI(std::string t_API)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->API = t_API;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setBussID(std::string t_BussID)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->BussID = t_BussID;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setTipMsg(std::string t_TipMsg)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->TipMsg = t_TipMsg;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setSourceType(std::string t_SourceType)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->SourceType = t_SourceType;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setBeginTime(long t_BeginTime)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->BeginTime = t_BeginTime;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setEndTime(long t_EndTime)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->EndTime = t_EndTime;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setCostTime(long t_costTime)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->CostTime = t_costTime;
+	return *this;
+}
+
+skyeye_logger& skyeye_logger::setVtmCode(std::string t_VtmCode)
+{
+	// TODO: 在此处插入 return 语句
+	if (m_msg != nullptr)
+		m_msg->VtmCode = t_VtmCode;
+	return *this;
+}
+
+void skyeye_logger::operator()(LOG_LEVEL_E t_level, const char* str, ...)
+{
+	if (m_msg != nullptr)
+	{
+		if (str == nullptr)
+			return;
+
+		va_list arg;
+		va_start(arg, str);
+
+		int n = _vscprintf(str, arg) + 1;
+		if (n > MAX_LOG_LEN) {
+			n = MAX_LOG_LEN;
+		}
+
+		std::vector<char> buf(n + 1, '\0');
+		vsnprintf(&buf[0], n, str, arg);
+		va_end(arg);
+
+
+
+		m_msg->Level = t_level;
+		m_msg->ResultMsg = &buf[0];
+
+		skyeye_sender::getInstance().LogToSender(m_msg);
+
+		delete m_msg;
+		m_msg = nullptr;
+	}
+
+
+}
+
+void CreateDefaultLogger(std::string logEndpoint, std::string logTopic,std::string tokenEndpoint, std::string channelId, std::string tokenSecret, Link_const constParam)
+{
+	skyeye_logger::getDefaultLogger().m_constParam = constParam;
+	TokenManager::getInstance().InitTokenManager(30, tokenEndpoint, channelId, tokenSecret, constParam.m_terminalNo, constParam.m_version);
+	skyeye_sender::getInstance().InitSender(logEndpoint, logTopic);
+}
+
+void CreateDefaultLogger(std::string terminalno, std::string version, std::string entityName, std::string itemId)
+{
+	Link_const constParam;
+	constParam.m_entityName = entityName;
+	constParam.m_item = itemId;
+	constParam.m_terminalNo = terminalno;
+	constParam.m_version = version;
+	constParam.m_cmptId = SpDefine::cmptId;
+	constParam.m_cmptName = SpDefine::CmptName;
+	constParam.m_serviceUnitId = SpDefine::serviceUnitId;
+	constParam.m_deployUnitId = SpDefine::deployUnitId;
+	//std::this_thread::sleep_for(std::chrono::seconds(10));//every 30 seconds
+	skyeye_logger::getDefaultLogger().m_constParam = constParam;
+	TokenManager::getInstance().InitTokenManager(30, SpDefine::CommonLaunchUrl, SpDefine::channelId, SpDefine::tokenSecret, constParam.m_terminalNo, constParam.m_version);
+	//skyeye_sender::getInstance();
+	std::string endpoint = SpDefine::endpoint_env;
+	std::string topic = SpDefine::topicSys;
+	skyeye_sender::getInstance().InitSender(endpoint, topic);
+
+}
+
+skyeye_logger& GetDefaultLogger()
+{
+	return skyeye_logger::getDefaultLogger();
+}

+ 135 - 0
Other/libpublicFun/exLog/skyeyeLog.h

@@ -0,0 +1,135 @@
+#include <log_define.h>
+#include <string>
+#include "../publicExport.h"
+
+
+class Link_const 
+{
+public:
+	std::string m_terminalNo;
+	std::string m_entityName;
+	std::string m_item; //对应于天眼item字段,即实体id
+	std::string m_cmptId;
+	std::string m_cmptName;
+	std::string m_serviceUnitId;
+	std::string m_deployUnitId;
+	std::string m_version;
+};
+
+class Link_private {
+public:
+	LOG_LEVEL_E Level;
+	LOG_TYPE_E Type;
+	std::string ResultCode;
+	std::string TraceID;
+	std::string ResultMsg;
+	std::string LogCode;
+	std::string API;
+	long BeginTime;
+	long EndTime;
+	long CostTime;
+	std::string BussID;
+	std::string TipMsg;
+	std::string SourceType;
+	std::string VtmCode;
+	std::string recordTime;
+
+public:
+	Link_private(LOG_LEVEL_E t_level, LOG_TYPE_E t_type)
+		: Level(t_level), Type(t_type), BeginTime(0), EndTime(0), CostTime(0), ResultCode("SUC0000")
+	{
+		TraceID = ResultMsg = LogCode = API = BussID = TipMsg = SourceType = recordTime = VtmCode = "";
+	}
+
+	std::string get_baseLogType() const {
+		if (Level == LOG_LEVEL_DEBUG)
+			return "DEBUG";
+		else if (Level == LOG_LEVEL_INFO)
+			return "INFO";
+		else if (Level == LOG_LEVEL_WARN)
+			return "WARN";
+		else if (Level == LOG_LEVEL_ERROR)
+			return "ERROR";
+		else if (Level == LOG_LEVEL_FATAL)
+			return "PERFORMANCE";
+		else
+			return "INFO";
+	}
+
+	std::string get_LogFile() const {
+		if (Level == LOG_LEVEL_DEBUG)
+			return "SD";
+		else if (Level == LOG_LEVEL_INFO)
+			return "SI";
+		else if (Level == LOG_LEVEL_WARN)
+			return "SW";
+		else if (Level == LOG_LEVEL_ERROR)
+			return "SE";
+		else if (Level == LOG_LEVEL_FATAL)
+			return "SF";
+		else
+			return "SI";
+	}
+
+	std::string get_LogType() const {
+		if (Level == LOG_LEVEL_DEBUG)
+			return "SYSTEM_DEBUG";
+		else if (Level == LOG_LEVEL_INFO)
+			return "SYSTEM_INFO";
+		else if (Level == LOG_LEVEL_WARN)
+			return "SYSTEM_WARN";
+		else if (Level == LOG_LEVEL_ERROR)
+			return "SYSTEM_ERROR";
+		else if (Level == LOG_LEVEL_FATAL)
+			return "SYSTEM_PERFORMANCE";
+		else
+			return "SYSTEM_INFO";
+	}
+};
+
+class PUBLIC_API skyeye_logger {
+public:
+	static skyeye_logger& getDefaultLogger();
+
+
+	//用户、系统日志均必填,设置日志级别
+	skyeye_logger& setLogLevel(LOG_LEVEL_E t_level);
+	//用户、系统日志均必填,设置日志类型
+	skyeye_logger& setLogType(LOG_TYPE_E t_type);
+	//用户、系统日志均必填,交易处理结果代码,0表示处理成功,其他表示失败,可为系统本身的错误码,也可为后台系统返回的错误码
+	skyeye_logger& setResultCode(std::string t_ResultCode);
+	//用户、系统日志均必填,业务跟踪ID, 32字节长度的字符串,唯一识别每笔请求
+	skyeye_logger& setTraceID(std::string t_TraceID);
+	//用户、系统日志LOG_LEVEL_WARN以上必填
+	//交易处理结果信息,包括成功与失败信息,可为系统本身的成功/失败信息,也可为后台系统返回的成功/失败信息.
+	skyeye_logger& setResultMsg(std::string t_ResultMsg);
+	//用户日志必填,日志码
+	//终端中标识各个交易如读卡、读取身份证等。如果终端由于客观原因无法识别交易场景,则可字段由上游传入。
+	skyeye_logger& setLogCode(std::string t_LogCode);
+	skyeye_logger& setAPI(std::string t_API);//用户日志必填,请求路径/接口名称.
+	skyeye_logger& setBussID(std::string t_BussID);//用户日志必填,请求业务ID
+	skyeye_logger& setTipMsg(std::string t_TipMsg);//用户日志LOG_LEVEL_WARN以上必填,直接向客户展示的报错信息.
+	skyeye_logger& setSourceType(std::string t_SourceType);//系统日志LOG_LEVEL_FATAL必填,异常来源类型
+	skyeye_logger& setBeginTime(long t_BeginTime);//用户日志必填, 请求发送/接收时间
+	skyeye_logger& setEndTime(long t_EndTime);//用户日志必填, 响应接收 / 应答时间
+	skyeye_logger& setCostTime(long t_costTime);//消耗时间,自定义字段,单位ms
+	skyeye_logger& setVtmCode(std::string t_VtmCode);//VtmCode,记录原告警
+	void operator () (LOG_LEVEL_E t_level, const char* str, ...);
+private:
+	Link_private* m_msg;
+public:
+	//logger default param
+	Link_const m_constParam;
+
+private:
+	skyeye_logger() {};
+	skyeye_logger(const skyeye_logger&) = delete;
+	const skyeye_logger& operator=(const skyeye_logger&) = delete;
+};
+
+//CreateDefaultLogger with all params
+PUBLIC_API void CreateDefaultLogger(std::string logEndpoint, std::string logTopic, std::string tokenEndpoint, std::string channelId, std::string tokenSecret, Link_const constParam);
+//CreateDefaultLogger with neccessary params, other params use default values.
+PUBLIC_API void CreateDefaultLogger(std::string terminalno, std::string version, std::string entityName, std::string itemId);
+
+PUBLIC_API skyeye_logger& GetDefaultLogger();

+ 1 - 0
Tool/CMakeLists.txt

@@ -7,6 +7,7 @@ set(WINPR_LIB winpr)
 set(MODULE_BASE_LIBS ${SPBASE_LIB} ${TOOLKIT_LIB})
 set(MODULE_BASE_ALL_LIBS ${MODULE_BASE_LIBS} ${RVCCOMM_LIB}) 
 
+
 if(NOT MSVC)
     list(APPEND MODULE_BASE_LIBS ${WINPR_LIB})
 endif(NOT MSVC)

+ 10 - 3
Tool/guardian/CMakeLists.txt

@@ -7,19 +7,26 @@ endif(NOT MSVC)
 
 add_executable(${MODULE_NAME} guardian.cpp)
 
+MESSAGE( STATUS "OTHER_LIB_BASE_DIR = ${OTHER_LIB_BASE_DIR}")
+MESSAGE( STATUS "CONAN_LIB_DIRS_JSONCPP = ${CONAN_LIB_DIRS_JSONCPP}")
+MESSAGE( STATUS "CONAN_PKG_LIBS_JSONCPP = ${CONAN_PKG_LIBS_JSONCPP}")
+
 target_include_directories(${MODULE_NAME} PRIVATE
     ${RVC_TOOLKIT_INCLUDE_DIR}
     ${RVC_WINPR_INCLUDE_DIR}
     ${Tool_BASE_DIR}/GuardianBase
     ${OTHER_LIB_BASE_DIR}/liblog4rvcother
+    ${CONAN_LIB_DIRS_JSONCPP}
 )
-
+target_link_directories(${MODULE_NAME} PRIVATE ${CONAN_LIB_DIRS_JSONCPP})
 if(MSVC)
-    target_link_libraries(${MODULE_NAME} PRIVATE ${TOOLKIT_LIB} Ws2_32 log4rvcother)
+    target_link_libraries(${MODULE_NAME} PRIVATE ${TOOLKIT_LIB} Ws2_32 log4rvcother ${CONAN_PKG_LIBS_JSONCPP})
 else()
-    target_link_libraries(${MODULE_NAME} PRIVATE ${WINPR_LIB} ${TOOLKIT_LIB} log4rvcother)
+    target_link_libraries(${MODULE_NAME} PRIVATE ${WINPR_LIB} ${TOOLKIT_LIB} log4rvcother ${CONAN_PKG_LIBS_JSONCPP})
 endif(MSVC)
 
+#set(CMAKE_CXX_FLAGS "${CMAK_CXX_FLAGS} -g3")
+
 install(TARGETS ${MODULE_NAME} 
     RUNTIME DESTINATION "${RVC_RUNTIME_PATH}"
     ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}"

+ 7 - 1
Tool/guardian/guardian.cpp

@@ -1590,11 +1590,16 @@ static void sig_handle(int signo)
 }
 #endif
 
-int main()
+int main(int argc, char* argv[])
 {
 	//attach file descriptors 0,1,2 to /dev/null(for deamon app)
+	std::string terminalno;
 	int fd0, fd1, fd2;
 	g_bFrameOnline = true;
+	//MessageBox(NULL, NULL, NULL, 0);
+	if (argc > 1)
+		terminalno = argv[1];
+
 #ifdef linux
 	fd0 = open("/dev/null", O_RDWR);
 	fd1 = dup(0);
@@ -1615,6 +1620,7 @@ int main()
 #endif
 	cmb::log_init_config config;
 	config.dev_name = "guardian";
+	config.terminalno = terminalno;
 	///*TODO: 依赖上层提供环境变量来控制路径和开关,可以考虑厂商的方式 (80374374@1/4/2024)*/
 #if defined(_MSC_VER)
 	config.log_dir = ("C:\\rvc\\dbg\\");