@ovine/core
Version:
Build flexible admin system with json.
145 lines (144 loc) • 5.44 kB
JavaScript
/**
* logger模块
* 错误,异常等地方都应输入日志,给出提示
*/
/* eslint-disable no-console */
import { debounce, throttle, defaults } from 'lodash';
import { getUrlParams } from "./tool";
// 默认所有日志均显示
let debugConfig = {
level: 'log',
moduleName: '',
onlyLevel: false,
enable: false,
defaultDebugOption: {
isPrint: true,
moduleName: '.*',
onlySelf: false,
level: 'log',
debounce: 1000,
throttle: 1000,
},
};
let onlySelfFlag = null;
// 判断 生产环境
const isRelease = () => {
// TODO 添加线上环境日志配置修改
return process.env.NODE_ENV === 'production' && !debugConfig.enable;
};
// 过滤日志打印信息
const filterLog = (option) => {
const { level, moduleName, onlyLevel } = debugConfig;
// 打包环境不打印LOG
if (isRelease()) {
return false;
}
const allowedLevel = [];
if (onlyLevel) {
// 仅仅打印当前级别的LOG
allowedLevel.push(level);
}
else {
// ERROR > WARN > INFO > LOG
const allLevel = ['log', 'info', 'warn', 'error'];
const idx = allLevel.findIndex((l) => l === level);
allowedLevel.push(...allLevel.slice(idx));
}
// 过滤不同级别的 LOG
if (!allowedLevel.find((l) => l === option.level)) {
return false;
}
// 根据传入的 moduleName 过滤 日志
if (!moduleName || !new RegExp(moduleName).test(option.moduleName)) {
return false;
}
return true;
};
export class Logger {
log(moduleName, ...loggerDetail) {
this.debugLogger({ level: 'log', moduleName }, loggerDetail);
}
info(moduleName, ...loggerDetail) {
this.debugLogger({ level: 'info', moduleName }, loggerDetail);
}
warn(moduleName, ...loggerDetail) {
this.debugLogger({ level: 'warn', moduleName }, loggerDetail);
}
error(moduleName, ...loggerDetail) {
this.debugLogger({ level: 'error', moduleName }, loggerDetail);
}
getLogger(moduleName, option = {}) {
const debugOption = Object.assign(Object.assign({}, option), { moduleName });
return {
time: (label, timeFn) => this.time(label, timeFn, debugOption),
if: (isPrint) => this.getLogger(moduleName, Object.assign(Object.assign({}, option), { isPrint })),
debounce: debounce((callback) => callback(), 1000),
throttle: throttle((callback) => callback(), 1000),
log: (...logDetail) => this.signedLogger('log', debugOption, logDetail),
info: (...logDetail) => this.signedLogger('info', debugOption, logDetail),
warn: (...logDetail) => this.signedLogger('warn', debugOption, logDetail),
error: (...logDetail) => this.signedLogger('error', debugOption, logDetail),
};
}
// TODO: 同步 timeFn 比较鸡肋,换成异步时间打印
time(label, timeFn, debugOption) {
const start = Date.now();
const result = timeFn();
const end = Date.now();
this.debugLogger.call(null, debugOption, [`${label || 'time'}: ${end - start}ms`, result]);
return result;
}
debugLogger(option, loggerDetail) {
// 打包环境不打印日志
if (isRelease()) {
return;
}
const debugOption = Object.assign(Object.assign({}, debugConfig.defaultDebugOption), option);
const { moduleName, level, onlySelf } = debugOption;
onlySelfFlag = null;
// onlySelf 为 bool值时 设置 onlySelfFlag
if (typeof onlySelf === 'boolean') {
onlySelfFlag = onlySelf;
}
// onlySelfFlag === true && onlySelf === true 时直接打印
// 否则 需要校验 moduleName 与 level 级别
if ((!onlySelfFlag || !onlySelf) && !filterLog({ level, moduleName })) {
return;
}
const now = new Date();
const logArgs = [
`[${now.getHours()}:${now.getMinutes()}:${now.getSeconds()} ${level.toUpperCase()} ${moduleName}] `,
];
const log = Function.prototype.bind.call(console[level] || console.log, console);
log.apply(console, logArgs.concat(loggerDetail));
// console.log.call(null, ...logArgs.concat(...loggerDetail)) // 该方法不兼容IE9-IE11
}
signedLogger(level, option, loggerDetail) {
const { isPrint = true } = option;
if (!isPrint) {
return;
}
this.debugLogger.call(null, Object.assign(Object.assign({}, option), { level }), loggerDetail);
}
}
const logger = new Logger();
// 设置 日志 配置
export const setConfig = (conf) => {
debugConfig = Object.assign(Object.assign({}, debugConfig), conf);
// 打包环境不打印日志
if (isRelease()) {
return;
}
logger.info('lib:logger:config', debugConfig);
};
export const initLogger = (loggerConf = {}) => {
const moduleName = getUrlParams('loggerModule') || (loggerConf === null || loggerConf === void 0 ? void 0 : loggerConf.moduleName) || '';
const loggerLevel = getUrlParams('loggerLevel') || (loggerConf === null || loggerConf === void 0 ? void 0 : loggerConf.level) || 'log';
const loggerConfig = defaults({
moduleName,
level: loggerLevel,
enable: !!moduleName,
}, loggerConf);
setConfig(loggerConfig);
};
export default logger;