ph-utils
Version:
js 开发工具集,前后端都可以使用(commonjs和es module)
123 lines (122 loc) • 3.82 kB
JavaScript
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 });
};