skyeyeLog.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. #include "skyeyeLog.h"
  2. #include "RestfulFunc.h"
  3. #include "JsonConvertHelper.hpp"
  4. #include "json/json.h"
  5. #include <chrono>
  6. #include <thread>
  7. #include <mutex>
  8. #include "uuid4.h"
  9. #include "SpDefine.h"
  10. #include <list>
  11. #include <cstdarg>
  12. #if (defined _WIN32 || defined _WIN64)
  13. #include <Windows.h>
  14. #include <WinSock.h>
  15. #include <IPHlpApi.h>
  16. #pragma comment(lib, "IPHlpApi.lib")
  17. #pragma comment(lib, "Ws2_32.lib")
  18. #else
  19. #include <winpr/string.h>
  20. #include <netdb.h>
  21. #include <unistd.h>
  22. #include <sys/un.h>
  23. #include <sys/ioctl.h>
  24. #include <sys/socket.h>
  25. #include <arpa/inet.h>
  26. #include <netinet/in.h>
  27. #include <netinet/tcp.h>
  28. #include <net/if.h>
  29. #include <sys/stat.h>
  30. #include <sys/time.h>
  31. #endif
  32. #include <SpBase.h>
  33. #define MAX_LOG_LEN 1900
  34. void skyeye_GetToken(char* channelId, char* token, char* terminalno, char* reserve1);
  35. void GetUnitedTimeStr(time_t time, char* szTime)
  36. {
  37. struct tm* tm = localtime(&time);
  38. sprintf(szTime, "%04d-%02d-%02dT%02d:%02d:%02d.000000000Z",
  39. tm->tm_year + 1900,
  40. tm->tm_mon + 1,
  41. tm->tm_mday,
  42. tm->tm_hour,
  43. tm->tm_min,
  44. tm->tm_sec
  45. );
  46. }
  47. int GetLocalIP(char* ip_str)
  48. {
  49. #ifdef _WIN32
  50. struct hostent* ent;
  51. char tmp[256] = "";
  52. int i;
  53. __try {
  54. ent = gethostbyname(tmp);
  55. }
  56. __except (EXCEPTION_EXECUTE_HANDLER) {
  57. strcpy(ip_str, "0.0.0.0");
  58. return -1;
  59. }
  60. if (ent) {
  61. for (i = 0; ent->h_addr_list[i]; ++i) {
  62. if (ent->h_addrtype == AF_INET) {
  63. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  64. char* p = inet_ntoa(*in);
  65. if (p[0] != '0') {
  66. strcpy(ip_str, p);
  67. return 0;
  68. }
  69. }
  70. }
  71. }
  72. #else
  73. int sockfd = -1;
  74. struct ifconf ifconf;
  75. struct ifreq* ifreq = NULL;
  76. char strbuf[256] = { 0 };
  77. ifconf.ifc_len = 256;
  78. ifconf.ifc_buf = strbuf;
  79. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
  80. ioctl(sockfd, SIOCGIFCONF, &ifconf); //get all socket info
  81. ifreq = (struct ifreq*)ifconf.ifc_buf;
  82. for (int i = (ifconf.ifc_len / sizeof(struct ifreq)); i > 0; i--) {
  83. if (ifreq->ifr_flags == AF_INET) { //for ipv4
  84. char* strIP = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
  85. ifreq++;
  86. if (NULL != strIP) {
  87. if (NULL == strstr(strIP, "198.168.") && NULL == strstr(strIP, "127.0.0.1")) {
  88. strcpy(ip_str, strIP);
  89. close(sockfd);
  90. return 0;
  91. }
  92. }
  93. }
  94. }
  95. close(sockfd);
  96. }
  97. #endif //_WIN32
  98. return -1;
  99. }
  100. std::string get_format_uuid()
  101. {
  102. char strbuffer[64] = "";
  103. int uuidlen = 0;
  104. uuid4_init();
  105. uuid4_generate(strbuffer);
  106. return strbuffer;
  107. }
  108. class TokenManager {
  109. private:
  110. std::string endpoint;
  111. std::string channelId;
  112. std::string tokenSecret;
  113. std::string terminalno;
  114. std::string installVersion;
  115. //need return channelId and token
  116. std::string token;
  117. //every 20 minites execute getToken task
  118. std::chrono::system_clock::time_point lastExecutionTime;
  119. std::chrono::minutes interval;
  120. public:
  121. static TokenManager& getInstance()
  122. {
  123. static TokenManager cur;
  124. return cur;
  125. }
  126. void InitTokenManager(int t_expired_min, std::string t_endpoint, std::string t_channelId,
  127. std::string t_tokenSecret, std::string t_terminalno, std::string t_installVersion)
  128. {
  129. interval = std::chrono::minutes(t_expired_min);
  130. endpoint = t_endpoint + "/api/auth/v2/token";
  131. channelId = t_channelId;
  132. tokenSecret = t_tokenSecret;
  133. terminalno = t_terminalno;
  134. installVersion = t_installVersion;
  135. getToken();
  136. }
  137. std::string getTerminalNo()
  138. {
  139. return terminalno;
  140. }
  141. std::pair<std::string ,std::string> getToken()
  142. {
  143. auto execute_refreshToken = [this] {
  144. std::string srcBusId = "LR0402getToken";
  145. std::string srcTraceId = uuid4_generate(32);
  146. std::string srcSpanId = uuid4_generate(16);
  147. std::string srcParentSpanId = "0";
  148. std::string srcTimestamp = std::to_string(std::chrono::system_clock::now().time_since_epoch().count());
  149. HttpClientTraceLink headLink;
  150. memset(&headLink, 0, sizeof(headLink));
  151. strncpy(headLink.X_B3_BusinessId, srcBusId.c_str(), 32);
  152. strncpy(headLink.X_B3_TraceId, srcTraceId.c_str(), 32);
  153. strncpy(headLink.X_B3_SpanId, srcSpanId.c_str(), 16);
  154. strncpy(headLink.X_B3_ParentSpanId, srcParentSpanId.c_str(), 16);
  155. strncpy(headLink.X_B3_Timestamp, srcTimestamp.c_str(), 16);
  156. beidou_logger::getDefaultLogger(headLink, "guardian_getToken")();
  157. HttpClientTraceLink nextLink;
  158. memset(&nextLink, 0, sizeof(nextLink));
  159. std::string nextSpanId = uuid4_generate(16);
  160. strncpy(nextLink.X_B3_BusinessId, srcBusId.c_str(), 32);
  161. strncpy(nextLink.X_B3_TraceId, srcTraceId.c_str(), 32);
  162. strncpy(nextLink.X_B3_SpanId, nextSpanId.c_str(), 16);
  163. strncpy(nextLink.X_B3_ParentSpanId, srcSpanId.c_str(), 16);
  164. strncpy(nextLink.X_B3_Timestamp, srcTimestamp.c_str(), 16);
  165. HttpClientRequestConfig config(HttpRequestMethod::POST, endpoint, NULL);
  166. HttpClientResponseResult result;
  167. Json::Value businessId;
  168. businessId["installVersion"] = installVersion;
  169. businessId["terminalNo"] = terminalno;
  170. Json::FastWriter writer;
  171. std::string businessId_str = writer.write(businessId);
  172. Json::Value root;
  173. root["channelId"] = channelId;
  174. root["clientSecret"] = tokenSecret;
  175. root["businessId"] = businessId_str;
  176. std::string root_str = writer.write(root);
  177. config.SetJsonBody(root_str);
  178. RestfulClient client = RestfulClient::getInstance();
  179. client.Do(&config, &result, &nextLink);
  180. if (result.ResponseOK()) {
  181. //解析返回字符串
  182. Json::Reader reader;
  183. Json::Value rootRet;
  184. if (!reader.parse(result.content, rootRet, false))
  185. return;
  186. token = rootRet["data"].asString();
  187. if (token.length() > 0)
  188. lastExecutionTime = std::chrono::system_clock::now();
  189. }
  190. };
  191. if (endpoint.length() == 0 && channelId.length() == 0 && endpoint.length() == 0
  192. && tokenSecret.length() == 0 && terminalno.length() == 0 && installVersion.length() == 0)
  193. return std::make_pair("", "");
  194. auto duration = std::chrono::duration_cast<std::chrono::minutes>(std::chrono::system_clock::now() - lastExecutionTime);
  195. if (duration >= interval)//already expired
  196. {
  197. execute_refreshToken();
  198. return std::make_pair(token.length() > 0 ? channelId : "", token.length() > 0 ? token : "");
  199. }
  200. else if (duration >= interval / 2)// pre update token
  201. {
  202. std::string oldToken = token;
  203. std::thread (execute_refreshToken).detach();
  204. return std::make_pair(oldToken.length() > 0 ? channelId : "", oldToken.length() > 0 ? oldToken : "");
  205. }
  206. else
  207. return std::make_pair(token.length() > 0 ? channelId : "", token.length() > 0 ? token : "");
  208. }
  209. };
  210. /*reference example
  211. *
  212. {
  213. "_CMB_LOG_SPEC_VERSION": "2.0",
  214. "level": "DEBUG",
  215. "ts": "2024-09-03T15:09:50.000000000Z",
  216. "type": "BASETYPE",
  217. "serviceUnitId": "LR04.02@FrameworkLib_PRD_PRD",
  218. "log": {
  219. "content": {
  220. "CmptId": "LR04",
  221. "CmptName": "FrameworkLib",
  222. "LogFile": "SD",
  223. "EvenTime": "2024-09-03 15:09:50.414",
  224. "CostTime": 0,
  225. "VtmUuid": "1f595ef586bc427fa49ee5bf9842e110",
  226. "Version": "1.0",
  227. "DateTime": "2024-09-03 15:09:50.414",
  228. "ResultCode": "SUC0000",
  229. "LogCode": "",
  230. "API": "",
  231. "TipMsg": "",
  232. "BussID": "",
  233. "SourceType": "",
  234. "ResultMsg": "ReadConfigValue can not find value:site",
  235. "TraceID": "",
  236. "Item": "1",
  237. "EntityName": "mod_chromium",
  238. "LifeID": 4,
  239. "TimeSn": 125,
  240. "ServName": "7555980277",
  241. "TerminalNo": "7555980277",
  242. "SN": "7.5.1.1",
  243. "ClientIP": "192.168.56.1"
  244. }
  245. }
  246. }
  247. */
  248. void GetTimeStr(time_t time, char* szTime)
  249. {
  250. #if defined(_MSC_VER)
  251. LARGE_INTEGER liTime, liFreq;
  252. double dTime;
  253. struct tm* tm = localtime(&time);
  254. QueryPerformanceFrequency(&liFreq);
  255. QueryPerformanceCounter(&liTime);
  256. dTime = (double)liTime.QuadPart / (double)liFreq.QuadPart;
  257. sprintf(szTime, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
  258. tm->tm_year + 1900,
  259. tm->tm_mon + 1,
  260. tm->tm_mday,
  261. tm->tm_hour,
  262. tm->tm_min,
  263. tm->tm_sec,
  264. (long)(dTime * 1000) % 1000
  265. );
  266. #else
  267. struct timeval tv;
  268. struct tm* tm = localtime(&time);
  269. gettimeofday(&tv, NULL);
  270. sprintf(szTime, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
  271. tm->tm_year + 1900,
  272. tm->tm_mon + 1,
  273. tm->tm_mday,
  274. tm->tm_hour,
  275. tm->tm_min,
  276. tm->tm_sec,
  277. tv.tv_usec / 1000
  278. );
  279. #endif //_MSC_VER
  280. }
  281. Link_private::Link_private(LOG_LEVEL_E t_level, LOG_TYPE_E t_type)
  282. : Level(t_level), Type(t_type), BeginTime(0), EndTime(0), CostTime(0), ResultCode("SUC0000")
  283. {
  284. TraceID = ResultMsg = LogCode = API = BussID = TipMsg = SourceType = recordTime = VtmCode = "";
  285. char nowTime[64] = { 0 };
  286. auto now = time(NULL);
  287. GetTimeStr(now, nowTime);
  288. recordTime = nowTime;
  289. }
  290. class skyeye_sender {
  291. private:
  292. std::mutex m_mtx;
  293. std::list<Link_private> m_msgArr;
  294. std::list<Beidou_private> m_beidouMsgArr;
  295. int m_TimeSn;
  296. std::chrono::system_clock::time_point m_beginTime;
  297. std::string convertBeidouPrivateToStr(const Beidou_private& cur)
  298. {
  299. static char local_ip_str[64] = "0.0.0.0";
  300. static long ipInit = 0;
  301. //get ip every 1000 times
  302. if (ipInit % 1000 == 0)
  303. GetLocalIP(local_ip_str);
  304. ipInit++;
  305. const char* t_header = "[[tracing]]";
  306. Json::Value root;
  307. root["businessId"] = cur.BussID;
  308. root["traceId"] = cur.TraceID;
  309. root["spanId"] = cur.SpanId;
  310. root["parentSpanId"] = cur.ParentSpanId;
  311. root["timestamp"] = cur.t_timeStamp;
  312. root["deployUnitId"] = skyeye_logger::getDefaultLogger().m_constParam.m_deployUnitId;
  313. root["serviceUnitId"] = skyeye_logger::getDefaultLogger().m_constParam.m_serviceUnitId;
  314. root["host"] = cur.Host;
  315. root["api"] = cur.Api;
  316. root["responseTime"] = cur.ResponseTime;
  317. root["returnCode"] = cur.ReturnCode;
  318. root["callStack"] = Json::arrayValue;
  319. root["tags"]["TerminalNo"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
  320. root["dbStack"] = Json::arrayValue; // 空数组
  321. Json::FastWriter writer;
  322. std::string dst = t_header + writer.write(root) + t_header;
  323. return dst;
  324. }
  325. std::string convertLinkPrivateToStr(const Link_private& cur)
  326. {
  327. static char local_ip_str[64] = "0.0.0.0";
  328. static long ipInit = 0;
  329. //get ip every 1000 times
  330. if (ipInit % 1000 == 0)
  331. GetLocalIP(local_ip_str);
  332. ipInit++;
  333. Json::Value root;
  334. root["_CMB_LOG_SPEC_VERSION"] = "2.0";
  335. root["level"] = cur.get_baseLogType();
  336. root["ts"] = cur.recordTime;
  337. root["type"] = "BASETYPE";
  338. root["serviceUnitId"] = skyeye_logger::getDefaultLogger().m_constParam.m_serviceUnitId;
  339. Json::Value root_log;
  340. root_log["CmptId"] = skyeye_logger::getDefaultLogger().m_constParam.m_cmptId;
  341. root_log["CmptName"] = skyeye_logger::getDefaultLogger().m_constParam.m_cmptName;
  342. root_log["LogFile"] = cur.get_LogFile();
  343. root_log["EvenTime"] = cur.recordTime;
  344. root_log["CostTime"] = cur.CostTime;
  345. root_log["VtmUuid"] = get_format_uuid();
  346. root_log["Version"] = "1.0";
  347. root_log["DateTime"] = cur.recordTime;
  348. root_log["ResultCode"] = cur.ResultCode.length() > 0 ? cur.ResultCode : "";
  349. root_log["LogCode"] = cur.LogCode;
  350. root_log["API"] = cur.API;
  351. root_log["TipMsg"] = cur.TipMsg;
  352. root_log["BussID"] = cur.BussID;
  353. root_log["SourceType"] = cur.SourceType;
  354. root_log["ResultMsg"] = cur.ResultMsg;
  355. root_log["TraceID"] = cur.TraceID;
  356. root_log["Item"] = skyeye_logger::getDefaultLogger().m_constParam.m_item;
  357. root_log["EntityName"] = skyeye_logger::getDefaultLogger().m_constParam.m_entityName;
  358. auto currentTime = std::chrono::system_clock::now();
  359. auto elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(currentTime - m_beginTime);
  360. root_log["LifeID"] = elapsedTime.count();
  361. root_log["TimeSn"] = ++m_TimeSn;
  362. root_log["ServName"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
  363. root_log["TerminalNo"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
  364. root_log["SN"] = skyeye_logger::getDefaultLogger().m_constParam.m_version;
  365. root_log["ClientIP"] = local_ip_str;
  366. Json::Value content_log;
  367. content_log["content"] = root_log;
  368. root["log"] = content_log;
  369. Json::FastWriter writer;
  370. std::string dst = writer.write(root);
  371. return dst;
  372. }
  373. public:
  374. static skyeye_sender& getInstance()
  375. {
  376. static skyeye_sender cur;
  377. return cur;
  378. }
  379. void LogToSender(Link_private* msg)
  380. {
  381. m_mtx.lock();
  382. m_msgArr.push_back(*msg);
  383. m_mtx.unlock();
  384. }
  385. void LogToBeidouSender(Beidou_private* msg)
  386. {
  387. m_mtx.lock();
  388. m_beidouMsgArr.push_back(*msg);
  389. m_mtx.unlock();
  390. }
  391. void InitSender(std::string t_endpoint, std::string t_topic, std::string t_beidou_topic)
  392. {
  393. auto skyeye_sender = [this](std::string t_endpoint, std::string t_topic, std::string t_beidou_topic) {
  394. auto beidou_send = [&]{
  395. std::vector<Beidou_private> sendArr;
  396. m_mtx.lock();
  397. //max send 12 logs
  398. for (int i = 0; i < 12; i++)
  399. {
  400. if (m_beidouMsgArr.size() == 0)
  401. break;
  402. sendArr.emplace_back(m_beidouMsgArr.front());
  403. m_beidouMsgArr.pop_front();
  404. }
  405. m_mtx.unlock();
  406. if (sendArr.size() == 0)
  407. return; //no need to send
  408. //generate send str
  409. Json::Value root;
  410. Json::Value arraylist;//消息列表
  411. Json::FastWriter fw;//写入对象
  412. for (int i = 0; i < sendArr.size(); i++)
  413. arraylist[i] = convertBeidouPrivateToStr(sendArr[i]);
  414. root["message_list"] = arraylist;
  415. root["topic"] = t_beidou_topic;
  416. auto sendStr = fw.write(root);
  417. //send
  418. HttpClientResponseResult result;
  419. HttpClientRequestConfig config(HttpRequestMethod::POST, t_endpoint, skyeye_GetToken);
  420. config.SetTimeout(60);
  421. config.SetJsonBody(sendStr.c_str());
  422. RestfulClient client = RestfulClient::getInstance();
  423. config.PreDo();
  424. client.Do(&config, &result, NULL);
  425. if (result.ResponseOK()) {
  426. struct CommResponse
  427. {
  428. bool success;
  429. std::string errorCode;
  430. std::string returnCode;
  431. std::string errorMsg;
  432. std::string message;
  433. JSONCONVERT2OBJECT_MEMEBER_REGISTER(success, errorCode, returnCode, errorMsg, message)
  434. JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("success", "code", "return_code", "error_msg", "message")
  435. } responseIns;
  436. Json::Value rawRoot;
  437. if (GetJsonRootObject(rawRoot, result.content) && Json2Object(responseIns, rawRoot)) {
  438. if (!responseIns.success)
  439. {
  440. if (responseIns.errorCode.find("RTI1002") != -1)
  441. {
  442. m_mtx.lock();
  443. for (auto it : sendArr)
  444. m_beidouMsgArr.emplace_back(it);
  445. m_mtx.unlock();
  446. std::this_thread::sleep_for(std::chrono::seconds(30));//upload logs failed
  447. }
  448. }
  449. }
  450. }
  451. else
  452. {
  453. m_mtx.lock();
  454. for (auto it : sendArr)
  455. m_beidouMsgArr.emplace_back(it);
  456. m_mtx.unlock();
  457. }
  458. };
  459. auto skyeye_send = [&]{
  460. std::vector<Link_private> sendArr;
  461. m_mtx.lock();
  462. //max send 12 logs
  463. for (int i = 0; i < 12; i++)
  464. {
  465. if (m_msgArr.size() == 0)
  466. break;
  467. sendArr.emplace_back(m_msgArr.front());
  468. m_msgArr.pop_front();
  469. }
  470. m_mtx.unlock();
  471. if (sendArr.size() == 0)
  472. return; //no need to send
  473. //generate send str
  474. Json::Value root;
  475. Json::Value arraylist;//消息列表
  476. Json::FastWriter fw;//写入对象
  477. for (int i = 0; i < sendArr.size(); i++)
  478. arraylist[i] = convertLinkPrivateToStr(sendArr[i]);
  479. root["message_list"] = arraylist;
  480. root["topic"] = t_topic;
  481. auto sendStr = fw.write(root);
  482. //send
  483. HttpClientResponseResult result;
  484. HttpClientRequestConfig config(HttpRequestMethod::POST, t_endpoint, skyeye_GetToken);
  485. config.SetTimeout(60);
  486. config.SetJsonBody(sendStr.c_str());
  487. RestfulClient client = RestfulClient::getInstance();
  488. config.PreDo();
  489. client.Do(&config, &result, NULL);
  490. if (result.ResponseOK()) {
  491. struct CommResponse
  492. {
  493. bool success;
  494. std::string errorCode;
  495. std::string returnCode;
  496. std::string errorMsg;
  497. std::string message;
  498. JSONCONVERT2OBJECT_MEMEBER_REGISTER(success, errorCode, returnCode, errorMsg, message)
  499. JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("success", "code", "return_code", "error_msg", "message")
  500. } responseIns;
  501. Json::Value rawRoot;
  502. if (GetJsonRootObject(rawRoot, result.content) && Json2Object(responseIns, rawRoot)) {
  503. if (!responseIns.success)
  504. {
  505. if (responseIns.errorCode.find("RTI1002") != -1)
  506. {
  507. m_mtx.lock();
  508. for (auto it : sendArr)
  509. m_msgArr.emplace_back(it);
  510. m_mtx.unlock();
  511. std::this_thread::sleep_for(std::chrono::seconds(30));//upload logs failed
  512. }
  513. }
  514. }
  515. }
  516. else
  517. {
  518. m_mtx.lock();
  519. for (auto it : sendArr)
  520. m_msgArr.emplace_back(it);
  521. m_mtx.unlock();
  522. }
  523. };
  524. while (true)
  525. {
  526. if (m_msgArr.empty() && m_beidouMsgArr.empty())
  527. {
  528. std::this_thread::sleep_for(std::chrono::seconds(1));//every 1 seconds
  529. continue;
  530. }
  531. if (!m_msgArr.empty())
  532. skyeye_send();
  533. if (!m_beidouMsgArr.empty())
  534. beidou_send();
  535. }
  536. };
  537. std::thread(skyeye_sender, t_endpoint, t_topic, t_beidou_topic).detach();
  538. }
  539. skyeye_sender()
  540. : m_TimeSn(0)
  541. {
  542. };
  543. };
  544. #define MAX_TOKEN_LEN 256
  545. void skyeye_GetToken(char* channelId, char* token, char* terminalno, char* reserve1)
  546. {
  547. auto tokenInfo = TokenManager::getInstance().getToken();
  548. auto terminalnoInfo = TokenManager::getInstance().getTerminalNo();
  549. snprintf(channelId, MAX_TOKEN_LEN, "%s", tokenInfo.first.c_str());
  550. snprintf(token, MAX_TOKEN_LEN, "%s", tokenInfo.second.c_str());
  551. snprintf(terminalno, MAX_TOKEN_LEN, "%s", terminalnoInfo.c_str());
  552. }
  553. skyeye_logger& skyeye_logger::getDefaultLogger()
  554. {
  555. // TODO: 在此处插入 return 语句
  556. static skyeye_logger cur;
  557. if (cur.m_msg == nullptr)
  558. cur.m_msg = new Link_private(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM);
  559. else
  560. {
  561. delete cur.m_msg;
  562. cur.m_msg = new Link_private(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM);
  563. }
  564. return cur;
  565. }
  566. skyeye_logger& skyeye_logger::setLogLevel(LOG_LEVEL_E t_level)
  567. {
  568. // TODO: 在此处插入 return 语句
  569. if (m_msg != nullptr)
  570. m_msg->Level = t_level;
  571. return *this;
  572. }
  573. skyeye_logger& skyeye_logger::setLogType(LOG_TYPE_E t_type)
  574. {
  575. // TODO: 在此处插入 return 语句
  576. if (m_msg != nullptr)
  577. m_msg->Type = t_type;
  578. return *this;
  579. }
  580. skyeye_logger& skyeye_logger::setResultCode(std::string t_ResultCode)
  581. {
  582. // TODO: 在此处插入 return 语句
  583. if (m_msg != nullptr)
  584. m_msg->ResultCode = t_ResultCode;
  585. return *this;
  586. }
  587. skyeye_logger& skyeye_logger::setTraceID(std::string t_TraceID)
  588. {
  589. // TODO: 在此处插入 return 语句
  590. if (m_msg != nullptr)
  591. m_msg->TraceID = t_TraceID;
  592. return *this;
  593. }
  594. skyeye_logger& skyeye_logger::setResultMsg(std::string t_ResultMsg)
  595. {
  596. // TODO: 在此处插入 return 语句
  597. if (m_msg != nullptr)
  598. m_msg->ResultMsg = t_ResultMsg;
  599. return *this;
  600. }
  601. skyeye_logger& skyeye_logger::setLogCode(std::string t_LogCode)
  602. {
  603. // TODO: 在此处插入 return 语句
  604. if (m_msg != nullptr)
  605. m_msg->LogCode = t_LogCode;
  606. return *this;
  607. }
  608. skyeye_logger& skyeye_logger::setAPI(std::string t_API)
  609. {
  610. // TODO: 在此处插入 return 语句
  611. if (m_msg != nullptr)
  612. m_msg->API = t_API;
  613. return *this;
  614. }
  615. skyeye_logger& skyeye_logger::setBussID(std::string t_BussID)
  616. {
  617. // TODO: 在此处插入 return 语句
  618. if (m_msg != nullptr)
  619. m_msg->BussID = t_BussID;
  620. return *this;
  621. }
  622. skyeye_logger& skyeye_logger::setTipMsg(std::string t_TipMsg)
  623. {
  624. // TODO: 在此处插入 return 语句
  625. if (m_msg != nullptr)
  626. m_msg->TipMsg = t_TipMsg;
  627. return *this;
  628. }
  629. skyeye_logger& skyeye_logger::setSourceType(std::string t_SourceType)
  630. {
  631. // TODO: 在此处插入 return 语句
  632. if (m_msg != nullptr)
  633. m_msg->SourceType = t_SourceType;
  634. return *this;
  635. }
  636. skyeye_logger& skyeye_logger::setBeginTime(long t_BeginTime)
  637. {
  638. // TODO: 在此处插入 return 语句
  639. if (m_msg != nullptr)
  640. m_msg->BeginTime = t_BeginTime;
  641. return *this;
  642. }
  643. skyeye_logger& skyeye_logger::setEndTime(long t_EndTime)
  644. {
  645. // TODO: 在此处插入 return 语句
  646. if (m_msg != nullptr)
  647. m_msg->EndTime = t_EndTime;
  648. return *this;
  649. }
  650. skyeye_logger& skyeye_logger::setCostTime(long t_costTime)
  651. {
  652. // TODO: 在此处插入 return 语句
  653. if (m_msg != nullptr)
  654. m_msg->CostTime = t_costTime;
  655. return *this;
  656. }
  657. skyeye_logger& skyeye_logger::setVtmCode(std::string t_VtmCode)
  658. {
  659. // TODO: 在此处插入 return 语句
  660. if (m_msg != nullptr)
  661. m_msg->VtmCode = t_VtmCode;
  662. return *this;
  663. }
  664. void skyeye_logger::operator()(LOG_LEVEL_E t_level, const char* str, ...)
  665. {
  666. if (m_msg != nullptr)
  667. {
  668. if (str == nullptr)
  669. return;
  670. va_list arg;
  671. va_start(arg, str);
  672. int n = _vscprintf(str, arg) + 1;
  673. if (n > MAX_LOG_LEN) {
  674. n = MAX_LOG_LEN;
  675. }
  676. std::vector<char> buf(n + 1, '\0');
  677. vsnprintf(&buf[0], n, str, arg);
  678. va_end(arg);
  679. m_msg->Level = t_level;
  680. m_msg->ResultMsg = &buf[0];
  681. skyeye_sender::getInstance().LogToSender(m_msg);
  682. delete m_msg;
  683. m_msg = nullptr;
  684. }
  685. }
  686. void CreateDefaultLogger(std::string logEndpoint, std::string logTopic,std::string tokenEndpoint, std::string channelId, std::string tokenSecret, Link_const constParam)
  687. {
  688. skyeye_logger::getDefaultLogger().m_constParam = constParam;
  689. TokenManager::getInstance().InitTokenManager(30, tokenEndpoint, channelId, tokenSecret, constParam.m_terminalNo, constParam.m_version);
  690. std::string beidouTopic = SpDefine::topicBeidou;
  691. skyeye_sender::getInstance().InitSender(logEndpoint, logTopic, beidouTopic);
  692. }
  693. void CreateDefaultLogger(std::string terminalno, std::string version, std::string entityName, std::string itemId)
  694. {
  695. Link_const constParam;
  696. constParam.m_entityName = entityName;
  697. constParam.m_item = itemId;
  698. constParam.m_terminalNo = terminalno;
  699. constParam.m_version = version;
  700. constParam.m_cmptId = SpDefine::cmptId;
  701. constParam.m_cmptName = SpDefine::CmptName;
  702. constParam.m_serviceUnitId = SpDefine::serviceUnitId;
  703. constParam.m_deployUnitId = SpDefine::deployUnitId;
  704. //std::this_thread::sleep_for(std::chrono::seconds(10));//every 30 seconds
  705. skyeye_logger::getDefaultLogger().m_constParam = constParam;
  706. TokenManager::getInstance().InitTokenManager(30, SpDefine::CommonLaunchUrl, SpDefine::channelId, SpDefine::tokenSecret, constParam.m_terminalNo, constParam.m_version);
  707. //skyeye_sender::getInstance();
  708. std::string endpoint = SpDefine::endpoint_env;
  709. std::string topic = SpDefine::topicSys;
  710. std::string beidouTopic = SpDefine::topicBeidou;
  711. skyeye_sender::getInstance().InitSender(endpoint, topic, beidouTopic);
  712. }
  713. skyeye_logger& GetDefaultLogger()
  714. {
  715. return skyeye_logger::getDefaultLogger();
  716. }
  717. beidou_logger& beidou_logger::getDefaultLogger(const HttpClientTraceLink& t_context, const std::string& t_Api)
  718. {
  719. // TODO: 在此处插入 return 语句
  720. static beidou_logger cur;
  721. if (cur.m_msg == nullptr)
  722. cur.m_msg = new Beidou_private(t_context, t_Api);
  723. else
  724. {
  725. delete cur.m_msg;
  726. cur.m_msg = new Beidou_private(t_context, t_Api);
  727. }
  728. return cur;
  729. }
  730. beidou_logger& beidou_logger::setHost(std::string t_host) {
  731. m_msg->Host = t_host;
  732. return *this;
  733. }
  734. beidou_logger& beidou_logger::setReturnCode(std::string t_ReturnCode) {
  735. m_msg->ReturnCode = t_ReturnCode;
  736. return *this;
  737. }
  738. beidou_logger& beidou_logger::setResponseTime(std::string t_ResponseTime) {
  739. m_msg->ResponseTime = t_ResponseTime;
  740. return *this;
  741. }
  742. beidou_logger& beidou_logger::set_deployUnitId(std::string t_deployUnitId) {
  743. m_msg->deployUnitId = t_deployUnitId;
  744. return *this;
  745. }
  746. beidou_logger& beidou_logger::set_serviceUnitId(std::string t_serviceUnitId) {
  747. m_msg->serviceUnitId = t_serviceUnitId;
  748. return *this;
  749. }
  750. void beidou_logger::operator () () {
  751. if(m_msg)
  752. {
  753. skyeye_sender::getInstance().LogToBeidouSender(m_msg);
  754. delete m_msg;
  755. m_msg = nullptr;
  756. }
  757. }