123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- import console from './console';
- import { isArrayOrObject, TimeUtil, isInstanceOfError, stringifyError } from './common-utils';
- const LOGLEVEL_DEBUG = -1;
- const LOGLEVEL_LOG = 0;
- const LOGLEVEL_INFO = 1;
- const LOGLEVEL_WARN = 2;
- const LOGLEVEL_ERROR = 3;
- const LOGLEVEL_NON_LOGGING = 4; // 无日志记录级别,sdk将不打印任何日志
- const MAX_LOG_LENGTH = 1000;
- let globalLevel = LOGLEVEL_LOG; // 暂停使用 wx.getLogManager,没发现它能起到什么作用
- const bCanIUseWxLog = false;
- const timerMap = new Map();
- /**
- * 对齐毫秒字符串
- * @param {*} ms 毫秒
- * @returns {String} 对齐后的毫秒时间字符串
- */
- function padMs(ms) {
- const len = ms.toString().length;
- let ret;
- switch (len) {
- case 1:
- ret = `00${ms}`;
- break;
- case 2:
- ret = `0${ms}`;
- break;
- default:
- ret = ms;
- break;
- }
- return ret;
- }
- /**
- * log前缀
- * @returns {String} 日志前缀
- */
- function getPrefix() {
- const date = new Date();
- return `TUIKit ${date.toLocaleTimeString('en-US', {
- hour12: false
- })}.${padMs(date.getMilliseconds())}:`;
- }
- /**
- * wx LogManager是否可用
- * @returns {Boolean} true->I can use LogManager
- */
- // function canIUseWxLog() {
- // if (IN_WX_MINI_APP) {
- // // 必须是微信小程序环境,百度小程序目前还只能用console
- // const version = wx.getSystemInfoSync().SDKVersion;
- // // HBuilder等工具会在window对象下挂自己模拟的wx对象,但是又没抄好,做个防御
- // if (typeof version === 'undefined' ||
- // typeof wx.getLogManager === 'undefined') {
- // return false;
- // }
- // if (compareVersion(version, '2.1.0') >= 0) {
- // wx.getLogManager().log('I can use wx log. SDKVersion=' + version);
- // return true;
- // }
- // }
- // return false;
- // }
- /**
- * 比较wx SDKVersion
- * @param {String} v1 版本字符串
- * @param {String} v2 版本字符串
- * @returns {Number} v1>v2,返回1;v1<v2,返回-1;v1==v2,返回0
- */
- // function compareVersion(v1, v2) {
- // v1 = v1.split('.');
- // v2 = v2.split('.');
- // const len = Math.max(v1.length, v2.length);
- // while (v1.length < len) {
- // v1.push('0');
- // }
- // while (v2.length < len) {
- // v2.push('0');
- // }
- // for (let i = 0; i < len; i++) {
- // const num1 = parseInt(v1[i]);
- // const num2 = parseInt(v2[i]);
- // if (num1 > num2) {
- // return 1;
- // }
- // if (num1 < num2) {
- // return -1;
- // }
- // }
- // return 0;
- // }
- const logger = {
- _data: [],
- _length: 0,
- _visible: false,
- // 将函数参数拼成字符串
- arguments2String(args) {
- let s;
- if (args.length === 1) {
- s = getPrefix() + args[0];
- } else {
- s = getPrefix();
- for (let i = 0, {
- length
- } = args; i < length; i++) {
- if (isArrayOrObject(args[i])) {
- if (isInstanceOfError(args[i])) {
- s += stringifyError(args[i]);
- } else {
- s += JSON.stringify(args[i]);
- }
- } else {
- s += args[i];
- }
- s += ' ';
- }
- }
- return s;
- },
- /**
- * 打印调试日志
- */
- debug() {
- if (globalLevel <= LOGLEVEL_DEBUG) {
- // 对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - 更多信息)
- // see:https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments
- const s = this.arguments2String(arguments);
- logger.record(s, 'debug');
- console.debug(s);
- if (bCanIUseWxLog) {
- wx.getLogManager().debug(s);
- }
- }
- },
- /**
- * 打印普通日志
- */
- log() {
- if (globalLevel <= LOGLEVEL_LOG) {
- const s = this.arguments2String(arguments);
- logger.record(s, 'log');
- console.log(s);
- if (bCanIUseWxLog) {
- wx.getLogManager().log(s);
- }
- }
- },
- /**
- * 打印release日志
- */
- info() {
- if (globalLevel <= LOGLEVEL_INFO) {
- const s = this.arguments2String(arguments);
- logger.record(s, 'info');
- console.info(s);
- if (bCanIUseWxLog) {
- wx.getLogManager().info(s);
- }
- }
- },
- /**
- * 打印告警日志
- */
- warn() {
- if (globalLevel <= LOGLEVEL_WARN) {
- const s = this.arguments2String(arguments);
- logger.record(s, 'warn');
- console.warn(s);
- if (bCanIUseWxLog) {
- wx.getLogManager().warn(s);
- }
- }
- },
- /**
- * 打印错误日志
- */
- error() {
- if (globalLevel <= LOGLEVEL_ERROR) {
- const s = this.arguments2String(arguments);
- logger.record(s, 'error');
- console.error(s); // 微信写不了error日志,就用warn代替了
- if (bCanIUseWxLog) {
- wx.getLogManager().warn(s);
- }
- }
- },
- time(label) {
- timerMap.set(label, TimeUtil.now());
- },
- timeEnd(label) {
- if (timerMap.has(label)) {
- const cost = TimeUtil.now() - timerMap.get(label);
- timerMap.delete(label);
- return cost;
- }
- console.warn(`未找到对应label: ${label}, 请在调用 logger.timeEnd 前,调用 logger.time`);
- return 0;
- },
- setLevel(newLevel) {
- if (newLevel < LOGLEVEL_NON_LOGGING) {
- console.log(`${getPrefix()} set level from ${globalLevel} to ${newLevel}`);
- }
- globalLevel = newLevel;
- },
- record(s, type) {
- if (bCanIUseWxLog) {
- // 小程序环境不在内存缓存日志
- return;
- }
- if (logger._length === MAX_LOG_LENGTH + 100) {
- logger._data.splice(0, 100);
- logger._length = MAX_LOG_LENGTH;
- }
- logger._length++;
- logger._data.push(`${s} [${type}] \n`);
- },
- getLog() {
- return logger._data;
- }
- };
- export default logger;
|