UNPKG

ph-utils

Version:

js 开发工具集,前后端都可以使用(commonjs和es module)

123 lines (122 loc) 3.82 kB
import { format } from "./date"; /** * 日志记录器 */ export class Logger { /** 构造日志记录器 */ constructor(option) { /** 日志级别 */ this.levels = ["debug", "info", "warn", "error", "fatal"]; this.colors = { debug: "#909399", info: "#1677ff", warn: "#fadb14", error: "#eb2f96", }; this.setOption(option || {}); } setOption(option) { let opts = { level: "debug", levelNum: 0, pretty: true, ...option }; opts.levelNum = this.levels.indexOf(opts.level); this.option = opts; } log(message) { let msgInfo = { name: this.option.name, level: "info", time: format(null, "yyyy-mm-dd HH:MM:ss.S"), pretty: this.option.pretty, jsonSpace: 0, }; let msgContent = message; if (typeof message === "object") { if (message instanceof Error) { msgInfo.level = "error"; msgContent = msgContent.stack; } else if (message.message != null) { msgContent = message.message; msgInfo = { ...msgInfo, ...message }; } } if (typeof msgContent === "object") { try { msgInfo.message = JSON.stringify(msgContent, null, msgInfo.jsonSpace); } catch (error) { msgInfo.message = msgContent.toString(); } } else { msgInfo.message = msgContent; } if (msgInfo.pretty == null) { msgInfo.pretty = this.option.pretty; } let levelIndex = this.levels.indexOf(msgInfo.level); if (levelIndex >= this.option.levelNum) { this.formatShow(msgInfo); } } info(message) { this.log(this.generateLog(message, "info")); } debug(message) { this.log(this.generateLog(message, "debug")); } warn(message) { this.log(this.generateLog(message, "warn")); } error(message) { this.log(this.generateLog(message, "error")); } fatal(message) { this.log(this.generateLog(message, "fatal")); } getLevel() { return this.levels[this.option.levelNum]; } getName() { return this.option.name; } getOption() { return this.option; } generateLog(message, level = "info") { let msgInfo = { message: message, }; if (typeof message === "object") { if (message.message != null) { msgInfo = message; } } msgInfo["level"] = level; return msgInfo; } /** 格式化显示 */ formatShow(msg) { if (msg.level === "fatal") { msg.level = "error"; } const res = [`[${msg.time}]`]; if (msg.name != null) { res.push(`[${msg.name}]`); } res.push(`- ${msg.message}`); if (!msg.pretty) { res.splice(1, 0, `${msg.level.toUpperCase()}`); console[msg.level](res.join(" ")); } else { const color = this.colors[msg.level]; console.log(`%c ${`${msg.level.toUpperCase()}`} %c ${res.join(" ")} %c`, `background:${color};border:1px solid ${color}; padding: 1px; border-radius: 2px 0 0 2px; color: #fff;`, `border:1px solid ${color}; padding: 1px; border-radius: 0 2px 2px 0; color: ${color};`, "background:transparent"); } } } /** 默认日志记录器 */ export const logger = new Logger({ name: "APP" }); /** 获取新的日志记录器, 属性采用之前的 */ export const getLogger = (option) => { return new Logger({ ...logger.getOption(), ...option }); };