skyeyeLog.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. #include "skyeyeLog.h"
  2. #include "RestfulFunc.h"
  3. #include "json/json.h"
  4. #include <chrono>
  5. #include <thread>
  6. #include <mutex>
  7. #include "uuid4.h"
  8. #include "SpDefine.h"
  9. #include <list>
  10. #include <cstdarg>
  11. #if (defined _WIN32 || defined _WIN64)
  12. #else
  13. #include <winpr/string.h>
  14. #endif
  15. #define MAX_LOG_LEN 1900
  16. void skyeye_GetToken(char* channelId, char* token, char* terminalno, char* reserve1);
  17. void GetUnitedTimeStr(time_t time, char* szTime)
  18. {
  19. struct tm* tm = localtime(&time);
  20. sprintf(szTime, "%04d-%02d-%02dT%02d:%02d:%02d.000000000Z",
  21. tm->tm_year + 1900,
  22. tm->tm_mon + 1,
  23. tm->tm_mday,
  24. tm->tm_hour,
  25. tm->tm_min,
  26. tm->tm_sec
  27. );
  28. }
  29. std::string get_format_uuid()
  30. {
  31. char strbuffer[64] = "";
  32. int uuidlen = 0;
  33. uuid4_init();
  34. uuid4_generate(strbuffer);
  35. return strbuffer;
  36. }
  37. class TokenManager {
  38. private:
  39. std::string endpoint;
  40. std::string channelId;
  41. std::string tokenSecret;
  42. std::string terminalno;
  43. std::string installVersion;
  44. //need return channelId and token
  45. std::string token;
  46. //every 20 minites execute getToken task
  47. std::chrono::system_clock::time_point lastExecutionTime;
  48. std::chrono::minutes interval;
  49. public:
  50. static TokenManager& getInstance()
  51. {
  52. static TokenManager cur;
  53. return cur;
  54. }
  55. void InitTokenManager(int t_expired_min, std::string t_endpoint, std::string t_channelId,
  56. std::string t_tokenSecret, std::string t_terminalno, std::string t_installVersion)
  57. {
  58. interval = std::chrono::minutes(t_expired_min);
  59. endpoint = t_endpoint + "/api/auth/v2/token";
  60. channelId = t_channelId;
  61. tokenSecret = t_tokenSecret;
  62. terminalno = t_terminalno;
  63. installVersion = t_installVersion;
  64. getToken();
  65. }
  66. std::string getTerminalNo()
  67. {
  68. return terminalno;
  69. }
  70. std::pair<std::string ,std::string> getToken()
  71. {
  72. auto execute_refreshToken = [this] {
  73. HttpClientRequestConfig config(HttpRequestMethod::POST, endpoint, NULL);
  74. HttpClientResponseResult result;
  75. Json::Value businessId;
  76. businessId["installVersion"] = installVersion;
  77. businessId["terminalNo"] = terminalno;
  78. Json::FastWriter writer;
  79. std::string businessId_str = writer.write(businessId);
  80. Json::Value root;
  81. root["channelId"] = channelId;
  82. root["clientSecret"] = tokenSecret;
  83. root["businessId"] = businessId_str;
  84. std::string root_str = writer.write(root);
  85. config.SetJsonBody(root_str);
  86. RestfulClient client = RestfulClient::getInstance();
  87. client.Do(&config, &result);
  88. if (result.ResponseOK()) {
  89. //解析返回字符串
  90. Json::Reader reader;
  91. Json::Value rootRet;
  92. if (!reader.parse(result.content, rootRet, false))
  93. return;
  94. token = rootRet["data"].asString();
  95. if (token.length() > 0)
  96. lastExecutionTime = std::chrono::system_clock::now();
  97. }
  98. };
  99. if (endpoint.length() == 0 && channelId.length() == 0 && endpoint.length() == 0
  100. && tokenSecret.length() == 0 && terminalno.length() == 0 && installVersion.length() == 0)
  101. return std::make_pair("", "");
  102. auto duration = std::chrono::duration_cast<std::chrono::minutes>(std::chrono::system_clock::now() - lastExecutionTime);
  103. if (duration >= interval)//already expired
  104. {
  105. execute_refreshToken();
  106. return std::make_pair(token.length() > 0 ? channelId : "", token.length() > 0 ? token : "");
  107. }
  108. else if (duration >= interval / 2)// pre update token
  109. {
  110. std::string oldToken = token;
  111. std::thread (execute_refreshToken).detach();
  112. return std::make_pair(oldToken.length() > 0 ? channelId : "", oldToken.length() > 0 ? oldToken : "");
  113. }
  114. else
  115. return std::make_pair(token.length() > 0 ? channelId : "", token.length() > 0 ? token : "");
  116. }
  117. };
  118. /*reference example
  119. *
  120. {
  121. "_CMB_LOG_SPEC_VERSION": "2.0",
  122. "level": "DEBUG",
  123. "ts": "2024-09-03T15:09:50.000000000Z",
  124. "type": "BASETYPE",
  125. "serviceUnitId": "LR04.02@FrameworkLib_PRD_PRD",
  126. "log": {
  127. "content": {
  128. "CmptId": "LR04",
  129. "CmptName": "FrameworkLib",
  130. "LogFile": "SD",
  131. "EvenTime": "2024-09-03 15:09:50.414",
  132. "CostTime": 0,
  133. "VtmUuid": "1f595ef586bc427fa49ee5bf9842e110",
  134. "Version": "1.0",
  135. "DateTime": "2024-09-03 15:09:50.414",
  136. "ResultCode": "SUC0000",
  137. "LogCode": "",
  138. "API": "",
  139. "TipMsg": "",
  140. "BussID": "",
  141. "SourceType": "",
  142. "ResultMsg": "ReadConfigValue can not find value:site",
  143. "TraceID": "",
  144. "Item": "1",
  145. "EntityName": "mod_chromium",
  146. "LifeID": 4,
  147. "TimeSn": 125,
  148. "ServName": "7555980277",
  149. "TerminalNo": "7555980277",
  150. "SN": "7.5.1.1",
  151. "ClientIP": "192.168.56.1"
  152. }
  153. }
  154. }
  155. */
  156. class skyeye_sender {
  157. private:
  158. std::mutex m_mtx;
  159. std::list<Link_private> m_msgArr;
  160. int m_TimeSn;
  161. std::chrono::system_clock::time_point m_beginTime;
  162. std::string convertLinkPrivateToStr(const Link_private& cur)
  163. {
  164. Json::Value root;
  165. root["_CMB_LOG_SPEC_VERSION"] = "2.0";
  166. root["level"] = cur.get_baseLogType();
  167. root["ts"] = cur.recordTime;
  168. root["type"] = "BASETYPE";
  169. root["serviceUnitId"] = skyeye_logger::getDefaultLogger().m_constParam.m_serviceUnitId;
  170. Json::Value root_log;
  171. root_log["CmptId"] = skyeye_logger::getDefaultLogger().m_constParam.m_cmptId;
  172. root_log["CmptName"] = skyeye_logger::getDefaultLogger().m_constParam.m_cmptName;
  173. root_log["LogFile"] = cur.get_LogFile();
  174. root_log["EvenTime"] = cur.recordTime;
  175. root_log["CostTime"] = cur.CostTime;
  176. root_log["VtmUuid"] = get_format_uuid();
  177. root_log["Version"] = "1.0";
  178. root_log["DateTime"] = cur.recordTime;
  179. root_log["ResultCode"] = cur.ResultCode.length() > 0 ? cur.ResultCode : "";
  180. root_log["LogCode"] = cur.LogCode;
  181. root_log["API"] = cur.API;
  182. root_log["TipMsg"] = cur.TipMsg;
  183. root_log["BussID"] = cur.BussID;
  184. root_log["SourceType"] = cur.SourceType;
  185. root_log["ResultMsg"] = cur.ResultMsg;
  186. root_log["TraceID"] = cur.TraceID;
  187. root_log["Item"] = skyeye_logger::getDefaultLogger().m_constParam.m_item;
  188. root_log["EntityName"] = skyeye_logger::getDefaultLogger().m_constParam.m_entityName;
  189. auto currentTime = std::chrono::system_clock::now();
  190. auto elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(currentTime - m_beginTime);
  191. root_log["LifeID"] = elapsedTime.count();
  192. root_log["TimeSn"] = ++m_TimeSn;
  193. root_log["ServName"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
  194. root_log["TerminalNo"] = skyeye_logger::getDefaultLogger().m_constParam.m_terminalNo;
  195. root_log["SN"] = skyeye_logger::getDefaultLogger().m_constParam.m_version;
  196. root_log["ClientIP"] = "0.0.0.0";
  197. Json::Value content_log;
  198. content_log["content"] = root_log;
  199. root["log"] = content_log;
  200. Json::FastWriter writer;
  201. std::string dst = writer.write(root);
  202. return dst;
  203. }
  204. public:
  205. static skyeye_sender& getInstance()
  206. {
  207. static skyeye_sender cur;
  208. return cur;
  209. }
  210. void LogToSender(Link_private* msg)
  211. {
  212. m_mtx.lock();
  213. m_msgArr.push_back(*msg);
  214. m_mtx.unlock();
  215. }
  216. bool InitSender(std::string t_endpoint, std::string t_topic)
  217. {
  218. auto skyeye_sender = [this](std::string t_endpoint, std::string t_topic) {
  219. while (true)
  220. {
  221. if (m_msgArr.empty())
  222. std::this_thread::sleep_for(std::chrono::seconds(30));//every 30 seconds
  223. std::vector<Link_private> sendArr;
  224. m_mtx.lock();
  225. //max send 12 logs
  226. for (int i = 0; i < 12; i++)
  227. {
  228. if (m_msgArr.size() == 0)
  229. break;
  230. sendArr.emplace_back(m_msgArr.front());
  231. m_msgArr.pop_front();
  232. }
  233. m_mtx.unlock();
  234. if (sendArr.size() == 0)
  235. return; //no need to send
  236. //generate send str
  237. Json::Value root;
  238. Json::Value arraylist;//消息列表
  239. Json::FastWriter fw;//写入对象
  240. for (int i = 0; i < sendArr.size(); i++)
  241. {
  242. arraylist[i] = convertLinkPrivateToStr(sendArr[i]);
  243. }
  244. root["message_list"] = arraylist;
  245. root["topic"] = t_topic;
  246. auto sendStr = fw.write(root);
  247. //send
  248. HttpClientResponseResult result;
  249. HttpClientRequestConfig config(HttpRequestMethod::POST, t_endpoint, skyeye_GetToken);
  250. config.SetTimeout(60);
  251. config.SetJsonBody(sendStr.c_str());
  252. RestfulClient client = RestfulClient::getInstance();
  253. config.PreDo();
  254. client.Do(&config, &result);
  255. }
  256. };
  257. std::thread(skyeye_sender, t_endpoint, t_topic).detach();
  258. }
  259. skyeye_sender()
  260. : m_TimeSn(0)
  261. {
  262. };
  263. };
  264. #define MAX_TOKEN_LEN 256
  265. void skyeye_GetToken(char* channelId, char* token, char* terminalno, char* reserve1)
  266. {
  267. auto tokenInfo = TokenManager::getInstance().getToken();
  268. auto terminalnoInfo = TokenManager::getInstance().getTerminalNo();
  269. snprintf(channelId, MAX_TOKEN_LEN, "%s", tokenInfo.first.c_str());
  270. snprintf(token, MAX_TOKEN_LEN, "%s", tokenInfo.second.c_str());
  271. snprintf(terminalno, MAX_TOKEN_LEN, "%s", terminalnoInfo.c_str());
  272. }
  273. skyeye_logger& skyeye_logger::getDefaultLogger()
  274. {
  275. // TODO: 在此处插入 return 语句
  276. static skyeye_logger cur;
  277. if (cur.m_msg == nullptr)
  278. cur.m_msg = new Link_private(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM);
  279. else
  280. {
  281. delete cur.m_msg;
  282. cur.m_msg = new Link_private(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM);
  283. }
  284. return cur;
  285. }
  286. skyeye_logger& skyeye_logger::setLogLevel(LOG_LEVEL_E t_level)
  287. {
  288. // TODO: 在此处插入 return 语句
  289. if (m_msg != nullptr)
  290. m_msg->Level = t_level;
  291. return *this;
  292. }
  293. skyeye_logger& skyeye_logger::setLogType(LOG_TYPE_E t_type)
  294. {
  295. // TODO: 在此处插入 return 语句
  296. if (m_msg != nullptr)
  297. m_msg->Type = t_type;
  298. return *this;
  299. }
  300. skyeye_logger& skyeye_logger::setResultCode(std::string t_ResultCode)
  301. {
  302. // TODO: 在此处插入 return 语句
  303. if (m_msg != nullptr)
  304. m_msg->ResultCode = t_ResultCode;
  305. return *this;
  306. }
  307. skyeye_logger& skyeye_logger::setTraceID(std::string t_TraceID)
  308. {
  309. // TODO: 在此处插入 return 语句
  310. if (m_msg != nullptr)
  311. m_msg->TraceID = t_TraceID;
  312. return *this;
  313. }
  314. skyeye_logger& skyeye_logger::setResultMsg(std::string t_ResultMsg)
  315. {
  316. // TODO: 在此处插入 return 语句
  317. if (m_msg != nullptr)
  318. m_msg->ResultMsg = t_ResultMsg;
  319. return *this;
  320. }
  321. skyeye_logger& skyeye_logger::setLogCode(std::string t_LogCode)
  322. {
  323. // TODO: 在此处插入 return 语句
  324. if (m_msg != nullptr)
  325. m_msg->LogCode = t_LogCode;
  326. return *this;
  327. }
  328. skyeye_logger& skyeye_logger::setAPI(std::string t_API)
  329. {
  330. // TODO: 在此处插入 return 语句
  331. if (m_msg != nullptr)
  332. m_msg->API = t_API;
  333. return *this;
  334. }
  335. skyeye_logger& skyeye_logger::setBussID(std::string t_BussID)
  336. {
  337. // TODO: 在此处插入 return 语句
  338. if (m_msg != nullptr)
  339. m_msg->BussID = t_BussID;
  340. return *this;
  341. }
  342. skyeye_logger& skyeye_logger::setTipMsg(std::string t_TipMsg)
  343. {
  344. // TODO: 在此处插入 return 语句
  345. if (m_msg != nullptr)
  346. m_msg->TipMsg = t_TipMsg;
  347. return *this;
  348. }
  349. skyeye_logger& skyeye_logger::setSourceType(std::string t_SourceType)
  350. {
  351. // TODO: 在此处插入 return 语句
  352. if (m_msg != nullptr)
  353. m_msg->SourceType = t_SourceType;
  354. return *this;
  355. }
  356. skyeye_logger& skyeye_logger::setBeginTime(long t_BeginTime)
  357. {
  358. // TODO: 在此处插入 return 语句
  359. if (m_msg != nullptr)
  360. m_msg->BeginTime = t_BeginTime;
  361. return *this;
  362. }
  363. skyeye_logger& skyeye_logger::setEndTime(long t_EndTime)
  364. {
  365. // TODO: 在此处插入 return 语句
  366. if (m_msg != nullptr)
  367. m_msg->EndTime = t_EndTime;
  368. return *this;
  369. }
  370. skyeye_logger& skyeye_logger::setCostTime(long t_costTime)
  371. {
  372. // TODO: 在此处插入 return 语句
  373. if (m_msg != nullptr)
  374. m_msg->CostTime = t_costTime;
  375. return *this;
  376. }
  377. skyeye_logger& skyeye_logger::setVtmCode(std::string t_VtmCode)
  378. {
  379. // TODO: 在此处插入 return 语句
  380. if (m_msg != nullptr)
  381. m_msg->VtmCode = t_VtmCode;
  382. return *this;
  383. }
  384. void skyeye_logger::operator()(LOG_LEVEL_E t_level, const char* str, ...)
  385. {
  386. if (m_msg != nullptr)
  387. {
  388. if (str == nullptr)
  389. return;
  390. va_list arg;
  391. va_start(arg, str);
  392. int n = _vscprintf(str, arg) + 1;
  393. if (n > MAX_LOG_LEN) {
  394. n = MAX_LOG_LEN;
  395. }
  396. std::vector<char> buf(n + 1, '\0');
  397. vsnprintf(&buf[0], n, str, arg);
  398. va_end(arg);
  399. m_msg->Level = t_level;
  400. m_msg->ResultMsg = &buf[0];
  401. skyeye_sender::getInstance().LogToSender(m_msg);
  402. delete m_msg;
  403. m_msg = nullptr;
  404. }
  405. }
  406. void CreateDefaultLogger(std::string logEndpoint, std::string logTopic,std::string tokenEndpoint, std::string channelId, std::string tokenSecret, Link_const constParam)
  407. {
  408. skyeye_logger::getDefaultLogger().m_constParam = constParam;
  409. TokenManager::getInstance().InitTokenManager(30, tokenEndpoint, channelId, tokenSecret, constParam.m_terminalNo, constParam.m_version);
  410. skyeye_sender::getInstance().InitSender(logEndpoint, logTopic);
  411. }
  412. void CreateDefaultLogger(std::string terminalno, std::string version, std::string entityName, std::string itemId)
  413. {
  414. Link_const constParam;
  415. constParam.m_entityName = entityName;
  416. constParam.m_item = itemId;
  417. constParam.m_terminalNo = terminalno;
  418. constParam.m_version = version;
  419. constParam.m_cmptId = SpDefine::cmptId;
  420. constParam.m_cmptName = SpDefine::CmptName;
  421. constParam.m_serviceUnitId = SpDefine::serviceUnitId;
  422. constParam.m_deployUnitId = SpDefine::deployUnitId;
  423. skyeye_logger::getDefaultLogger().m_constParam = constParam;
  424. TokenManager::getInstance().InitTokenManager(30, SpDefine::CommonLaunchUrl, SpDefine::channelId, SpDefine::tokenSecret, constParam.m_terminalNo, constParam.m_version);
  425. skyeye_sender::getInstance().InitSender(SpDefine::endpoint_env, SpDefine::topicSys);
  426. }
  427. skyeye_logger& GetDefaultLogger()
  428. {
  429. return skyeye_logger::getDefaultLogger();
  430. }