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
+21 -13
View File
@@ -8,6 +8,7 @@ import (
"log"
"net/http"
"bilidown/internal/logger"
"bilidown/internal/router"
"bilidown/internal/util"
@@ -28,12 +29,10 @@ var ffmpegAvailable bool
func main() {
ffmpegAvailable = checkFFmpeg()
logger.FFmpegStatus(ffmpegAvailable)
mustInitTables()
mustRunServer()
fmt.Printf("Bilidown %s server running at %s\n", VERSION, urlLocal)
if !ffmpegAvailable {
fmt.Println("Warning: FFmpeg is not installed. Video download will not work.")
}
logger.ServerStarted(HTTP_PORT, VERSION)
select {} // 保持运行
}
@@ -48,7 +47,7 @@ func mustRunServer() {
// 从嵌入的文件系统中获取静态文件
staticFS, err := fs.Sub(staticFiles, "static")
if err != nil {
log.Fatal("Failed to load static files:", err)
logger.Fatal("加载静态文件失败: " + err.Error())
}
// 前端静态文件
http.Handle("/", http.FileServer(http.FS(staticFS)))
@@ -77,7 +76,7 @@ func mustInitTables() {
"name" TEXT PRIMARY KEY NOT NULL,
"value" TEXT
)`); err != nil {
log.Fatalln("create table field:", err)
logger.Fatal("创建 field 表失败: " + err.Error())
}
if _, err := db.Exec(`CREATE TABLE IF NOT EXISTS "log" (
@@ -85,7 +84,7 @@ func mustInitTables() {
"content" TEXT NOT NULL,
"create_at" text NOT NULL DEFAULT CURRENT_TIMESTAMP
)`); err != nil {
log.Fatalln("create table log:", err)
logger.Fatal("创建 log 表失败: " + err.Error())
}
if _, err := db.Exec(`CREATE TABLE IF NOT EXISTS "task" (
@@ -102,21 +101,23 @@ func mustInitTables() {
"download_type" text NOT NULL DEFAULT 'merge',
"create_at" text NOT NULL DEFAULT CURRENT_TIMESTAMP
)`); err != nil {
log.Fatalln("create table task:", err)
logger.Fatal("创建 task 表失败: " + err.Error())
}
if _, err := util.GetCurrentFolder(db); err != nil {
log.Fatalln("util.GetCurrentFolder:", err)
logger.Fatal("获取下载目录失败: " + err.Error())
}
if err := initHistoryTask(db); err != nil {
log.Fatalln("initHistoryTask:", err)
logger.Fatal("初始化历史任务失败: " + err.Error())
}
// 添加可能缺失的列(用于数据库迁移)
if err := addMissingColumns(db); err != nil {
log.Fatalln("addMissingColumns:", err)
logger.Fatal("添加缺失列失败: " + err.Error())
}
logger.Info("数据库初始化完成")
}
// addMissingColumns 添加可能缺失的列(用于数据库迁移)
@@ -131,7 +132,14 @@ func addMissingColumns(db *sql.DB) error {
// initHistoryTask 将上一次程序运行时未完成的任务状态变为 error
func initHistoryTask(db *sql.DB) error {
util.SqliteLock.Lock()
_, err := db.Exec(`UPDATE "task" SET "status" = 'error' WHERE "status" IN ('waiting', 'running')`)
result, err := db.Exec(`UPDATE "task" SET "status" = 'error' WHERE "status" IN ('waiting', 'running')`)
util.SqliteLock.Unlock()
return err
if err != nil {
return err
}
rowsAffected, _ := result.RowsAffected()
if rowsAffected > 0 {
logger.Infof("重置 %d 个未完成任务状态为 error", rowsAffected)
}
return nil
}