BuglySDK.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**
  2. * @description 错误日志管理类
  3. * @author 邹勇
  4. */
  5. export default class BuglySDK {
  6. constructor() {
  7. this.initELKHandler();
  8. }
  9. /**
  10. * 接入第三方腾讯bugly
  11. */
  12. private initBugly(){
  13. }
  14. /**
  15. * 错误日志发送elk服务器
  16. */
  17. private initELKHandler() {
  18. if (cc.sys.isNative) {
  19. let __handler;
  20. if (window['__errorHandler']) {
  21. __handler = window['__errorHandler'];
  22. }
  23. window['__errorHandler'] = function (...args) {
  24. console.log('游戏报错,原生系统');
  25. BuglySDK.handleError(...args);
  26. if (__handler) {
  27. __handler(...args);
  28. }
  29. }
  30. }
  31. }
  32. /** 上次发送错误日志的时间 */
  33. static lastSendErrorTime: number = new Date().getTime();
  34. /** 最近发送的错误日志 */
  35. static lastSendErrors: string[] = [];
  36. static handleError(...args) {
  37. //简化错误日志
  38. let errors = "";
  39. for (let i = 0; i < args.length; i++) {
  40. if (typeof args[i] == 'string' && args[i].length > 20) {
  41. errors += args[i] + '\n';
  42. }
  43. else if (args[i] instanceof Array) {
  44. for (let j = 0; j < args[i].length; j++) {//安卓内捕获的错误优化缩减字段
  45. errors += args[i][j];
  46. }
  47. }
  48. }
  49. if (errors.indexOf('TypeError') != -1) {
  50. errors = errors.slice(errors.indexOf('TypeError') + 'TypeError'.length + 2);
  51. }
  52. let [a, start, d, s, q] = [0, '', '', '', '[]@'];
  53. while (a < errors.length) {
  54. s = errors.charAt(a);
  55. if (q.indexOf(s) != -1) {
  56. if (start == '') {
  57. start = s;
  58. }
  59. else {
  60. if ((start == '[' && s == ']') || (start == '@' && s == ']')) {
  61. start = '';
  62. d += ' | ';
  63. }
  64. }
  65. }
  66. else if (start == '') {
  67. d += s;
  68. }
  69. a++;
  70. }
  71. //超过长度无法加密,加密Long服务器无法解析
  72. if (d.length > 120) {
  73. d = d.slice(0, 120);
  74. }
  75. //相同错误 一定时间禁止连续发送
  76. let time = new Date().getTime();
  77. if (BuglySDK.lastSendErrors.indexOf(d) != -1 && time - BuglySDK.lastSendErrorTime < 30000) {
  78. return;
  79. }
  80. BuglySDK.lastSendErrors.push(d);
  81. BuglySDK.lastSendErrorTime = time;
  82. if (BuglySDK.lastSendErrors.length > 5) {
  83. BuglySDK.lastSendErrors = BuglySDK.lastSendErrors.slice(BuglySDK.lastSendErrors.length - 5);
  84. }
  85. // 拼接服务类型(0测试服 1测试服)和 玩家uin
  86. let uin = gData.httpData.serverType + ":" + gData.loginData.uin;
  87. let senddata = {
  88. "level": "error",
  89. "game": gData.appData.appNameBugly + ":" + uin,
  90. "message": d
  91. };
  92. const httpRequest = new XMLHttpRequest();
  93. httpRequest.responseType = "text";
  94. const send_url = 'https://elktest.duiweize.com/api/logs/record';
  95. httpRequest.open("POST", send_url);
  96. httpRequest.setRequestHeader("Content-Type", 'application/json;charset=UTF-8');
  97. httpRequest.onerror = function (e) {
  98. console.log("handleError.onError:", e);
  99. };
  100. let str = JSON.stringify(senddata);
  101. str = mk.encrypt.rsaEncrypt(str);
  102. httpRequest.send(str);
  103. }
  104. }