update: 日志优化

This commit is contained in:
Kerwin
2025-10-28 11:07:00 +08:00
parent 53aebf2a15
commit 61beed6788
18 changed files with 991 additions and 75 deletions

View File

@@ -148,6 +148,11 @@ func (h *PublicAPIHandler) AddBatchResources(c *gin.Context) {
return
}
// 记录API访问安全日志
clientIP := c.ClientIP()
userAgent := c.GetHeader("User-Agent")
utils.Info("PublicAPI.AddBatchResources - API访问 - IP: %s, UserAgent: %s, 资源数量: %d", clientIP, userAgent, len(req.Resources))
// 收集所有待提交的URL去重
urlSet := make(map[string]struct{})
for _, resource := range req.Resources {
@@ -238,7 +243,9 @@ func (h *PublicAPIHandler) AddBatchResources(c *gin.Context) {
func (h *PublicAPIHandler) SearchResources(c *gin.Context) {
startTime := time.Now()
// 获取查询参数
// 记录API访问安全日志
clientIP := c.ClientIP()
userAgent := c.GetHeader("User-Agent")
keyword := c.Query("keyword")
tag := c.Query("tag")
category := c.Query("category")
@@ -246,6 +253,9 @@ func (h *PublicAPIHandler) SearchResources(c *gin.Context) {
pageStr := c.DefaultQuery("page", "1")
pageSizeStr := c.DefaultQuery("page_size", "20")
utils.Info("PublicAPI.SearchResources - API访问 - IP: %s, UserAgent: %s, Keyword: %s, Tag: %s, Category: %s, PanID: %s",
clientIP, userAgent, keyword, tag, category, panID)
page, err := strconv.Atoi(pageStr)
if err != nil || page < 1 {
page = 1
@@ -402,9 +412,14 @@ func (h *PublicAPIHandler) SearchResources(c *gin.Context) {
func (h *PublicAPIHandler) GetHotDramas(c *gin.Context) {
startTime := time.Now()
// 记录API访问安全日志
clientIP := c.ClientIP()
userAgent := c.GetHeader("User-Agent")
pageStr := c.DefaultQuery("page", "1")
pageSizeStr := c.DefaultQuery("page_size", "20")
utils.Info("PublicAPI.GetHotDramas - API访问 - IP: %s, UserAgent: %s", clientIP, userAgent)
page, err := strconv.Atoi(pageStr)
if err != nil || page < 1 {
page = 1

View File

@@ -130,6 +130,10 @@ func UpdateSystemConfig(c *gin.Context) {
return
}
adminUsername, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("UpdateSystemConfig - 管理员更新系统配置 - 管理员: %s, IP: %s", adminUsername, clientIP)
// 调试信息
utils.Info("接收到的配置请求: %+v", req)
@@ -320,6 +324,10 @@ func ToggleAutoProcess(c *gin.Context) {
return
}
adminUsername, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("ToggleAutoProcess - 管理员切换自动处理配置 - 管理员: %s, 启用: %t, IP: %s", adminUsername, req.AutoProcessReadyResources, clientIP)
// 获取当前配置
configs, err := repoManager.SystemConfigRepository.GetOrCreateDefault()
if err != nil {

View File

@@ -51,6 +51,10 @@ func (h *TaskHandler) CreateBatchTransferTask(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("CreateBatchTransferTask - 用户创建批量转存任务 - 用户: %s, 任务标题: %s, 资源数量: %d, IP: %s", username, req.Title, len(req.Resources), clientIP)
utils.Debug("创建批量转存任务: %s资源数量: %d选择账号数量: %d", req.Title, len(req.Resources), len(req.SelectedAccounts))
// 构建任务配置
@@ -124,6 +128,10 @@ func (h *TaskHandler) StartTask(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("StartTask - 用户启动任务 - 用户: %s, 任务ID: %d, IP: %s", username, taskID, clientIP)
err = h.taskManager.StartTask(uint(taskID))
if err != nil {
utils.Error("启动任务失败: %v", err)
@@ -147,6 +155,10 @@ func (h *TaskHandler) StopTask(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("StopTask - 用户停止任务 - 用户: %s, 任务ID: %d, IP: %s", username, taskID, clientIP)
err = h.taskManager.StopTask(uint(taskID))
if err != nil {
utils.Error("停止任务失败: %v", err)
@@ -170,6 +182,10 @@ func (h *TaskHandler) PauseTask(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("PauseTask - 用户暂停任务 - 用户: %s, 任务ID: %d, IP: %s", username, taskID, clientIP)
err = h.taskManager.PauseTask(uint(taskID))
if err != nil {
utils.Error("暂停任务失败: %v", err)
@@ -360,8 +376,13 @@ func (h *TaskHandler) DeleteTask(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("DeleteTask - 用户删除任务 - 用户: %s, 任务ID: %d, IP: %s", username, taskID, clientIP)
// 检查任务是否在运行
if h.taskManager.IsTaskRunning(uint(taskID)) {
utils.Warn("DeleteTask - 尝试删除正在运行的任务 - 用户: %s, 任务ID: %d, IP: %s", username, taskID, clientIP)
ErrorResponse(c, "任务正在运行中,无法删除", http.StatusBadRequest)
return
}
@@ -383,6 +404,7 @@ func (h *TaskHandler) DeleteTask(c *gin.Context) {
}
utils.Debug("任务删除成功: %d", taskID)
utils.Info("DeleteTask - 任务删除成功 - 用户: %s, 任务ID: %d, IP: %s", username, taskID, clientIP)
SuccessResponse(c, gin.H{
"message": "任务删除成功",
@@ -402,6 +424,10 @@ func (h *TaskHandler) CreateExpansionTask(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("CreateExpansionTask - 用户创建扩容任务 - 用户: %s, 账号ID: %d, IP: %s", username, req.PanAccountID, clientIP)
utils.Debug("创建扩容任务: 账号ID %d", req.PanAccountID)
// 获取账号信息,用于构建任务标题

View File

@@ -1,6 +1,7 @@
package handlers
import (
"fmt"
"net/http"
"strconv"
@@ -8,6 +9,7 @@ import (
"github.com/ctwj/urldb/db/dto"
"github.com/ctwj/urldb/db/entity"
"github.com/ctwj/urldb/middleware"
"github.com/ctwj/urldb/utils"
"github.com/gin-gonic/gin"
)
@@ -20,18 +22,24 @@ func Login(c *gin.Context) {
return
}
clientIP, _ := c.Get("client_ip")
utils.Info("Login - 尝试登录 - 用户名: %s, IP: %s", req.Username, clientIP)
user, err := repoManager.UserRepository.FindByUsername(req.Username)
if err != nil {
utils.Warn("Login - 用户不存在或密码错误 - 用户名: %s, IP: %s", req.Username, clientIP)
ErrorResponse(c, "用户名或密码错误", http.StatusUnauthorized)
return
}
if !user.IsActive {
utils.Warn("Login - 账户已被禁用 - 用户名: %s, IP: %s", req.Username, clientIP)
ErrorResponse(c, "账户已被禁用", http.StatusUnauthorized)
return
}
if !middleware.CheckPassword(req.Password, user.Password) {
utils.Warn("Login - 密码错误 - 用户名: %s, IP: %s", req.Username, clientIP)
ErrorResponse(c, "用户名或密码错误", http.StatusUnauthorized)
return
}
@@ -42,10 +50,13 @@ func Login(c *gin.Context) {
// 生成JWT令牌
token, err := middleware.GenerateToken(user)
if err != nil {
utils.Error("Login - 生成令牌失败 - 用户名: %s, IP: %s, Error: %v", req.Username, clientIP, err)
ErrorResponse(c, "生成令牌失败", http.StatusInternalServerError)
return
}
utils.Info("Login - 登录成功 - 用户名: %s(ID:%d), IP: %s", req.Username, user.ID, clientIP)
response := dto.LoginResponse{
Token: token,
User: converter.ToUserResponse(user),
@@ -62,9 +73,13 @@ func Register(c *gin.Context) {
return
}
clientIP, _ := c.Get("client_ip")
utils.Info("Register - 尝试注册 - 用户名: %s, 邮箱: %s, IP: %s", req.Username, req.Email, clientIP)
// 检查用户名是否已存在
existingUser, _ := repoManager.UserRepository.FindByUsername(req.Username)
if existingUser != nil {
utils.Warn("Register - 用户名已存在 - 用户名: %s, IP: %s", req.Username, clientIP)
ErrorResponse(c, "用户名已存在", http.StatusBadRequest)
return
}
@@ -72,6 +87,7 @@ func Register(c *gin.Context) {
// 检查邮箱是否已存在
existingEmail, _ := repoManager.UserRepository.FindByEmail(req.Email)
if existingEmail != nil {
utils.Warn("Register - 邮箱已存在 - 邮箱: %s, IP: %s", req.Email, clientIP)
ErrorResponse(c, "邮箱已存在", http.StatusBadRequest)
return
}
@@ -79,6 +95,7 @@ func Register(c *gin.Context) {
// 哈希密码
hashedPassword, err := middleware.HashPassword(req.Password)
if err != nil {
utils.Error("Register - 密码加密失败 - 用户名: %s, IP: %s, Error: %v", req.Username, clientIP, err)
ErrorResponse(c, "密码加密失败", http.StatusInternalServerError)
return
}
@@ -93,10 +110,13 @@ func Register(c *gin.Context) {
err = repoManager.UserRepository.Create(user)
if err != nil {
utils.Error("Register - 创建用户失败 - 用户名: %s, IP: %s, Error: %v", req.Username, clientIP, err)
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
utils.Info("Register - 注册成功 - 用户名: %s(ID:%d), 邮箱: %s, IP: %s", req.Username, user.ID, req.Email, clientIP)
SuccessResponse(c, gin.H{
"message": "注册成功",
"user": converter.ToUserResponse(user),
@@ -123,9 +143,14 @@ func CreateUser(c *gin.Context) {
return
}
adminUsername, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("CreateUser - 管理员创建用户 - 管理员: %s, 新用户名: %s, IP: %s", adminUsername, req.Username, clientIP)
// 检查用户名是否已存在
existingUser, _ := repoManager.UserRepository.FindByUsername(req.Username)
if existingUser != nil {
utils.Warn("CreateUser - 用户名已存在 - 管理员: %s, 用户名: %s, IP: %s", adminUsername, req.Username, clientIP)
ErrorResponse(c, "用户名已存在", http.StatusBadRequest)
return
}
@@ -133,6 +158,7 @@ func CreateUser(c *gin.Context) {
// 检查邮箱是否已存在
existingEmail, _ := repoManager.UserRepository.FindByEmail(req.Email)
if existingEmail != nil {
utils.Warn("CreateUser - 邮箱已存在 - 管理员: %s, 邮箱: %s, IP: %s", adminUsername, req.Email, clientIP)
ErrorResponse(c, "邮箱已存在", http.StatusBadRequest)
return
}
@@ -140,6 +166,7 @@ func CreateUser(c *gin.Context) {
// 哈希密码
hashedPassword, err := middleware.HashPassword(req.Password)
if err != nil {
utils.Error("CreateUser - 密码加密失败 - 管理员: %s, 用户名: %s, IP: %s, Error: %v", adminUsername, req.Username, clientIP, err)
ErrorResponse(c, "密码加密失败", http.StatusInternalServerError)
return
}
@@ -154,10 +181,13 @@ func CreateUser(c *gin.Context) {
err = repoManager.UserRepository.Create(user)
if err != nil {
utils.Error("CreateUser - 创建用户失败 - 管理员: %s, 用户名: %s, IP: %s, Error: %v", adminUsername, req.Username, clientIP, err)
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
utils.Info("CreateUser - 用户创建成功 - 管理员: %s, 用户名: %s(ID:%d), 角色: %s, IP: %s", adminUsername, req.Username, user.ID, req.Role, clientIP)
SuccessResponse(c, gin.H{
"message": "用户创建成功",
"user": converter.ToUserResponse(user),
@@ -179,12 +209,21 @@ func UpdateUser(c *gin.Context) {
return
}
adminUsername, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("UpdateUser - 管理员更新用户 - 管理员: %s, 目标用户ID: %d, IP: %s", adminUsername, id, clientIP)
user, err := repoManager.UserRepository.FindByID(uint(id))
if err != nil {
utils.Warn("UpdateUser - 目标用户不存在 - 管理员: %s, 用户ID: %d, IP: %s", adminUsername, id, clientIP)
ErrorResponse(c, "用户不存在", http.StatusNotFound)
return
}
// 记录变更前的信息
oldInfo := fmt.Sprintf("用户名:%s,邮箱:%s,角色:%s,状态:%t", user.Username, user.Email, user.Role, user.IsActive)
utils.Debug("UpdateUser - 更新前用户信息 - 管理员: %s, 用户ID: %d, 信息: %s", adminUsername, id, oldInfo)
if req.Username != "" {
user.Username = req.Username
}
@@ -198,10 +237,15 @@ func UpdateUser(c *gin.Context) {
err = repoManager.UserRepository.Update(user)
if err != nil {
utils.Error("UpdateUser - 更新用户失败 - 管理员: %s, 用户ID: %d, IP: %s, Error: %v", adminUsername, id, clientIP, err)
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
// 记录变更后信息
newInfo := fmt.Sprintf("用户名:%s,邮箱:%s,角色:%s,状态:%t", user.Username, user.Email, user.Role, user.IsActive)
utils.Info("UpdateUser - 用户更新成功 - 管理员: %s, 用户ID: %d, 更新前: %s, 更新后: %s, IP: %s", adminUsername, id, oldInfo, newInfo, clientIP)
SuccessResponse(c, gin.H{"message": "用户更新成功"})
}
@@ -220,8 +264,13 @@ func ChangePassword(c *gin.Context) {
return
}
adminUsername, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("ChangePassword - 管理员修改用户密码 - 管理员: %s, 目标用户ID: %d, IP: %s", adminUsername, id, clientIP)
user, err := repoManager.UserRepository.FindByID(uint(id))
if err != nil {
utils.Warn("ChangePassword - 目标用户不存在 - 管理员: %s, 用户ID: %d, IP: %s", adminUsername, id, clientIP)
ErrorResponse(c, "用户不存在", http.StatusNotFound)
return
}
@@ -229,6 +278,7 @@ func ChangePassword(c *gin.Context) {
// 哈希新密码
hashedPassword, err := middleware.HashPassword(req.NewPassword)
if err != nil {
utils.Error("ChangePassword - 密码加密失败 - 管理员: %s, 用户ID: %d, IP: %s, Error: %v", adminUsername, id, clientIP, err)
ErrorResponse(c, "密码加密失败", http.StatusInternalServerError)
return
}
@@ -236,10 +286,13 @@ func ChangePassword(c *gin.Context) {
user.Password = hashedPassword
err = repoManager.UserRepository.Update(user)
if err != nil {
utils.Error("ChangePassword - 更新密码失败 - 管理员: %s, 用户ID: %d, IP: %s, Error: %v", adminUsername, id, clientIP, err)
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
utils.Info("ChangePassword - 密码修改成功 - 管理员: %s, 用户名: %s(ID:%d), IP: %s", adminUsername, user.Username, id, clientIP)
SuccessResponse(c, gin.H{"message": "密码修改成功"})
}
@@ -252,12 +305,27 @@ func DeleteUser(c *gin.Context) {
return
}
adminUsername, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("DeleteUser - 管理员删除用户 - 管理员: %s, 目标用户ID: %d, IP: %s", adminUsername, id, clientIP)
// 先获取用户信息用于日志记录
user, err := repoManager.UserRepository.FindByID(uint(id))
if err != nil {
utils.Warn("DeleteUser - 目标用户不存在 - 管理员: %s, 用户ID: %d, IP: %s", adminUsername, id, clientIP)
ErrorResponse(c, "用户不存在", http.StatusNotFound)
return
}
err = repoManager.UserRepository.Delete(uint(id))
if err != nil {
utils.Error("DeleteUser - 删除用户失败 - 管理员: %s, 用户ID: %d, IP: %s, Error: %v", adminUsername, id, clientIP, err)
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
utils.Info("DeleteUser - 用户删除成功 - 管理员: %s, 用户名: %s(ID:%d), IP: %s", adminUsername, user.Username, id, clientIP)
SuccessResponse(c, gin.H{"message": "用户删除成功"})
}
@@ -269,12 +337,18 @@ func GetProfile(c *gin.Context) {
return
}
username, _ := c.Get("username")
clientIP, _ := c.Get("client_ip")
utils.Info("GetProfile - 用户获取个人资料 - 用户名: %s(ID:%d), IP: %s", username, userID, clientIP)
user, err := repoManager.UserRepository.FindByID(userID.(uint))
if err != nil {
utils.Warn("GetProfile - 用户不存在 - 用户名: %s(ID:%d), IP: %s", username, userID, clientIP)
ErrorResponse(c, "用户不存在", http.StatusNotFound)
return
}
response := converter.ToUserResponse(user)
utils.Debug("GetProfile - 成功获取个人资料 - 用户名: %s(ID:%d), IP: %s", username, userID, clientIP)
SuccessResponse(c, response)
}