120 lines
3.0 KiB
TypeScript
120 lines
3.0 KiB
TypeScript
/**
|
|
* @author ErSan
|
|
* @email mlt131220@163.com
|
|
* @date 2025/2/24 下午2:21
|
|
* @description 日志记录器
|
|
*/
|
|
import {useAddSignal, useDispatchSignal,useRemoveSignal} from '@/hooks';
|
|
|
|
export interface ILog {
|
|
id: number;
|
|
message: string;
|
|
time: string;
|
|
level: string;
|
|
}
|
|
|
|
let _delLogFn,_clearLogFn,_historyChangedFn;
|
|
class Logger {
|
|
static Enum = Object.freeze({
|
|
TRACE: "trace",
|
|
DEBUG: "debug",
|
|
INFO: "info",
|
|
WARN: "warn",
|
|
ERROR: "error"
|
|
});
|
|
|
|
// 是否启用日志
|
|
enabled: boolean = true;
|
|
|
|
// 日志信息
|
|
logs: ILog[] = [];
|
|
|
|
constructor() {
|
|
_delLogFn = this.delLog.bind(this);
|
|
useAddSignal("deleteLog",_delLogFn);
|
|
_clearLogFn = this.clearLogs.bind(this);
|
|
useAddSignal("clearLogs",_clearLogFn);
|
|
_historyChangedFn = this.historyChanged.bind(this);
|
|
useAddSignal("historyChanged",_historyChangedFn);
|
|
}
|
|
|
|
log(methodName:string,message:string){
|
|
if(!this.enabled) return;
|
|
|
|
const _log = {
|
|
id: this.logs.length,
|
|
message,
|
|
level: methodName,
|
|
time: new Date().toLocaleString()
|
|
}
|
|
|
|
this.logs.unshift(_log);
|
|
|
|
useDispatchSignal("addLog", _log, this.logs);
|
|
}
|
|
|
|
trace(message:string) { this.log(Logger.Enum.TRACE, message); }
|
|
debug(message:string) { this.log(Logger.Enum.DEBUG, message); }
|
|
info(message:string) { this.log(Logger.Enum.INFO, message); }
|
|
warn(message:string) { this.log(Logger.Enum.WARN, message); }
|
|
error(message:string) { this.log(Logger.Enum.ERROR, message); }
|
|
|
|
/**
|
|
* 删除日志
|
|
* @param _log
|
|
*/
|
|
delLog(_log: ILog) {
|
|
this.logs = this.logs.filter(log => log.id!== _log.id);
|
|
}
|
|
|
|
/**
|
|
* 清空日志
|
|
*/
|
|
clearLogs() {
|
|
this.logs = [];
|
|
}
|
|
|
|
/**
|
|
* 历史记录变化回调
|
|
* @param cmd
|
|
*/
|
|
historyChanged(cmd){
|
|
if(!cmd?.name) return;
|
|
|
|
let msg = cmd.name;
|
|
const postposition = ['AddObjectCommand','RemoveObjectCommand','MoveObjectCommand'];
|
|
if(postposition.includes(cmd.type)){
|
|
msg = `${msg}: ${cmd.object.name} `;
|
|
}else if(cmd.object){
|
|
msg = `${cmd.object.name} ${msg.toLowerCase()}`;
|
|
}
|
|
|
|
if(cmd.newValue !== undefined && cmd.oldValue !== undefined){
|
|
let newValue = cmd.newValue;
|
|
let oldValue = cmd.oldValue;
|
|
if(typeof newValue === 'object'){
|
|
newValue = JSON.stringify(newValue);
|
|
}
|
|
if(typeof oldValue === 'object'){
|
|
oldValue = JSON.stringify(oldValue);
|
|
}
|
|
|
|
msg = `${msg}: ${oldValue} ⇒ ${newValue}`;
|
|
}
|
|
|
|
this.info(msg);
|
|
}
|
|
|
|
dispose() {
|
|
useRemoveSignal("deleteLog",_delLogFn)
|
|
_delLogFn = null;
|
|
useRemoveSignal("clearLogs",_clearLogFn)
|
|
_clearLogFn = null;
|
|
useRemoveSignal("historyChanged",_historyChangedFn)
|
|
_historyChangedFn = null;
|
|
}
|
|
}
|
|
|
|
export const logger = new Logger();
|
|
|
|
export default logger; |