forked from GuChen/maimaiDX-API-Web-Server
Initial commit: Add maimaiDX API web application with AimeDB scanning and logging features
This commit is contained in:
143
frontend/src/utils/logger.ts
Normal file
143
frontend/src/utils/logger.ts
Normal file
@@ -0,0 +1,143 @@
|
||||
// 日志级别枚举
|
||||
const LogLevel = {
|
||||
DEBUG: 0,
|
||||
INFO: 1,
|
||||
WARN: 2,
|
||||
ERROR: 3
|
||||
};
|
||||
|
||||
// 当前日志级别
|
||||
let currentLogLevel = LogLevel.INFO;
|
||||
|
||||
// 日志缓冲区
|
||||
let logBuffer = [];
|
||||
const MAX_BUFFER_SIZE = 1000;
|
||||
|
||||
// 设置日志级别
|
||||
export function setLogLevel(level) {
|
||||
currentLogLevel = level;
|
||||
}
|
||||
|
||||
// 获取当前时间戳
|
||||
function getTimestamp() {
|
||||
return new Date().toISOString();
|
||||
}
|
||||
|
||||
// 写入日志到缓冲区
|
||||
function writeToBuffer(level, message, data = null) {
|
||||
const logEntry = {
|
||||
timestamp: getTimestamp(),
|
||||
level: Object.keys(LogLevel).find(key => LogLevel[key] === level),
|
||||
message: message,
|
||||
data: data
|
||||
};
|
||||
|
||||
logBuffer.push(logEntry);
|
||||
|
||||
// 保持缓冲区大小在限制内
|
||||
if (logBuffer.length > MAX_BUFFER_SIZE) {
|
||||
logBuffer = logBuffer.slice(-MAX_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
// 在控制台输出日志
|
||||
switch (level) {
|
||||
case LogLevel.DEBUG:
|
||||
console.debug(`[DEBUG] ${message}`, data);
|
||||
break;
|
||||
case LogLevel.INFO:
|
||||
console.info(`[INFO] ${message}`, data);
|
||||
break;
|
||||
case LogLevel.WARN:
|
||||
console.warn(`[WARN] ${message}`, data);
|
||||
break;
|
||||
case LogLevel.ERROR:
|
||||
console.error(`[ERROR] ${message}`, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Debug级别日志
|
||||
export function logDebug(message, data = null) {
|
||||
if (currentLogLevel <= LogLevel.DEBUG) {
|
||||
writeToBuffer(LogLevel.DEBUG, message, data);
|
||||
}
|
||||
}
|
||||
|
||||
// Info级别日志
|
||||
export function logInfo(message, data = null) {
|
||||
if (currentLogLevel <= LogLevel.INFO) {
|
||||
writeToBuffer(LogLevel.INFO, message, data);
|
||||
}
|
||||
}
|
||||
|
||||
// Warn级别日志
|
||||
export function logWarn(message, data = null) {
|
||||
if (currentLogLevel <= LogLevel.WARN) {
|
||||
writeToBuffer(LogLevel.WARN, message, data);
|
||||
}
|
||||
}
|
||||
|
||||
// Error级别日志
|
||||
export function logError(message, data = null) {
|
||||
if (currentLogLevel <= LogLevel.ERROR) {
|
||||
writeToBuffer(LogLevel.ERROR, message, data);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取日志缓冲区
|
||||
export function getLogBuffer() {
|
||||
return [...logBuffer]; // 返回副本
|
||||
}
|
||||
|
||||
// 清空日志缓冲区
|
||||
export function clearLogBuffer() {
|
||||
logBuffer = [];
|
||||
}
|
||||
|
||||
// 将日志保存到文件
|
||||
export function saveLogsToFile() {
|
||||
const logs = getLogBuffer();
|
||||
const logText = logs.map(entry =>
|
||||
`${entry.timestamp} [${entry.level}] ${entry.message} ${entry.data ? JSON.stringify(entry.data) : ''}`
|
||||
).join('\n');
|
||||
|
||||
const blob = new Blob([logText], { type: 'text/plain' });
|
||||
const url = URL.createObjectURL(blob);
|
||||
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = `frontend-logs-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.txt`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
|
||||
URL.revokeObjectURL(url);
|
||||
}
|
||||
|
||||
// API请求日志
|
||||
export function logApiRequest(method, url, data = null) {
|
||||
logInfo(`API Request: ${method} ${url}`, data);
|
||||
}
|
||||
|
||||
// API响应日志
|
||||
export function logApiResponse(status, data = null) {
|
||||
if (status >= 400) {
|
||||
logError(`API Response: ${status}`, data);
|
||||
} else {
|
||||
logInfo(`API Response: ${status}`, data);
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
LogLevel,
|
||||
setLogLevel,
|
||||
logDebug,
|
||||
logInfo,
|
||||
logWarn,
|
||||
logError,
|
||||
getLogBuffer,
|
||||
clearLogBuffer,
|
||||
saveLogsToFile,
|
||||
logApiRequest,
|
||||
logApiResponse
|
||||
};
|
||||
Reference in New Issue
Block a user