前端错误监控

window.conf = {
	traceid: "",
	errorList: [],
	timeList: {
		httpts: [],
	},
};
console.log("log/jsError");
let errordefo = {
	t: "", //  时间戳
	// n: 'js',
	errMsg: "",
	errMsg2: "",
	// data: {}
};

function _error() {
	setTimeout(() => {
		window.logp.reportLog2 = debounce(window.logp.reportLog, 5000);
	}, 0);

	window.addEventListener(
		"error",
		function (e) {
			let defaults = Object.assign({}, errordefo);
			setTimeout(() => {
				if ("error" in e) {
					defaults.error = e.error;
					defaults.error = e.error;
					defaults.errMsg = e.error && e.error.stack;
					defaults.filename = e.filename;
					defaults.message = e.message;
					defaults.line = e.lineno;
					defaults.href = e.target.location.href;
				} else {
					// 资源加载错误
					defaults.n = "resource";
					// defaults.target = e.target.localName
					defaults.errMsg = e.target.localName + " is load error";
					defaults.resourceUrl = e.target.href || e.target.currentSrc || e.target.src;
					defaults.href = e.target.baseURI;
				}

				defaults.type = e.type;
				defaults.t = Date.now();
				defaults.func = "addEventListener-error";
				// defaults.href = e.target.baseURI
				window.conf.errorList.push(defaults);

				window.logp.reportLog2(2, window.conf.errorList);
			}, 0);
		},
		true
	);
	// js  onerror函数会在页面发生js错误时被调用  //可以拿到错误的文件名、行号、列号等信息
	window.onerror = function (errMsg, _url, line, col, error) {
		let defaults = Object.assign({}, errordefo);
		setTimeout(function () {
			defaults.func = "window.onerror";
			defaults.resourceUrl = _url;
			defaults.error = error;
			defaults.errMsg = error && error.stack ? error.stack.toString() : errMsg;
			defaults.line = line;
			defaults.col = col || (window.event && window.event.errorCharacter) || 0;
			defaults.t = Date.now();
			window.conf.errorList.push(defaults);

			window.logp.reportLog2(2, window.conf.errorList);
		}, 0);
	};
	function getInfo(reason) {
		console.log("getInfo===reason", reason);
		const error = reason;
		const msg = (error && error.message && error.message) || "";
		const stack = (error && error.stack) || "";
		let resourceUrl, col, line;
		let errs = stack.match(/\(.+?\)/);
		if (errs && errs.length) errs = errs[0];
		errs = errs.replace(/\w.+[js|html]/g, ($1) => {
			resourceUrl = $1;
			return "";
		});
		errs = errs.split(":");
		if (errs && errs.length > 1) line = parseInt(errs[1] || 0);
		col = parseInt(errs[2] || 0);
		return {
			resourceUrl,
			col,
			line,
			msg,
		};
	}
	// js运行时报错
	window.addEventListener("unhandledrejection", function (e) {
		console.log("unhandledrejection---->", e);
		e.preventDefault();
		let defaults = Object.assign({}, errordefo);
		setTimeout(() => {
			if ("reason" in e) {
				if (e.reason.message) {
					defaults.errMsg = e.reason.message;
				}
				if (e.reason.stack) {
					defaults.stack = e.reason.stack;
				}
			}

			defaults.href = e.target.location.href;

			defaults.type = e.type;
			defaults.func = "unhandledrejection";
			defaults.t = Date.now();
			window.conf.errorList.push(defaults);

			window.logp.reportLog2(2, window.conf.errorList);
		}, 0);
	});
	// 重写console.error
	const oldError = console.error;
	console.error = function (e) {
		let defaults = Object.assign({}, errordefo);
		setTimeout(function () {
			defaults.errMsg = e;
			defaults.func = "console.error";
			defaults.method = "GET";
			defaults.t = new Date().getTime();
			defaults.data = location.href;
			window.conf.errorList.push(defaults);

			window.logp.reportLog2(2, window.conf.errorList);
		}, 0);
		return oldError.apply(console, arguments);
	};

	const oldLog = console.log;
	console.log = function (e, p, g) {
		let defaults = Object.assign({}, errordefo);
		setTimeout(function () {
			e = typeof e == "String" ? e : JSON.stringify(e);
			p = p ? (typeof p == "String" ? p : JSON.stringify(p) : "";
			g = p ? (typeof g == "String" ? p : JSON.stringify(g) : "";
			defaults.errMsg = e + p + g;
			defaults.func = "console.log";
			defaults.t = Date.now();
			defaults.href = location.href;
			window.conf.errorList.push(defaults);
		}, 0);
		return oldLog.apply(console, arguments);
	};
}

const debounce = function (func, wait) {
	let willdo = false;
	return function () {
		const _this = this;
		const args = arguments;
		if (!willdo) {
			willdo = true;
			setTimeout(function () {
				willdo = false;
				func.apply(_this, args);
			}, wait);
		}
	};
};

export { _error };