skyeyeLog.cpp 23 KB

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