skyeyeLog.cpp 12 KB

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