诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

618 lines
16 KiB

  1. #include "StdAfx.h"
  2. #include "TraceService.h" // #include "EventService.h"
  3. #include "../Spdlog/spdlog/sinks/base_sink.h"
  4. #include "../Spdlog/spdlog/sinks/msvc_sink.h"
  5. #include "../Spdlog/spdlog/sinks/stdout_color_sinks.h"
  6. #include "../Spdlog/spdlog/sinks/daily_file_sink.h"
  7. #include "../Spdlog/spdlog/sinks/basic_file_sink.h"
  8. //////////////////////////////////////////////////////////////////////////
  9. //颜色定义
  10. #define COLOR_TIME RGB(0,0,0)
  11. #define COLOR_NORMAL RGB(125,125,125)
  12. #define COLOR_WARN RGB(255,128,0)
  13. #define COLOR_EXCEPTION RGB(200,0,0)
  14. #define COLOR_DEBUG RGB(0,128,128)
  15. #define EVENT_LEVEL_COUNT 5
  16. #define IDM_MENU0 100
  17. #define IDM_MENU1 110
  18. #define IDM_MENU2 120
  19. #define IDM_MENU3 130
  20. #define IDM_MENU4 140
  21. #define IDM_MENU5 150
  22. //////////////////////////////////////////////////////////////////////////
  23. //追踪服务
  24. //////////////////////////////////////////////////////////////////////////
  25. Logger::~Logger()
  26. {
  27. };
  28. //Spdlog
  29. void Logger::ShutDown()
  30. {
  31. spdlog::shutdown();
  32. };
  33. Logger& Logger::GetInstance()
  34. {
  35. static Logger _log;
  36. return _log;
  37. }
  38. std::shared_ptr<spdlog::logger> Logger::GetTableLogger(int tableId)
  39. {
  40. if (tablelogger_.count(tableId))
  41. {
  42. return tablelogger_.at(tableId);
  43. }
  44. //创建新的logger
  45. auto new_loger = spdlog::basic_logger_mt(fmt::format("{}", tableId), fmt::format("{}table_{}.log", logfile_dir_, tableId));
  46. tablelogger_[tableId] = new_loger;
  47. return new_loger;
  48. }
  49. void Logger::DeleteTableLogger(int tableId)
  50. {
  51. if (tablelogger_.count(tableId))
  52. {
  53. spdlog::drop(fmt::format("{}", tableId));
  54. tablelogger_.erase(tableId);
  55. }
  56. }
  57. ;
  58. bool Logger::InitDefaultLog(std::string logger_name, std::string file_name, spdlog::level::level_enum log_level /*= spdlog::level::trace*/)
  59. {
  60. [](const char* dir, size_t len = 0) -> bool {
  61. assert(dir != NULL);
  62. if (len < 1 || len > 1024)
  63. return false;
  64. char* head, * p;
  65. char tmpDir[1024] = { 0 };
  66. // strcpy_s(tmpDir, 1024, dir); //拷贝1024字节发现,len之后的字符全部变为-2
  67. strcpy_s(tmpDir, len + 1, dir);
  68. head = tmpDir;
  69. if (*head == '\\' || *head == '/')
  70. ++head;
  71. p = head;
  72. if (*(tmpDir + len - 1) != '\\' && *(tmpDir + len - 1) != '/')
  73. *(tmpDir + len) = '\\';
  74. while (*p)
  75. {
  76. if (*p == '\\' || *p == '/')
  77. {
  78. *p = '\0';
  79. if (_access(head, 0)) // 头文件io.h
  80. {
  81. if (_mkdir(head))
  82. {
  83. #ifdef _DEBUG
  84. fprintf(stderr, "Failed to create directory %s\n", head);
  85. return false;
  86. #endif
  87. }
  88. }
  89. *p = '\\';
  90. }
  91. ++p;
  92. }
  93. return true;
  94. }("logs");
  95. spdlog::set_level(spdlog::level::trace);
  96. //SPDLOG_TRACE("Some trace message.. {} ,{}", 1, 3.23);
  97. //SPDLOG_DEBUG("Some debug message.. {} ,{}", 1, 3.23);
  98. //设置为异步日志
  99. // spdlog::set_async_mode(32768); // 必须为 2 的幂
  100. //spdlog::pattern_formatter formatter("%g", spdlog::pattern_time_type::local, "");
  101. //创建一个对应多个sink的_logger_,每一个sink都有独有的格式和日志级别
  102. std::vector<std::shared_ptr<spdlog::sinks::sink>> logger_sinks;
  103. //#ifdef _CONSOLE
  104. #ifdef _DEBUG
  105. auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  106. console_sink->set_level(log_level);
  107. console_sink->set_pattern("[%m-%d %H:%M:%S.%e][%^%L%$] [%t:%@] %v");
  108. logger_sinks.push_back(console_sink);
  109. #endif
  110. // Create a daily logger - a new file is created every day on 2:30am.
  111. logfile_dir_ = fmt::format("logs/{}/", CT2A(AfxGetAppName()));
  112. auto dailyfile_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>(logfile_dir_ + file_name, 23, 59, true);
  113. dailyfile_sink->set_level(log_level);
  114. //格式说明参照https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
  115. dailyfile_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%t:%@] %v");
  116. logger_sinks.push_back(dailyfile_sink);
  117. #ifdef _WIN32
  118. //使用OutputDebugStringA窗口输出日志
  119. auto vs_sink = std::make_shared<spdlog::sinks::msvc_sink_mt>();
  120. vs_sink->set_level(log_level);
  121. vs_sink->set_pattern("[%m-%d %H:%M:%S.%e] [%^%l%$] [%t:%@] %v");
  122. logger_sinks.push_back(vs_sink);
  123. #endif
  124. logger_ = std::make_shared<spdlog::logger>(logger_name, begin(logger_sinks), end(logger_sinks));
  125. // register it if you need to access it globally
  126. spdlog::register_logger(logger_);
  127. // 设置日志记录级别
  128. #ifdef _DEBUG
  129. logger_->set_level(log_level);
  130. #else
  131. logger_->set_level(spdlog::level::err);
  132. #endif
  133. //设置当出发 err 或更严重的错误时立刻刷新日志到 disk
  134. logger_->flush_on(spdlog::level::err);
  135. //对所有已注册的loggers定期1秒调用flush()
  136. spdlog::flush_every(std::chrono::seconds(1));
  137. //替换任何其它logger为默认logger
  138. spdlog::set_default_logger(logger_);
  139. logger_->info("spdlog init success\n");
  140. //SPDLOG_LOGGER_TRACE(logger_, "test");
  141. return true;
  142. };
  143. static ITraceService* g_pITraceService = NULL;
  144. //函数定义
  145. //////////////////////////////////////////////////////////////////////////
  146. //构造函数
  147. CTraceService::CTraceService()
  148. {
  149. }
  150. //服务配置
  151. //////////////////////////////////////////////////////////////////////////
  152. //设置服务
  153. bool CTraceService::SetTraceService(IUnknownEx* pIUnknownEx)
  154. {
  155. g_pITraceService = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, ITraceService);
  156. return NULL != g_pITraceService;
  157. }
  158. //获取服务
  159. VOID* CTraceService::GetTraceService(const IID& Guid, DWORD dwQueryVer)
  160. {
  161. ASSERT(g_pITraceService);
  162. if (g_pITraceService) return NULL;
  163. return (VOID*)g_pITraceService->QueryInterface(Guid, dwQueryVer);
  164. return NULL;
  165. }
  166. //获取服务
  167. VOID* CTraceService::GetTraceServiceManager(const IID& Guid, DWORD dwQueryVer)
  168. {
  169. return NULL;
  170. }
  171. //状态管理
  172. //////////////////////////////////////////////////////////////////////////
  173. //追踪状态
  174. bool CTraceService::IsEnableTrace(enTraceLevel TraceLevel)
  175. {
  176. return false;
  177. }
  178. //追踪控制
  179. bool CTraceService::EnableTrace(enTraceLevel TraceLevel, bool bEnableTrace)
  180. {
  181. return false;
  182. }
  183. //功能函数
  184. //////////////////////////////////////////////////////////////////////////
  185. //追踪信息
  186. bool CTraceService::TraceString(LPCTSTR pszString, enTraceLevel TraceLevel)
  187. {
  188. if (TraceLevel == TraceLevel_Debug)
  189. return false;
  190. if (g_pITraceService)
  191. return g_pITraceService->TraceString(pszString, TraceLevel);
  192. return false;
  193. }
  194. //////////////////////////////////////////////////////////////////////////
  195. //追踪服务
  196. //////////////////////////////////////////////////////////////////////////
  197. BEGIN_MESSAGE_MAP(CTraceServiceControl, CRichEditCtrl)
  198. ON_WM_RBUTTONDOWN()
  199. ON_COMMAND(IDM_MENU0, OnCopyString)
  200. ON_COMMAND(IDM_MENU1, OnSelectAll)
  201. ON_COMMAND(IDM_MENU2, OnDeleteString)
  202. ON_COMMAND(IDM_MENU3, OnClearAll)
  203. ON_COMMAND(IDM_MENU4, OnSaveString)
  204. END_MESSAGE_MAP()
  205. //函数定义
  206. //////////////////////////////////////////////////////////////////////////
  207. //构造函数
  208. CTraceServiceControl::CTraceServiceControl()
  209. {
  210. CTraceService::SetTraceService((IUnknownEx*)QueryInterface(IID_IUnknownEx, VER_IUnknownEx));
  211. }
  212. //析构函数
  213. CTraceServiceControl::~CTraceServiceControl()
  214. {
  215. CTraceService::SetTraceService(NULL);
  216. }
  217. //基础接口
  218. //////////////////////////////////////////////////////////////////////////
  219. //接口查询
  220. VOID* CTraceServiceControl::QueryInterface(const IID& Guid, DWORD dwQueryVer)
  221. {
  222. QUERYINTERFACE(ITraceService, Guid, dwQueryVer);
  223. QUERYINTERFACE_IUNKNOWNEX(ITraceService, Guid, dwQueryVer);
  224. return NULL;
  225. }
  226. //信息接口
  227. //////////////////////////////////////////////////////////////////////////
  228. //追踪信息
  229. bool CTraceServiceControl::TraceString(LPCTSTR pszString, enTraceLevel TraceLevel)
  230. {
  231. //效验参数
  232. ITraceService* pITraceService = (ITraceService*)(QueryInterface(IID_ITraceService, VER_ITraceService));
  233. ASSERT(pITraceService != NULL);
  234. if (pITraceService == NULL) return false;
  235. //变量定义
  236. CHARFORMAT2 CharFormat;
  237. ZeroMemory(&CharFormat, sizeof(CharFormat));
  238. //构造数据
  239. CharFormat.cbSize = sizeof(CharFormat);
  240. CharFormat.dwMask = CFM_COLOR | CFM_BACKCOLOR;
  241. CTraceServiceControl* pRichEditTrace = static_cast<CTraceServiceControl*>(pITraceService);
  242. if (pRichEditTrace == NULL) return false;
  243. CharFormat.crTextColor = RGB(0, 0, 0);
  244. CharFormat.crBackColor = RGB(255, 255, 255);
  245. lstrcpyn(CharFormat.szFaceName, TEXT("宋体"), sizeof(CharFormat.szFaceName));
  246. //获取时间
  247. SYSTEMTIME SystemTime;
  248. TCHAR szTimeBuffer[4098] = { 0 };
  249. ZeroMemory(szTimeBuffer, sizeof(TCHAR) * 4096);
  250. GetLocalTime(&SystemTime);
  251. _snwprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("【 %04d-%02d-%02d %02d:%02d:%02d 】"), SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
  252. // InsertString(szTimeBuffer, CharFormat);
  253. //长度判断
  254. int iLen = wcslen(pszString);
  255. if (iLen > 3800)
  256. {
  257. _sntprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("%s%s\n"), szTimeBuffer, _T("输出信息超长,信息请小于4K。"));
  258. }
  259. else
  260. {
  261. _sntprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("%s%s\n"), szTimeBuffer, pszString);
  262. }
  263. CharFormat.crTextColor = pRichEditTrace->GetTraceColor(TraceLevel);
  264. return InsertString(szTimeBuffer, CharFormat);
  265. }
  266. //重载函数
  267. //////////////////////////////////////////////////////////////////////////
  268. //绑定函数
  269. VOID CTraceServiceControl::PreSubclassWindow()
  270. {
  271. __super::PreSubclassWindow();
  272. CTraceService::SetTraceService((IUnknownEx*)QueryInterface(IID_IUnknownEx, VER_IUnknownEx));
  273. }
  274. //功能函数
  275. //////////////////////////////////////////////////////////////////////////
  276. //加载消息
  277. bool CTraceServiceControl::LoadMessage(LPCTSTR pszFileName)
  278. {
  279. if (static_cast<CTraceServiceControl*>(g_pITraceService) == NULL) return false;
  280. return static_cast<CTraceServiceControl*>(g_pITraceService)->LoadMessage(pszFileName);
  281. }
  282. //保存信息
  283. bool CTraceServiceControl::SaveMessage(LPCTSTR pszFileName)
  284. {
  285. if (static_cast<CTraceServiceControl*>(g_pITraceService) == NULL) return false;
  286. return static_cast<CTraceServiceControl*>(g_pITraceService)->SaveMessage(pszFileName);
  287. }
  288. //设置参数
  289. bool CTraceServiceControl::SetParameter(LONG lMaxLineCount, LONG lReserveLineCount)
  290. {
  291. m_lMaxLineCount = lMaxLineCount; //最大行数
  292. m_lReserveLineCount = lReserveLineCount; //保留行数
  293. return true;
  294. }
  295. //辅助函数
  296. //////////////////////////////////////////////////////////////////////////
  297. //配置服务
  298. VOID CTraceServiceControl::InitializeService()
  299. {
  300. }
  301. //获取颜色
  302. COLORREF CTraceServiceControl::GetTraceColor(enTraceLevel TraceLevel)
  303. {
  304. switch (TraceLevel)
  305. {
  306. case TraceLevel_Info:
  307. return RGB(133, 124, 129);
  308. break;
  309. case TraceLevel_Normal:
  310. return RGB(133, 124, 129);
  311. break;
  312. case TraceLevel_Warning:
  313. return RGB(255, 0, 0);
  314. break;
  315. case TraceLevel_Exception:
  316. return RGB(255, 0, 0);
  317. break;
  318. case TraceLevel_Debug:
  319. return RGB(19, 127, 140);
  320. break;
  321. }
  322. return RGB(0, 0, 0);
  323. }
  324. //字符判断
  325. bool EfficacyUrlChar(TCHAR chChar)
  326. {
  327. //特殊字符
  328. if (chChar == TEXT('.')) return true;
  329. if (chChar == TEXT('=')) return true;
  330. if (chChar == TEXT('+')) return true;
  331. if (chChar == TEXT('?')) return true;
  332. if (chChar == TEXT('#')) return true;
  333. if (chChar == TEXT('%')) return true;
  334. if (chChar == TEXT('/')) return true;
  335. if (chChar == TEXT(':')) return true;
  336. if (chChar == TEXT('&')) return true;
  337. //字符范围
  338. if ((chChar >= TEXT('a')) && (chChar <= TEXT('z'))) return true;
  339. if ((chChar >= TEXT('A')) && (chChar <= TEXT('Z'))) return true;
  340. if ((chChar >= TEXT('0')) && (chChar <= TEXT('9'))) return true;
  341. return false;
  342. }
  343. //地址判断
  344. bool EfficacyUrlString(LPCTSTR pszUrl)
  345. {
  346. for (WORD i = 0; i < wcslen(pszUrl); i++)
  347. {
  348. if (!EfficacyUrlChar(pszUrl[i])) return false;
  349. }
  350. return true;
  351. }
  352. //插入字串
  353. bool CTraceServiceControl::InsertString(LPCTSTR pszString, CHARFORMAT2& CharFormat)
  354. {
  355. if (GetTextLength() >= 1024 * 512)
  356. OnClearAll();
  357. //插入消息
  358. //变量定义
  359. bool bResumeSelect;
  360. CHARRANGE CharRange;
  361. //保存状态
  362. SetSel(-1L, -1L);
  363. GetSel(CharRange.cpMin, CharRange.cpMax);
  364. bResumeSelect = (CharRange.cpMax != CharRange.cpMin);
  365. //搜索变量
  366. LPCTSTR pszHttp = TEXT("http://");
  367. const INT nHttpLength = lstrlen(pszHttp);
  368. const INT nStringLength = lstrlen(pszString);
  369. //索引定义
  370. INT nStringStart = 0;
  371. INT nStringPause = 0;
  372. //字符解释
  373. for (INT i = 0; i < nStringLength; i++)
  374. {
  375. //变量定义
  376. INT nUrlPause = i;
  377. //地址判断
  378. if (((i + nHttpLength) < nStringLength) && (memcmp(&pszString[i], pszHttp, nHttpLength * sizeof(TCHAR)) == 0))
  379. {
  380. //设置索引
  381. nUrlPause = i + nHttpLength;
  382. //地址搜索
  383. while (nUrlPause < nStringLength)
  384. {
  385. //字符判断
  386. if (EfficacyUrlChar(pszString[nUrlPause]) == true)
  387. {
  388. nUrlPause++;
  389. continue;
  390. }
  391. break;
  392. }
  393. }
  394. //终止字符
  395. if (nUrlPause <= (i + nHttpLength)) nStringPause = (i + 1);
  396. //插入字符
  397. if ((i == (nStringLength - 1)) || (nUrlPause > (i + nHttpLength)))
  398. {
  399. //普通字符
  400. if (nStringPause > nStringStart)
  401. {
  402. //获取缓冲
  403. CString strNormalString;
  404. LPTSTR pszNormalString = strNormalString.GetBuffer(nStringPause - nStringStart + 1);
  405. //拷贝字符
  406. pszNormalString[nStringPause - nStringStart] = 0;
  407. CopyMemory(pszNormalString, &pszString[nStringStart], (nStringPause - nStringStart) * sizeof(TCHAR));
  408. //释放缓冲
  409. strNormalString.ReleaseBuffer();
  410. //插入消息
  411. SetSel(-1L, -1L);
  412. SetWordCharFormat(CharFormat);
  413. ReplaceSel((LPCTSTR)strNormalString);
  414. }
  415. //连接地址
  416. if (nUrlPause > (i + nHttpLength))
  417. {
  418. //获取缓冲
  419. CString strUrlString;
  420. LPTSTR pszUrlString = strUrlString.GetBuffer((nUrlPause - i) + 1);
  421. //拷贝字符
  422. pszUrlString[nUrlPause - i] = 0;
  423. CopyMemory(pszUrlString, &pszString[i], (nUrlPause - i) * sizeof(TCHAR));
  424. //释放缓冲
  425. strUrlString.ReleaseBuffer();
  426. //构造格式
  427. CHARFORMAT2 CharFormatHyper;
  428. CharFormatHyper = CharFormat;
  429. //效验地址
  430. if (EfficacyUrlString(strUrlString) == true)
  431. {
  432. CharFormatHyper.dwMask |= CFM_LINK;
  433. CharFormatHyper.dwEffects |= CFE_LINK;
  434. }
  435. //插入消息
  436. SetSel(-1L, -1L);
  437. SetWordCharFormat(CharFormatHyper);
  438. ReplaceSel((LPCTSTR)strUrlString);
  439. }
  440. //设置索引
  441. nStringStart = __max(i, nUrlPause);
  442. }
  443. //设置索引
  444. i += (nUrlPause - i);
  445. }
  446. //状态设置
  447. if (bResumeSelect == true) SetSel(CharRange);
  448. else PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
  449. return true;
  450. }
  451. //回调函数
  452. //////////////////////////////////////////////////////////////////////////
  453. //加载回调
  454. DWORD CALLBACK CTraceServiceControl::LoadCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
  455. {
  456. return 0;
  457. }
  458. //保存回调
  459. DWORD CALLBACK CTraceServiceControl::SaveCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
  460. {
  461. return 0;
  462. }
  463. //菜单命令
  464. //////////////////////////////////////////////////////////////////////////
  465. //删除信息
  466. VOID CTraceServiceControl::OnClearAll()
  467. {
  468. SetWindowText(NULL);
  469. }
  470. //全部选择
  471. VOID CTraceServiceControl::OnSelectAll()
  472. {
  473. __super::SetSel(0, __super::GetTextLength());
  474. }
  475. //拷贝字符
  476. VOID CTraceServiceControl::OnCopyString()
  477. {
  478. __super::Copy();
  479. }
  480. //保存信息
  481. VOID CTraceServiceControl::OnSaveString()
  482. {
  483. CFileDialog dlg(FALSE, TEXT("*.txt"), NULL, 4 | 2, TEXT("信息|*.txt||"));
  484. if (dlg.DoModal() == IDOK)
  485. {
  486. CString m_filename = dlg.GetPathName();
  487. CString strInput;
  488. GetWindowText(strInput);
  489. CFile file(m_filename, CFile::modeCreate | CFile::modeWrite);
  490. file.Write(strInput, strInput.GetLength());
  491. file.Close();
  492. }
  493. }
  494. //删除字符
  495. VOID CTraceServiceControl::OnDeleteString()
  496. {
  497. ReplaceSel(NULL, true);
  498. }
  499. //消息映射
  500. //////////////////////////////////////////////////////////////////////////
  501. //建立消息
  502. INT CTraceServiceControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  503. {
  504. return __super::OnCreate(lpCreateStruct);
  505. }
  506. //右键消息
  507. VOID CTraceServiceControl::OnRButtonDown(UINT nFlags, CPoint point)
  508. {
  509. CMenu menu;
  510. ClientToScreen(&point);
  511. menu.CreatePopupMenu();
  512. CHARRANGE sl;
  513. GetSel(sl);
  514. menu.AppendMenu(MF_STRING | (sl.cpMax != sl.cpMin) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU0, TEXT("复制(&C)\tCtrl+C"));
  515. menu.AppendMenu(MF_STRING | (GetTextLength() > 0 && sl.cpMax - sl.cpMin < GetTextLength()) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU1, TEXT("全选(&A)\tCtrl+A"));
  516. menu.AppendMenu(MF_STRING | (false) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU2, TEXT("删除(&D)"));
  517. menu.AppendMenu(MF_STRING | (GetTextLength() > 0) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU3, TEXT("清除信息"));
  518. menu.AppendMenu(MF_SEPARATOR, 0);
  519. menu.AppendMenu(MF_STRING | (GetTextLength() > 0) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU4, TEXT("保存信息..."));
  520. TrackPopupMenu(menu.m_hMenu, nFlags, point.x, point.y, 0, m_hWnd, NULL);
  521. }
  522. //追踪消息
  523. LRESULT CTraceServiceControl::OnTraceServiceMessage(WPARAM wParam, LPARAM lParam)
  524. {
  525. return 0;
  526. }