diff --git a/springboot-backend/src/main/java/com/admin/common/aop/LogAspect.java b/springboot-backend/src/main/java/com/admin/common/aop/LogAspect.java index 64b3cdb..3313c74 100644 --- a/springboot-backend/src/main/java/com/admin/common/aop/LogAspect.java +++ b/springboot-backend/src/main/java/com/admin/common/aop/LogAspect.java @@ -137,9 +137,9 @@ public class LogAspect { ); // 打印单条完整异常日志 - log.error(errorMessage, ex); + log.info(errorMessage, ex); } catch (Exception e) { - log.error("记录异常日志时出错: {}", e.getMessage()); + log.info("记录异常日志时出错: {}", e.getMessage()); } } diff --git a/springboot-backend/src/main/java/com/admin/common/exception/GlobalExceptionHandler.java b/springboot-backend/src/main/java/com/admin/common/exception/GlobalExceptionHandler.java index 25880ae..4c241ae 100644 --- a/springboot-backend/src/main/java/com/admin/common/exception/GlobalExceptionHandler.java +++ b/springboot-backend/src/main/java/com/admin/common/exception/GlobalExceptionHandler.java @@ -21,20 +21,20 @@ public class GlobalExceptionHandler { public R MethodArgumentNotValidException(MethodArgumentNotValidException e) { BindingResult result = e.getBindingResult(); ObjectError objectError = result.getAllErrors().stream().findFirst().get(); - log.error("实体校验异常:----------------{}", objectError.getDefaultMessage()); + log.info("实体校验异常:----------------{}", objectError.getDefaultMessage()); return R.err(500, objectError.getDefaultMessage()); } // 未授权异常捕获 @ExceptionHandler(value = UnauthorizedException.class) public R handleUnauthorizedException(UnauthorizedException e) { - log.error("未授权异常:----------------{}", e.getMessage()); + log.info("未授权异常:----------------{}", e.getMessage()); return R.err(401, e.getMessage()); } @ExceptionHandler(value = Exception.class) public R Exception(Exception e){ - log.error("异常:----------------{}", e.getMessage()); + log.info("异常:----------------{}", e.getMessage()); return R.err(-2, e.getMessage()); } diff --git a/springboot-backend/src/main/java/com/admin/common/task/CheckGostConfigAsync.java b/springboot-backend/src/main/java/com/admin/common/task/CheckGostConfigAsync.java index 3e13962..ed01c43 100644 --- a/springboot-backend/src/main/java/com/admin/common/task/CheckGostConfigAsync.java +++ b/springboot-backend/src/main/java/com/admin/common/task/CheckGostConfigAsync.java @@ -74,7 +74,7 @@ public class CheckGostConfigAsync { if (Objects.equals(type, "tcp")) { // 只处理TCP,避免重复处理 Forward forward = forwardService.getById(forwardId); if (forward == null) { - log.warn("删除孤立的服务: {} (节点: {})", service.getName(), node.getId()); + log.info("删除孤立的服务: {} (节点: {})", service.getName(), node.getId()); GostDto gostDto = GostUtil.DeleteService(node.getId(), forwardId + "_" + userId + "_" + userTunnelId); System.out.println(gostDto); } @@ -82,7 +82,7 @@ public class CheckGostConfigAsync { if (Objects.equals(type, "tls")) { Forward forward = forwardService.getById(forwardId); if (forward == null) { - log.warn("删除孤立的服务: {} (节点: {})", service.getName(), node.getId()); + log.info("删除孤立的服务: {} (节点: {})", service.getName(), node.getId()); GostUtil.DeleteRemoteService(node.getId(), forwardId+"_"+userId+"_"+userTunnelId); } } @@ -112,7 +112,7 @@ public class CheckGostConfigAsync { if (Objects.equals(type, "chains")) { Forward forward = forwardService.getById(forwardId); if (forward == null) { - log.warn("删除孤立的链: {} (节点: {})", chain.getName(), node.getId()); + log.info("删除孤立的链: {} (节点: {})", chain.getName(), node.getId()); GostUtil.DeleteChains(node.getId(), forwardId+"_"+userId+"_"+userTunnelId); } } @@ -134,7 +134,7 @@ public class CheckGostConfigAsync { safeExecute(() -> { SpeedLimit speedLimit = speedLimitService.getById(limiter.getName()); if (speedLimit == null) { - log.warn("删除孤立的限流器: {} (节点: {})", limiter.getName(), node.getId()); + log.info("删除孤立的限流器: {} (节点: {})", limiter.getName(), node.getId()); GostUtil.DeleteLimiters(node.getId(), Long.parseLong(limiter.getName())); } }, "清理限流器 " + limiter.getName()); @@ -148,7 +148,7 @@ public class CheckGostConfigAsync { try { operation.run(); } catch (Exception e) { - log.error("执行操作失败: {}", operationDesc, e); + log.info("执行操作失败: {}", operationDesc, e); } } diff --git a/springboot-backend/src/main/java/com/admin/common/task/ResetFlowAsync.java b/springboot-backend/src/main/java/com/admin/common/task/ResetFlowAsync.java index 2e109ab..1f43512 100644 --- a/springboot-backend/src/main/java/com/admin/common/task/ResetFlowAsync.java +++ b/springboot-backend/src/main/java/com/admin/common/task/ResetFlowAsync.java @@ -78,7 +78,7 @@ public class ResetFlowAsync { log.info("到期任务执行完成"); } catch (Exception e) { - log.error("定时任务执行失败", e); + log.info("定时任务执行失败", e); } } @@ -126,12 +126,12 @@ public class ResetFlowAsync { log.info("用户[ID: {}, 用户名: {}]流量重置成功,重置日期: 每月{}号", user.getId(), user.getUser(), user.getFlowResetTime()); } else { - log.error("用户[ID: {}, 用户名: {}]流量重置失败", user.getId(), user.getUser()); + log.info("用户[ID: {}, 用户名: {}]流量重置失败", user.getId(), user.getUser()); } } } catch (Exception e) { - log.error("重置用户流量失败", e); + log.info("重置用户流量失败", e); } } @@ -179,13 +179,13 @@ public class ResetFlowAsync { log.info("用户隧道[ID: {}, 用户ID: {}, 隧道ID: {}]流量重置成功,重置日期: 每月{}号", userTunnel.getId(), userTunnel.getUserId(), userTunnel.getTunnelId(), userTunnel.getFlowResetTime()); } else { - log.error("用户隧道[ID: {}, 用户ID: {}, 隧道ID: {}]流量重置失败", + log.info("用户隧道[ID: {}, 用户ID: {}, 隧道ID: {}]流量重置失败", userTunnel.getId(), userTunnel.getUserId(), userTunnel.getTunnelId()); } } } catch (Exception e) { - log.error("重置用户隧道流量失败", e); + log.info("重置用户隧道流量失败", e); } } diff --git a/springboot-backend/src/main/java/com/admin/common/utils/AESCrypto.java b/springboot-backend/src/main/java/com/admin/common/utils/AESCrypto.java index 1f12452..4b51b5c 100644 --- a/springboot-backend/src/main/java/com/admin/common/utils/AESCrypto.java +++ b/springboot-backend/src/main/java/com/admin/common/utils/AESCrypto.java @@ -42,9 +42,9 @@ public class AESCrypto { this.secretKey = new SecretKeySpec(keyBytes, ALGORITHM); this.secureRandom = new SecureRandom(); - log.debug("AES加密器初始化成功"); + log.info("AES加密器初始化成功"); } catch (Exception e) { - log.error("AES加密器初始化失败", e); + log.info("AES加密器初始化失败", e); throw new RuntimeException("AES加密器初始化失败: " + e.getMessage(), e); } } @@ -83,7 +83,7 @@ public class AESCrypto { return Base64.getEncoder().encodeToString(buffer.array()); } catch (Exception e) { - log.error("数据加密失败", e); + log.info("数据加密失败", e); throw new RuntimeException("数据加密失败: " + e.getMessage(), e); } } @@ -137,7 +137,7 @@ public class AESCrypto { return cipher.doFinal(ciphertext); } catch (Exception e) { - log.error("数据解密失败", e); + log.info("数据解密失败", e); throw new RuntimeException("数据解密失败: " + e.getMessage(), e); } } @@ -161,7 +161,7 @@ public class AESCrypto { try { return new AESCrypto(secret); } catch (Exception e) { - log.error("创建AES加密器失败: {}", e.getMessage()); + log.info("创建AES加密器失败: {}", e.getMessage()); return null; } } diff --git a/springboot-backend/src/main/java/com/admin/common/utils/WebSocketServer.java b/springboot-backend/src/main/java/com/admin/common/utils/WebSocketServer.java index b6a5e97..282cdab 100644 --- a/springboot-backend/src/main/java/com/admin/common/utils/WebSocketServer.java +++ b/springboot-backend/src/main/java/com/admin/common/utils/WebSocketServer.java @@ -112,7 +112,7 @@ public class WebSocketServer extends TextWebSocketHandler { } } } catch (Exception e) { - log.error("处理响应消息失败: {}", e.getMessage(), e); + log.info("处理响应消息失败: {}", e.getMessage(), e); } } else { log.info("收到消息: {}", decryptedPayload); @@ -135,7 +135,7 @@ public class WebSocketServer extends TextWebSocketHandler { } } } catch (Exception e) { - log.error("处理WebSocket消息时发生异常: {}", e.getMessage(), e); + log.info("处理WebSocket消息时发生异常: {}", e.getMessage(), e); } } @@ -155,18 +155,18 @@ public class WebSocketServer extends TextWebSocketHandler { // 获取或创建加密器 AESCrypto crypto = getOrCreateCrypto(nodeSecret); if (crypto == null) { - log.warn("⚠️ 收到加密消息但无法创建解密器,使用原始数据"); + log.info("⚠️ 收到加密消息但无法创建解密器,使用原始数据"); return payload; } // 解密数据 String decryptedData = crypto.decryptString(encryptedMessage.getData()); - log.debug("🔓 WebSocket消息解密成功"); + log.info("🔓 WebSocket消息解密成功"); return decryptedData; } } catch (Exception e) { // 解析失败,可能是非加密格式,直接返回原始数据 - log.debug("WebSocket消息未加密或解密失败,使用原始数据: {}", e.getMessage()); + log.info("WebSocket消息未加密或解密失败,使用原始数据: {}", e.getMessage()); } return payload; @@ -191,11 +191,11 @@ public class WebSocketServer extends TextWebSocketHandler { encryptedMessage.put("data", encryptedData); encryptedMessage.put("timestamp", System.currentTimeMillis()); - log.debug("🔐 WebSocket消息加密成功"); + log.info("🔐 WebSocket消息加密成功"); return encryptedMessage.toJSONString(); } } catch (Exception e) { - log.warn("⚠️ WebSocket消息加密失败,发送原始数据: {}", e.getMessage()); + log.info("⚠️ WebSocket消息加密失败,发送原始数据: {}", e.getMessage()); } return message; @@ -232,7 +232,7 @@ public class WebSocketServer extends TextWebSocketHandler { // 检查是否已有该节点的连接,如果有则记录日志但直接覆盖 WebSocketSession existingSession = nodeSessions.get(nodeId); if (existingSession != null && existingSession.isOpen()) { - log.warn("节点 {} 已有连接存在: {},新连接将覆盖旧连接", nodeId, existingSession.getId()); + log.info("节点 {} 已有连接存在: {},新连接将覆盖旧连接", nodeId, existingSession.getId()); // 清理旧连接的锁对象 sessionLocks.remove(existingSession.getId()); } @@ -246,7 +246,7 @@ public class WebSocketServer extends TextWebSocketHandler { log.info("主动关闭节点 {} 的旧连接: {}", nodeId, existingSession.getId()); existingSession.close(); } catch (Exception e) { - log.error("关闭节点 {} 旧连接失败: {}", nodeId, e.getMessage()); + log.info("关闭节点 {} 旧连接失败: {}", nodeId, e.getMessage()); } } @@ -270,17 +270,17 @@ public class WebSocketServer extends TextWebSocketHandler { res.put("data", 1); broadcastMessage(res.toJSONString()); } else { - log.error("节点 {} 状态更新失败", nodeId); + log.info("节点 {} 状态更新失败", nodeId); } } else { - log.error("节点 {} 不存在,无法更新状态", nodeId); + log.info("节点 {} 不存在,无法更新状态", nodeId); // 移除无效的会话 nodeSessions.remove(nodeId); } } } catch (Exception e) { - log.error("建立连接时发生异常: {}", e.getMessage(), e); + log.info("建立连接时发生异常: {}", e.getMessage(), e); // 异常情况下,确保清理会话 try { String id = session.getAttributes().get("id").toString(); @@ -288,10 +288,10 @@ public class WebSocketServer extends TextWebSocketHandler { if (Objects.equals(type, "1")) { Long nodeId = Long.valueOf(id); nodeSessions.remove(nodeId); - log.warn("由于异常,移除节点 {} 的会话", nodeId); + log.info("由于异常,移除节点 {} 的会话", nodeId); } } catch (Exception cleanupException) { - log.error("清理异常会话时出错: {}", cleanupException.getMessage()); + log.info("清理异常会话时出错: {}", cleanupException.getMessage()); } } } @@ -341,10 +341,10 @@ public class WebSocketServer extends TextWebSocketHandler { res.put("data", 0); broadcastMessage(res.toJSONString()); } else { - log.error("节点 {} 状态更新为离线失败", nodeId); + log.info("节点 {} 状态更新为离线失败", nodeId); } } else { - log.warn("节点 {} 不存在,无法更新离线状态", nodeId); + log.info("节点 {} 不存在,无法更新离线状态", nodeId); } } @@ -352,7 +352,7 @@ public class WebSocketServer extends TextWebSocketHandler { sessionLocks.remove(sessionId); } catch (Exception e) { - log.error("关闭连接时发生异常: {}", e.getMessage(), e); + log.info("关闭连接时发生异常: {}", e.getMessage(), e); } } @@ -383,7 +383,7 @@ public class WebSocketServer extends TextWebSocketHandler { socketSession.sendMessage(new TextMessage(finalMessage)); } } catch (Exception e) { - log.error("发送WebSocket消息失败 [sessionId={}]: {}", sessionId, e.getMessage()); + log.info("发送WebSocket消息失败 [sessionId={}]: {}", sessionId, e.getMessage()); cleanupSession(socketSession); } } @@ -428,14 +428,14 @@ public class WebSocketServer extends TextWebSocketHandler { WebSocketSession nodeSession = nodeSessions.get(node_id); if (nodeSession == null) { - log.warn("发送消息失败:节点 {} 不在线或会话不存在", node_id); + log.info("发送消息失败:节点 {} 不在线或会话不存在", node_id); GostDto result = new GostDto(); result.setMsg("节点不在线"); return result; } if (!nodeSession.isOpen()) { - log.warn("发送消息失败:节点 {} 连接已断开,清理会话", node_id); + log.info("发送消息失败:节点 {} 连接已断开,清理会话", node_id); nodeSessions.remove(node_id); sessionLocks.remove(nodeSession.getId()); GostDto result = new GostDto(); @@ -461,7 +461,7 @@ public class WebSocketServer extends TextWebSocketHandler { sendToUser(nodeSession, data.toJSONString(), nodeSecret); GostDto result = future.get(10, TimeUnit.SECONDS); - log.debug("成功发送消息到节点 {} 并收到响应: {}", node_id, result.getMsg()); + log.info("成功发送消息到节点 {} 并收到响应: {}", node_id, result.getMsg()); return result; } catch (Exception e) { @@ -471,10 +471,10 @@ public class WebSocketServer extends TextWebSocketHandler { GostDto result = new GostDto(); if (e instanceof java.util.concurrent.TimeoutException) { result.setMsg("等待响应超时"); - log.warn("节点 {} 响应超时,可能存在连接问题", node_id); + log.info("节点 {} 响应超时,可能存在连接问题", node_id); } else { result.setMsg("发送消息失败: " + e.getMessage()); - log.error("发送消息到节点 {} 失败: {}", node_id, e.getMessage(), e); + log.info("发送消息到节点 {} 失败: {}", node_id, e.getMessage(), e); } return result; } diff --git a/springboot-backend/src/main/java/com/admin/config/EncryptionConfig.java b/springboot-backend/src/main/java/com/admin/config/EncryptionConfig.java index 16b56f8..20764f5 100644 --- a/springboot-backend/src/main/java/com/admin/config/EncryptionConfig.java +++ b/springboot-backend/src/main/java/com/admin/config/EncryptionConfig.java @@ -57,7 +57,7 @@ public class EncryptionConfig { public static void clearCrypto(String secret) { if (secret != null) { CRYPTO_CACHE.remove(secret); - log.debug("已清理密钥对应的加密器实例"); + log.info("已清理密钥对应的加密器实例"); } } diff --git a/springboot-backend/src/main/java/com/admin/config/WebSocketInterceptor.java b/springboot-backend/src/main/java/com/admin/config/WebSocketInterceptor.java index 85fb0cb..08b3192 100644 --- a/springboot-backend/src/main/java/com/admin/config/WebSocketInterceptor.java +++ b/springboot-backend/src/main/java/com/admin/config/WebSocketInterceptor.java @@ -1,6 +1,7 @@ package com.admin.config; +import com.admin.common.utils.IpUtils; import com.admin.common.utils.JwtUtil; import com.admin.entity.Node; import com.admin.service.NodeService; @@ -14,6 +15,7 @@ import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; import javax.annotation.Resource; +import java.net.InetSocketAddress; import java.util.Map; import java.util.Objects; @@ -37,9 +39,10 @@ public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { String type = serverHttpRequest.getServletRequest().getParameter("type"); String version = serverHttpRequest.getServletRequest().getParameter("version"); if (Objects.equals(type, "1")) { + System.out.println("type: " + type + " - version: " + version + " - secret: " + secret + " - IP: " + getClientIp(request)); Node node = nodeService.getOne(new QueryWrapper().eq("secret", secret)); if (node == null) { - log.warn("节点验证失败:未找到匹配的secret"); + log.info("节点验证失败:未找到匹配的secret"); return false; } attributes.put("id", node.getId()); @@ -56,5 +59,13 @@ public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { return true; } + public String getClientIp(ServerHttpRequest request) { + InetSocketAddress remoteAddress = request.getRemoteAddress(); + if (remoteAddress != null) { + return remoteAddress.getAddress().getHostAddress(); + } + return null; + } + } diff --git a/springboot-backend/src/main/java/com/admin/controller/FlowController.java b/springboot-backend/src/main/java/com/admin/controller/FlowController.java index ffd6f8e..a4c7ad0 100644 --- a/springboot-backend/src/main/java/com/admin/controller/FlowController.java +++ b/springboot-backend/src/main/java/com/admin/controller/FlowController.java @@ -154,7 +154,7 @@ public class FlowController extends BaseController { } // 记录日志 - log.debug("🔓 节点流量数据接收成功{}", isEncryptedMessage(rawData) ? "(已解密)" : ""); + log.info("🔓 节点流量数据接收成功{}", isEncryptedMessage(rawData) ? "(已解密)" : ""); // 4. 处理流量数据 return processFlowData(flowDataList); @@ -193,18 +193,18 @@ public class FlowController extends BaseController { // 获取或创建加密器 AESCrypto crypto = getOrCreateCrypto(secret); if (crypto == null) { - log.warn("⚠️ 收到加密消息但无法创建解密器,使用原始数据"); + log.info("⚠️ 收到加密消息但无法创建解密器,使用原始数据"); return rawData; } // 解密数据 String decryptedData = crypto.decryptString(encryptedMessage.getData()); - log.debug("🔓 数据解密成功"); + log.info("🔓 数据解密成功"); return decryptedData; } } catch (Exception e) { // 解析失败,可能是非加密格式,直接返回原始数据 - log.debug("数据未加密或解密失败,使用原始数据: {}", e.getMessage()); + log.info("数据未加密或解密失败,使用原始数据: {}", e.getMessage()); } return rawData; diff --git a/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java index 5057b23..3a4d3c8 100644 --- a/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java +++ b/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java @@ -1060,7 +1060,7 @@ public class ForwardServiceImpl extends ServiceImpl impl R deleteResult = deleteOldGostServices(existForward, oldTunnel); if (deleteResult.getCode() != 0) { // 删除失败时记录日志,但不影响后续创建(可能原配置已不存在) - log.warn("删除原隧道{}的Gost配置失败: {}", oldTunnel.getId(), deleteResult.getMsg()); + log.info("删除原隧道{}的Gost配置失败: {}", oldTunnel.getId(), deleteResult.getMsg()); } // 3. 创建新的Gost服务配置 @@ -1088,7 +1088,7 @@ public class ForwardServiceImpl extends ServiceImpl impl if (!oldNodeInfo.isHasError() && oldNodeInfo.getInNode() != null) { GostDto serviceResult = GostUtil.DeleteService(oldNodeInfo.getInNode().getId(), serviceName); if (!isGostOperationSuccess(serviceResult)) { - log.warn("删除主服务失败: {}", serviceResult.getMsg()); + log.info("删除主服务失败: {}", serviceResult.getMsg()); } } @@ -1098,7 +1098,7 @@ public class ForwardServiceImpl extends ServiceImpl impl if (!oldNodeInfo.isHasError() && oldNodeInfo.getInNode() != null) { GostDto chainResult = GostUtil.DeleteChains(oldNodeInfo.getInNode().getId(), serviceName); if (!isGostOperationSuccess(chainResult)) { - log.warn("删除链服务失败: {}", chainResult.getMsg()); + log.info("删除链服务失败: {}", chainResult.getMsg()); } } @@ -1114,7 +1114,7 @@ public class ForwardServiceImpl extends ServiceImpl impl if (outNode != null) { GostDto remoteResult = GostUtil.DeleteRemoteService(outNode.getId(), serviceName); if (!isGostOperationSuccess(remoteResult)) { - log.warn("删除远程服务失败: {}", remoteResult.getMsg()); + log.info("删除远程服务失败: {}", remoteResult.getMsg()); } } } diff --git a/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java index 4032c59..a07fffe 100644 --- a/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java +++ b/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java @@ -762,7 +762,7 @@ public class UserServiceImpl extends ServiceImpl implements Us } } - log.debug("用户 {} 获取到 {} 条实际记录,补齐为 {} 条24小时记录", userId, recentFlows.size(), result.size()); + log.info("用户 {} 获取到 {} 条实际记录,补齐为 {} 条24小时记录", userId, recentFlows.size(), result.size()); return result; }