| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| import { ErrorLevelEnum,ErrorCategoryEnum } from "./config"; |
| import utils from "./utils"; |
| import TaskQueue from "./TaskQueue" |
| |
| /** |
| * 监控基类 |
| */ |
| class BaseMonitor { |
| |
| /** |
| * 上报错误地址 |
| * @param {*} params { reportUrl,extendsInfo } |
| */ |
| constructor(params){ |
| this.category = ErrorCategoryEnum.UNKNOW_ERROR; //错误类型 |
| this.level = ErrorLevelEnum.INFO; //错误等级 |
| this.msg = ""; //错误信息 |
| this.url = ""; //错误信息地址 |
| this.line = ""; //行数 |
| this.col = ""; //列数 |
| this.errorObj = ""; //错误堆栈 |
| |
| this.reportUrl = params.reportUrl; //上报错误地址 |
| this.extendsInfo = params.extendsInfo; //扩展信息 |
| } |
| |
| /** |
| * 记录错误信息 |
| */ |
| recordError(){ |
| this.handleRecordError(); |
| //延迟记录日志 |
| setTimeout(()=>{ |
| TaskQueue.fire(); |
| },100); |
| } |
| |
| /** |
| * 处理记录日志 |
| */ |
| handleRecordError(){ |
| try { |
| if(!this.msg){ |
| return; |
| } |
| //过滤掉错误上报地址 |
| if( this.reportUrl && this.url && this.url.toLowerCase().indexOf(this.reportUrl.toLowerCase())>=0 ){ |
| console.log("统计错误接口异常",this.msg); |
| return; |
| } |
| let errorInfo = this.handleErrorInfo(); |
| |
| console.log("\n````````````````````` "+this.category+" `````````````````````\n",errorInfo) |
| |
| //记录日志 |
| TaskQueue.add(this.reportUrl,errorInfo); |
| |
| } catch (error) { |
| console.log(error); |
| } |
| } |
| |
| /** |
| * 处理错误信息 |
| * @param {*} extendsInfo |
| */ |
| handleErrorInfo(){ |
| let txt = "错误类别: " + this.category + "\r\n"; |
| txt += "日志信息: " + this.msg + "\r\n"; |
| txt += "url: " + this.url + "\r\n"; |
| switch(this.category){ |
| case ErrorCategoryEnum.JS_ERROR: |
| txt += "错误行号: " + this.line + "\r\n"; |
| txt += "错误列号: " + this.col + "\r\n"; |
| if (this.errorObj && this.errorObj.stack) { |
| txt += "错误栈: " + this.errorObj.stack + "\r\n"; |
| } |
| break; |
| default: |
| txt += "其他错误: " + JSON.stringify(this.errorObj) + "\r\n"; |
| break; |
| } |
| let deviceInfo = this.getDeviceInfo(); |
| txt += "设备信息: " + deviceInfo; //设备信息 |
| let extendsInfo = this.getExtendsInfo(); |
| let recordInfo = extendsInfo; |
| recordInfo.category = this.category; //错误分类 |
| recordInfo.logType = this.level; //错误级别 |
| recordInfo.logInfo = txt; //错误信息 |
| recordInfo.deviceInfo = deviceInfo; //设备信息 |
| return recordInfo; |
| } |
| |
| /** |
| * 获取扩展信息 |
| */ |
| getExtendsInfo(){ |
| try { |
| let ret = {}; |
| let extendsInfo = this.extendsInfo || {}; |
| let dynamicParams; |
| if(utils.isFunction(extendsInfo.getDynamic)){ |
| dynamicParams = extendsInfo.getDynamic(); //获取动态参数 |
| } |
| //判断动态方法返回的参数是否是对象 |
| if(utils.isObject(dynamicParams)){ |
| extendsInfo = {...extendsInfo,...dynamicParams}; |
| } |
| //遍历扩展信息,排除动态方法 |
| for(var key in extendsInfo){ |
| if(!utils.isFunction(extendsInfo[key])){ //排除获取动态方法 |
| ret[key] = extendsInfo[key]; |
| } |
| } |
| return ret; |
| } catch (error) { |
| console.log('call getExtendsInfo error',error); |
| return {}; |
| } |
| } |
| |
| /** |
| * 获取设备信息 |
| */ |
| getDeviceInfo(){ |
| try { |
| let deviceInfo = DeviceInfo.getDeviceInfo(); |
| return JSON.stringify(deviceInfo); |
| } catch (error) { |
| console.log(error); |
| return ""; |
| } |
| } |
| |
| } |
| export default BaseMonitor; |