feat: add structured logging system for Docker deployment

添加日志系统,支持 Docker logs 捕获:
- 新增 logger 模块,提供 Info/Warn/Error/Debug 等日志级别
- 任务生命周期日志:创建、开始、完成、失败、取消
- 用户登录/登出日志
- 服务启动和 FFmpeg 状态日志
- 数据库初始化日志

日志格式:[时间] [级别] 消息,便于 Docker logs 查看

Co-Authored-By: AI
This commit is contained in:
2026-04-09 11:02:33 +08:00
parent 04e1045c4f
commit 9b73ea9b68
5 changed files with 182 additions and 18 deletions
+11 -5
View File
@@ -7,7 +7,6 @@ import (
"errors"
"fmt"
"io"
"log"
"net/http"
"os"
"os/exec"
@@ -20,6 +19,7 @@ import (
"bilidown/internal/bilibili"
"bilidown/internal/common"
"bilidown/internal/logger"
"bilidown/internal/util"
)
@@ -83,6 +83,7 @@ func CancelTask(taskID int64) bool {
if task.ID == taskID && (task.Status == "waiting" || task.Status == "running") {
task.Cancelled = true
task.Status = "error"
logger.TaskCancelled(task.ID, task.Title)
return true
}
}
@@ -111,6 +112,7 @@ func (task *Task) Create(db *sql.DB) error {
task.ID, err = result.LastInsertId()
task.CreateAt = time.Now()
logger.TaskCreated(task.ID, task.Title, task.Bvid)
return err
}
@@ -155,6 +157,7 @@ func (task *Task) Start() {
}
task.UpdateStatus(db, "running")
logger.TaskStarted(task.ID, task.Title)
if task.DownloadType == "audio" {
// 仅音频模式:只下载音频,重命名音频文件为输出文件
@@ -178,9 +181,10 @@ func (task *Task) Start() {
}
// 添加元数据
if err := task.addMetadata(outputPath); err != nil {
log.Printf("添加元数据失败 (任务ID: %d): %v", task.ID, err)
logger.Warnf("添加元数据失败 #%d: %v", task.ID, err)
}
task.UpdateStatus(db, "done")
logger.TaskCompleted(task.ID, task.Title, time.Since(task.CreateAt))
return
} else if task.DownloadType == "video" {
// 仅视频模式:只下载视频,重命名视频文件为输出文件
@@ -204,9 +208,10 @@ func (task *Task) Start() {
}
// 添加元数据
if err := task.addMetadata(outputPath); err != nil {
log.Printf("添加元数据失败 (任务ID: %d): %v", task.ID, err)
logger.Warnf("添加元数据失败 #%d: %v", task.ID, err)
}
task.UpdateStatus(db, "done")
logger.TaskCompleted(task.ID, task.Title, time.Since(task.CreateAt))
return
} else {
// 合并模式:下载音频和视频,然后合并
@@ -262,7 +267,7 @@ func (task *Task) Start() {
GlobalMergeSem.Release()
// 添加元数据
if err := task.addMetadata(outputPath); err != nil {
log.Printf("添加元数据失败 (任务ID: %d): %v", task.ID, err)
logger.Warnf("添加元数据失败 #%d: %v", task.ID, err)
}
task.UpdateStatus(db, "done")
}
@@ -356,8 +361,9 @@ func (task *Task) UpdateStatus(db *sql.DB, status TaskStatus, errs ...error) err
if err != nil {
err = util.CreateLog(db, fmt.Sprintf("Task-%d-Error: %v", task.ID, err))
if err != nil {
log.Fatalln("CreateLog:", err)
logger.Fatal("CreateLog: " + err.Error())
}
logger.TaskFailed(task.ID, task.Title, err)
}
}
task.Status = status