Files
netdisk-fast-download/parser/src/main/java/cn/qaiu/parser/customjs/JsPlaygroundLogger.java
yukaidi 7b5900aae4 refactor: 代码质量清理与日志规范化
- 替换 System.out.println/printStackTrace 为 Logger: MkgsTool, PodTool, WsTool, IpExtractor, ReqIpUtil, LogStatistics
- JsPlaygroundLogger 日志列表限制最大 1000 条防止内存泄漏
- JsScriptLoader JarFile 改用 try-with-resources 防止文件句柄泄漏
- DbServiceImpl Thread.sleep 改为 vertx.setTimer 避免阻塞 event loop
- 删除未使用的 api.js,删除空的 ParserApiClientLinkTest
- 移除前端未使用的导入和死代码 (downloaderService, monacoTypes)
- 提取 previewBaseUrl 到 constants.js 常量文件
2026-05-29 14:23:26 +08:00

201 lines
5.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package cn.qaiu.parser.customjs;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 演练场日志收集器
* 收集JavaScript执行过程中的日志信息
* 注意为避免Nashorn对Java重载方法的选择问题所有日志方法都使用Object参数
*
* @author <a href="https://qaiu.top">QAIU</a>
*/
public class JsPlaygroundLogger {
private static final Logger log = LoggerFactory.getLogger(JsPlaygroundLogger.class);
// 使用线程安全的列表
private static final int MAX_LOG_SIZE = 1000;
private final List<LogEntry> logs = Collections.synchronizedList(new ArrayList<>());
/**
* 日志条目
*/
public static class LogEntry {
private final String level;
private final String message;
private final long timestamp;
private final String source; // "JS" 或 "JAVA"
public LogEntry(String level, String message, String source) {
this.level = level;
this.message = message;
this.timestamp = System.currentTimeMillis();
this.source = source;
}
public String getLevel() {
return level;
}
public String getMessage() {
return message;
}
public long getTimestamp() {
return timestamp;
}
public String getSource() {
return source;
}
}
/**
* 将任意对象转为字符串
*/
private String toString(Object obj) {
if (obj == null) {
return "null";
}
return obj.toString();
}
/**
* 添加日志条目,超过最大容量时移除最早的条目
*/
private void addLog(LogEntry entry) {
synchronized (logs) {
if (logs.size() >= MAX_LOG_SIZE) {
logs.remove(0);
}
logs.add(entry);
}
}
/**
* 记录日志(内部方法)
* @param level 日志级别
* @param message 日志消息
* @param source 日志来源:"JS" 或 "JAVA"
*/
private void log(String level, Object message, String source) {
String msg = toString(message);
addLog(new LogEntry(level, msg, source));
log.debug("[{}PlaygroundLogger] {}: {}", source, level, msg);
}
/**
* 调试日志供JavaScript调用
* 使用Object参数避免Nashorn重载选择问题
*/
public void debug(Object message) {
log("DEBUG", message, "JS");
}
/**
* 信息日志供JavaScript调用
* 使用Object参数避免Nashorn重载选择问题
*/
public void info(Object message) {
log("INFO", message, "JS");
}
/**
* 警告日志供JavaScript调用
* 使用Object参数避免Nashorn重载选择问题
*/
public void warn(Object message) {
log("WARN", message, "JS");
}
/**
* 错误日志供JavaScript调用
* 使用Object参数避免Nashorn重载选择问题
*/
public void error(Object message) {
log("ERROR", message, "JS");
}
/**
* 错误日志带异常供JavaScript调用
*/
public void error(Object message, Throwable throwable) {
String msg = toString(message);
if (throwable != null) {
msg = msg + ": " + throwable.getMessage();
}
addLog(new LogEntry("ERROR", msg, "JS"));
log.debug("[JSPlaygroundLogger] ERROR: {}", msg);
}
// ===== 以下是供Java层调用的内部方法 =====
/**
* 调试日志供Java层调用
*/
public void debugJava(String message) {
log("DEBUG", message, "JAVA");
}
/**
* 信息日志供Java层调用
*/
public void infoJava(String message) {
log("INFO", message, "JAVA");
}
/**
* 警告日志供Java层调用
*/
public void warnJava(String message) {
log("WARN", message, "JAVA");
}
/**
* 错误日志供Java层调用
*/
public void errorJava(String message) {
log("ERROR", message, "JAVA");
}
/**
* 错误日志带异常供Java层调用
*/
public void errorJava(String message, Throwable throwable) {
String msg = message;
if (throwable != null) {
msg = msg + ": " + throwable.getMessage();
}
addLog(new LogEntry("ERROR", msg, "JAVA"));
log.debug("[JAVAPlaygroundLogger] ERROR: {}", msg);
}
/**
* 获取所有日志
*/
public List<LogEntry> getLogs() {
synchronized (logs) {
return new ArrayList<>(logs);
}
}
/**
* 获取日志数量
*/
public int size() {
return logs.size();
}
/**
* 清空日志
*/
public void clear() {
logs.clear();
}
}