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.
 
 
 
 
 
 

260 lines
5.6 KiB

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;