Explorar o código

#IQRV #comment [Merge] 厂商日志库同步

gifur %!s(int64=2) %!d(string=hai) anos
pai
achega
4123dad531

+ 19 - 0
DevAdapter/self/liblog4vendor/dllmain.cpp

@@ -0,0 +1,19 @@
+// dllmain.cpp : 定义 DLL 应用程序的入口点。
+#include "stdafx.h"
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+	case DLL_THREAD_DETACH:
+	case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+

+ 3 - 0
DevAdapter/self/liblog4vendor/env_deal.h

@@ -3,6 +3,9 @@
 
 #pragma once
 
+#ifdef _WIN32
+#include <Windows.h>
+#endif
 #include <string>
 
 namespace cmb {

+ 7 - 0
DevAdapter/self/liblog4vendor/liblog4vendor.cpp

@@ -6,6 +6,7 @@
 
 #if OS_WIN
 #include <Psapi.h>
+#pragma comment(lib, "Psapi.lib")
 #define CUR_PROCESS_NAME "sphost.exe"
 static HMODULE gModule = NULL;
 #else
@@ -29,6 +30,12 @@ EXTERN_C BOOL IsVTMProcess()
 		char szPath[4096] = {'\0'};
 		DWORD dwPathSize = 4096;
 		if(GetCurProcessPath(szPath, dwPathSize)) {
+			const int pathLen = strlen(szPath);
+			int index;
+			for(index=0; index<pathLen; ++index) {
+				if(szPath[index] >= 'A' && szPath[index] <= 'Z')
+					szPath[index] = 'a' + (szPath[index] - 'A');
+			}
 			char* pos = strstr(szPath, CUR_PROCESS_NAME);
 			dwPathSize = strlen(szPath);
 			if(pos != NULL && ((pos-szPath) + strlen(CUR_PROCESS_NAME)) == dwPathSize) {

+ 9 - 0
DevAdapter/self/liblog4vendor/log4link.cpp

@@ -87,6 +87,13 @@ log_link& log_link::end_time(long value)
     return *this;
 }
 
+log_link& log_link::cost_time(long value)
+{
+	if (m_private != nullptr)
+		m_private->cost_time = value;
+	return *this;
+}
+
 log_link& log_link::log_producer(void* producer)
 {
     if (m_private != nullptr)
@@ -116,6 +123,7 @@ void log_link::operator()() const
     log.TipMsg = (char*)m_private->tip_msg.c_str();
     log.BeginTime = m_private->begin_time;
     log.EndTime = m_private->end_time;
+    log.CostTime = m_private->cost_time;
     log.TraceID = (char*)m_private->trace_id.c_str();
     log.BussID = (char*)m_private->business_id.c_str();
     log.SourceType = (char*)m_private->src_type.c_str();
@@ -139,6 +147,7 @@ void log_link::fetch_log_item(log_item& log)
     log.TipMsg = (char*)m_private->tip_msg.c_str();
     log.BeginTime = m_private->begin_time;
     log.EndTime = m_private->end_time;
+    log.CostTime = m_private->cost_time;
     log.TraceID = (char*)m_private->trace_id.c_str();
     log.BussID = (char*)m_private->business_id.c_str();
     log.SourceType = (char*)m_private->src_type.c_str();

+ 3 - 35
DevAdapter/self/liblog4vendor/log4link.h

@@ -23,40 +23,6 @@ typedef enum
 
 typedef int vendorlog_producer_result;
 
-struct vendorlog_item
-{
-    /***************************必填begin**********************/
-    VENDORLOG_LEVEL_E level;
-    VENDORLOG_TYPE_E type;
-    //用户、系统日志均必填,交易处理结果代码,0表示处理成功,其他表示失败,可为系统本身的错误码,也可为后台系统返回的错误码
-    char* result_code;
-    //用户、系统日志均必填,业务跟踪ID, 32字节长度的字符串,唯一识别每笔请求
-    char* trace_id;
-    //用户、系统日志LOG_LEVEL_WARN以上必填
-    //交易处理结果信息,包括成功与失败信息,可为系统本身的成功/失败信息,也可为后台系统返回的成功/失败信息.
-    char* result_msg;
-
-    /***************************用户日志必填必填begin**********************/
-    //用户日志必填,日志码
-    //终端中标识各个交易如读卡、读取身份证等。如果终端由于客观原因无法识别交易场景,则可字段由上游传入。
-    char* log_code;
-    //用户日志必填,请求路径/接口名称.
-    char* iap;
-    //用户日志必填, 请求发送/接收时间
-    long begin_time;
-    //用户日志必填, 响应接收 / 应答时间
-    long end_time;
-    //用户日志必填,请求业务ID
-    char* business_id;
-    //用户日志LOG_LEVEL_WARN以上必填,直接向客户展示的报错信息.
-    char* tip_msg;
-
-    /***************************系统日志必填 begin**********************/
-    //系统日志LOG_LEVEL_FATAL必填,异常来源类型
-    char* src_type;
-};
-
-
 class log_link_private 
 {
 public:
@@ -70,6 +36,7 @@ public:
 
     long begin_time;
     long end_time;
+    long cost_time;
 
     std::string business_id;
     std::string tip_msg;
@@ -80,7 +47,7 @@ public:
     log_link_private(VENDORLOG_LEVEL_E t_level, VENDORLOG_TYPE_E t_type)
         : level(t_level), type(t_type)
         , result_code("SUC0000"),trace_id(""), result_msg(""), log_code(""), apii("")
-        , begin_time(0), end_time(0)
+        , begin_time(0), end_time(0), cost_time(0)
         , business_id(""), tip_msg(""), src_type(""), log_producer(nullptr), do_log(true)
     {
     }
@@ -111,6 +78,7 @@ public:
     log_link& src_type(std::string value);//系统日志LOG_LEVEL_FATAL必填,异常来源类型
     log_link& begin_time(long value);//用户日志必填, 请求发送/接收时间
     log_link& end_time(long value);//用户日志必填, 响应接收 / 应答时间
+    log_link& cost_time(long value);//消耗时间,自定义字段,单位ms
     log_link& log_producer(void* producer);
     log_link& with_extend_log_or_not(bool value);//是否log到文件中,并行阶段需要log到文件
     void operator () ()  const;

+ 117 - 4
DevAdapter/self/liblog4vendor/log4upload.cpp

@@ -1,9 +1,117 @@
 #include "log4upload.h"
 #include "log4vendor.h"
 #include <algorithm>
-
+#include <string>
+#include <cctype>
 
 #if defined(_MSC_VER)
+#include <Windows.h>
+#define LOG_SDKNAME "RvcLogSdk.dll"
+
+static void log4vendor__format_fallback_error(log4vendor_lib_t* lib, int errorno) 
+{
+	static const CHAR fallback_error[] = "error: %1!d!";
+	DWORD_PTR args[1];
+	args[0] = (DWORD_PTR)errorno;
+
+	FormatMessageA(FORMAT_MESSAGE_FROM_STRING |
+		FORMAT_MESSAGE_ARGUMENT_ARRAY |
+		FORMAT_MESSAGE_ALLOCATE_BUFFER,
+		fallback_error, 0, 0,
+		(LPSTR)&lib->errmsg,
+		0, (va_list*)args);
+}
+
+int log4vendor__dlerror(log4vendor_lib_t* lib, const char* filename, DWORD errorno)
+{
+		DWORD_PTR arg;
+	DWORD res;
+	char* msg;
+
+	if (lib->errmsg) {
+		LocalFree(lib->errmsg);
+		lib->errmsg = NULL;
+	}
+
+	if (errorno == 0)
+		return 0;
+
+	res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+		FORMAT_MESSAGE_FROM_SYSTEM |
+		FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
+		MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
+		(LPSTR)&lib->errmsg, 0, NULL);
+
+	if (!res && (GetLastError() == ERROR_MUI_FILE_NOT_FOUND ||
+		GetLastError() == ERROR_RESOURCE_TYPE_NOT_FOUND)) {
+		res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+			FORMAT_MESSAGE_FROM_SYSTEM |
+			FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
+			0, (LPSTR)&lib->errmsg, 0, NULL);
+	}
+
+	if (res && errorno == ERROR_BAD_EXE_FORMAT && strstr(lib->errmsg, "%1")) {
+		msg = lib->errmsg;
+		lib->errmsg = NULL;
+		arg = (DWORD_PTR)filename;
+		res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+			FORMAT_MESSAGE_ARGUMENT_ARRAY |
+			FORMAT_MESSAGE_FROM_STRING,
+			msg,
+			0, 0, (LPSTR)&lib->errmsg, 0, (va_list*)&arg);
+		LocalFree(msg);
+	}
+
+	if (!res)
+		log4vendor__format_fallback_error(lib, errorno);
+
+	return -1;
+}
+
+int log4vendor_dlopen(const char* filename, log4vendor_lib_t* lib)
+{
+	WCHAR filename_w[1024];
+
+	lib->handle = NULL;
+	lib->errmsg = NULL;
+
+	if (!MultiByteToWideChar(CP_UTF8,
+		0,
+		filename,
+		-1,
+		filename_w,
+		(sizeof(filename_w)/sizeof((filename_w)[0])))) {
+		return log4vendor__dlerror(lib, filename, GetLastError());
+	}
+
+	lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+	if (lib->handle == NULL) {
+		return log4vendor__dlerror(lib, filename, GetLastError());
+	}
+
+	return 0;
+}
+
+void log4vendor_dlclose(log4vendor_lib_t* lib)
+{
+	if (lib->errmsg) {
+		LocalFree((void*)lib->errmsg);
+		lib->errmsg = NULL;
+	}
+
+	if (lib->handle) {
+		/* Ignore errors. No good way to signal them without leaking memory. */
+		FreeLibrary(lib->handle);
+		lib->handle = NULL;
+	}
+}
+
+int log4vendor_dlsym(log4vendor_lib_t* lib, const char* name, void** ptr)
+{
+	*ptr = (void*)(uintptr_t)GetProcAddress(lib->handle, name);
+	return log4vendor__dlerror(lib, "", *ptr ? 0 : GetLastError());
+}
+
 #else
 #include <dlfcn.h>
 #include <errno.h>
@@ -55,13 +163,14 @@ int log4vendor_dlsym(log4vendor_lib_t* lib, const char* name, void** ptr)
     return log4vendor__dlerror(lib);
 }
 
+
+#endif //_MSC_VER
+
 const char* log4vendor_dlerror(const log4vendor_lib_t* lib)
 {
     return lib->errmsg ? lib->errmsg : "no error";
 }
 
-#endif //_MSC_VER
-
 std::string to_lower(std::string str)
 {
     std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) {
@@ -99,7 +208,11 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
         memset(value, '\0', sizeof(value));
         strcpy(value, "0");
         pinst_log_producer_config_set_skyeye_item(config, value);
-        pinst_log_producer_config_set_persistent_file_path(config, "/opt/rvc/terminaldbstorage");
+#if defined(_MSC_VER)
+		pinst_log_producer_config_set_persistent_file_path(config, "C:\\rvc\\terminaldbstorage");
+#else
+		pinst_log_producer_config_set_persistent_file_path(config, "/opt/rvc/terminaldbstorage");
+#endif
 
         //мÓͳһÈÕÖ¾ÅäÖÃ
         pinst_log_producer_config_set_united_appname(config, (char*)"LR04");

+ 53 - 2
DevAdapter/self/liblog4vendor/log4upload.h

@@ -6,11 +6,22 @@
 #include <stdint.h>
 #include "log4vendor.h"
 
+
+#if defined(_MSC_VER)
+
+#include <Windows.h>
+
+typedef struct {
+	HMODULE handle;
+	char* errmsg;
+} log4vendor_lib_t;
+#else
 typedef struct
 {
     void* handle;
     char* errmsg;
 } log4vendor_lib_t;
+#endif
 
 struct log_producer_config
 {
@@ -79,7 +90,9 @@ typedef enum
 {
     LOG_LEVEL_DEBUG = 0, LOG_LEVEL_INFO = 1, LOG_LEVEL_WARN = 2, LOG_LEVEL_ERROR = 3, LOG_LEVEL_FATAL = 4
 }LOG_LEVEL_E;
-
+/**
+ * 天眼log item
+ */
 typedef struct _log_item
 {
     /***************************必填begin**********************/
@@ -103,6 +116,8 @@ typedef struct _log_item
     long BeginTime;
     //用户日志必填, 响应接收 / 应答时间
     long EndTime;
+	//自定义字段,消耗时间
+	long CostTime;
     //用户日志必填,请求业务ID
     char* BussID;
     //用户日志LOG_LEVEL_WARN以上必填,直接向客户展示的报错信息.
@@ -111,11 +126,43 @@ typedef struct _log_item
     /***************************系统日志必填begin**********************/
     //系统日志LOG_LEVEL_FATAL必填,异常来源类型
     char* SourceType;
-}log_item;
+} log_item;
 
 typedef int log_producer_result;
 typedef void(*pfn_on_log_producer_send_done)(log_producer_result, int, int, const char*, const char*, const unsigned char*, void*);
 
+#ifdef _WIN32
+
+typedef log_producer_config* (*pfn_create_log_producer_config)();
+typedef void(*pfn_log_producer_config_set_packet_log_bytes)(log_producer_config*, int32_t);
+typedef void(*pfn_log_producer_config_set_packet_log_count)(log_producer_config*, int32_t);
+
+typedef void(*pfn_log_producer_config_set_max_buffer_limit)(log_producer_config*, int64_t);
+typedef void(*pfn_log_producer_config_set_send_thread_count)(log_producer_config*, int32_t);
+typedef void(*pfn_log_producer_config_set_persistent_max_log_count)(log_producer_config*, int32_t);
+typedef void(*pfn_log_producer_config_set_skyeye_servname)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_skyeye_cmptId)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_skyeye_cmptname)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_skyeye_version)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_persistent)(log_producer_config*, int32_t);
+typedef void(*pfn_log_producer_config_set_skyeye_entityname)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_skyeye_item)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_persistent_file_path)(log_producer_config*, const char*);
+
+typedef void(*pfn_log_producer_config_set_united_appname)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_united_version)(log_producer_config*, char*);
+
+typedef void(*pfn_log_producer_config_set_united_needArchived)(log_producer_config*, int);
+typedef void(*pfn_log_producer_config_set_united_deployUnitId)(log_producer_config*, char*);
+typedef void(*pfn_log_producer_config_set_united_serviceUnitId)(log_producer_config*, char*);
+
+typedef log_producer_client*(*pfn_create_log_producer_client)(log_producer_config*, pfn_on_log_producer_send_done, void*);
+typedef log_producer_result(*pfn_log_producer_client_add_log)(log_producer_client*, log_item*, int);
+
+typedef void(*pfn_log_producer_config_switch_debug_mode)(log_producer_config*, int32_t);
+
+#else
+
 using pfn_create_log_producer_config = log_producer_config*(*)();
 using pfn_log_producer_config_set_packet_log_bytes = void(*)(log_producer_config*, int32_t);
 using pfn_log_producer_config_set_packet_log_count = void(*)(log_producer_config*, int32_t);
@@ -144,6 +191,10 @@ using pfn_log_producer_client_add_log = log_producer_result(*)(log_producer_clie
 
 using pfn_log_producer_config_switch_debug_mode = void(*)(log_producer_config*, int32_t);
 
+#endif //_WIN32
+
+
+
 class upload_helper
 {
 public:

+ 42 - 30
DevAdapter/self/liblog4vendor/log4vendor.cpp

@@ -38,7 +38,6 @@ namespace cmb {
 	/*在有效日志类实例没被初始化前返回的一个替代品*/
 	static log4none default_instance;
 
-
 	log4vendor* log4vendor::instance()
 	{
 		if(!log4plus_initialized)
@@ -108,39 +107,44 @@ namespace cmb {
 		//TODO: comfirm the name's validity. {DeviceName}.{VendorName}.{X}.{Y}.dll
 		if(dev_infos.size() == 5 && toupper(dev_infos[4]) == LIBRARY_POSIXNAME) {
 			config->dev_name = "vendor_";
-			{
-				auto lib_name = toupper(dev_infos[0]);
-				auto lib_prefix = std::string("LIB");
-				if (start_with(lib_name, lib_prefix)) {
-					lib_name = dev_infos[0].substr(lib_prefix.length());
-				} else {
-					lib_name = dev_infos[0];
-				}
-				config->dev_name += lib_name;
-			}
+#if defined(_MSC_VER)
+			config->dev_name += dev_infos[0];
+#else
+            {
+                auto lib_name = toupper(dev_infos[0]);
+                auto lib_prefix = std::string("LIB");
+                if (start_with(lib_name, lib_prefix)) {
+                    lib_name = dev_infos[0].substr(lib_prefix.length());
+                } else {
+                    lib_name = dev_infos[0];
+                }
+                config->dev_name += lib_name;
+            }
+#endif //_MSC_VER
 		}
 		config->log_dir = env.record_path;
 	}
 
-	void log4vendor::initp(const log_init_config_c* pconfig, char pret_msg[VENDOR_BUFF_SIZE])
-	{
+#ifndef _WIN32
+    void log4vendor::initp(const log_init_config_c* pconfig, char pret_msg[VENDOR_BUFF_SIZE])
+    {
         std::string msg("");
-		if (pconfig != nullptr) {
-			log_init_config config1;
-			config1.dev_name = pconfig->dev_name;
-			config1.log_dir = pconfig->log_dir;
-			config1.log_level = pconfig->log_level;
-			config1.log_type = pconfig->log_type;
-
-			init(config1, msg);
-			if (!msg.empty()) {
-				strcpy(pret_msg, msg.c_str());
-			}
-		} else {
-			std::strcpy(pret_msg, "error param: nullptr");
-		}
-	}
-
+        if (pconfig != nullptr) {
+            log_init_config config1;
+            config1.dev_name = pconfig->dev_name;
+            config1.log_dir = pconfig->log_dir;
+            config1.log_level = pconfig->log_level;
+            config1.log_type = pconfig->log_type;
+
+            init(config1, msg);
+            if (!msg.empty()) {
+                strcpy(pret_msg, msg.c_str());
+            }
+        } else {
+            std::strcpy(pret_msg, "error param: nullptr");
+        }
+    }
+#endif //NOT _WIN32
 
 	void log4vendor::init(const log_init_config& config, std::string& ret_msg)
 	{
@@ -205,7 +209,11 @@ namespace cmb {
             log4cplus_helper::get_instance()->initialize_linklog(*lhs);
         }
 		LOG4VTM(INFO, "==============Log4Vendor(" << instance_name << ") start==============");
+#if defined(_MSC_VER)
+		LOG4VTM(INFO, "process id: " << GetCurrentProcessId());
+#else
 		LOG4VTM(INFO, "process id: " << getpid());
+#endif //_MSC_VER
 		{
 			char ver[128] = {'\0'};
 			DWORD sz = 128;
@@ -249,7 +257,11 @@ error_point:
 		str << "==> Enter {" << m_pszMes << "}, file: {" << m_pszFileN << "}, line: {" << m_nLine << "}.";
 		log4cplus_helper::get_instance()->trace(str.str());
 	}
-	log4vendor_tracer::log4vendor_tracer(const char* message, const char* fileName, int nLine, PDWORD pRet)
+#if defined(_MSC_VER)
+	log4vendor_tracer::log4vendor_tracer(const char* message, const char* fileName, int nLine, unsigned long* pRet)
+#else
+    log4vendor_tracer::log4vendor_tracer(const char* message, const char* fileName, int nLine, PDWORD pRet)
+#endif //_MSC_VER
 		:m_pszMes(message), m_pszFileN(fileName), m_nLine(nLine)
 		, m_pnRet(NULL), m_pDwRet(pRet), m_pfRet(NULL), m_retType(1)
 	{