# 🔍 DramaLing 後端錯誤日誌監控指南 ## 📋 目錄 1. [錯誤日誌系統概覽](#錯誤日誌系統概覽) 2. [監控工具使用方法](#監控工具使用方法) 3. [常見錯誤類型和排查](#常見錯誤類型和排查) 4. [實際使用案例](#實際使用案例) 5. [日誌級別說明](#日誌級別說明) 6. [快速診斷檢查清單](#快速診斷檢查清單) --- ## 🎯 錯誤日誌系統概覽 DramaLing 後端配備了完整的錯誤日誌系統,幫助開發者快速定位和解決問題。 ### ✅ **已配置的功能** - **全域錯誤處理中介軟體**:捕獲所有未處理的異常 - **詳細日誌配置**:Debug 級別記錄 - **結構化日誌**:包含請求詳情、堆疊追蹤 - **資料庫操作日誌**:SQL 查詢和執行時間 - **認證流程日誌**:完整的登入註冊追蹤 ### 🗂️ **相關檔案** - `Middleware/ErrorHandlingMiddleware.cs` - 全域錯誤處理 - `appsettings.json` - 日誌配置 - `Controllers/AuthController.cs` - 認證日誌 - `Program.cs` - 中介軟體註冊 --- ## 🛠️ 監控工具使用方法 ### **1. 查看即時日誌** ```bash # 查看當前後端服務的所有日誌 BashOutput(bash_id: "33d454") ``` ### **2. 過濾特定錯誤** ```bash # 只看錯誤和異常日誌 BashOutput(bash_id: "33d454", filter: "Error|Exception|fail") # 只看認證相關日誌 BashOutput(bash_id: "33d454", filter: "Registration|Login|Auth") # 只看資料庫錯誤 BashOutput(bash_id: "33d454", filter: "Database|DbCommand|Entity") ``` ### **3. 監控特定功能** ```bash # 監控 JWT 相關問題 BashOutput(bash_id: "33d454", filter: "JWT|Token|Bearer") # 監控模型驗證錯誤 BashOutput(bash_id: "33d454", filter: "ModelState|Validation") ``` ### **4. 找出服務 ID** 如果不知道當前的 bash_id,使用: ```bash /bashes ``` 然後找到運行 `dotnet run --urls=http://localhost:5000` 的服務 ID。 --- ## 🚨 常見錯誤類型和排查 ### **1. 認證錯誤** #### **問題症狀**: - 用戶無法登入 - JWT token 無效 - 401 Unauthorized 錯誤 #### **排查方法**: ```bash BashOutput(bash_id: "33d454", filter: "Login attempt|Authentication|JWT|Bearer") ``` #### **典型日誌**: ``` info: Login attempt for email: user@example.com warn: Bearer was not authenticated. Failure message: IDX10503: Signature validation failed info: User logged in successfully: 4111625f-e44c-4878-8fd0-4377eed45f04 ``` #### **解決步驟**: 1. 檢查 JWT 密鑰配置 2. 驗證 token 格式是否正確 3. 確認用戶是否存在於資料庫 ### **2. 資料庫錯誤** #### **問題症狀**: - 註冊失敗 - 資料無法儲存 - 500 Internal Server Error #### **排查方法**: ```bash BashOutput(bash_id: "33d454", filter: "DbCommand|Database|EntityFramework") ``` #### **典型日誌**: ``` dbug: Executed DbCommand (2ms) [Parameters=[@__request_Email_0='test@example.com']] SELECT EXISTS (SELECT 1 FROM "user_profiles" WHERE "u"."email" = @__request_Email_0) info: Database ensured created ``` #### **解決步驟**: 1. 檢查資料庫檔案是否存在 2. 驗證 SQL 查詢是否正確 3. 確認資料庫連線字串 ### **3. 模型驗證錯誤** #### **問題症狀**: - 表單驗證失敗 - 400 Bad Request - 密碼格式錯誤 #### **排查方法**: ```bash BashOutput(bash_id: "33d454", filter: "ModelState|Validation|BadRequest") ``` #### **典型日誌**: ``` warn: Invalid model state for registration: {"Password": ["Password must be at least 8 characters"]} dbug: The request has model state errors, returning an error response ``` #### **解決步驟**: 1. 檢查前端表單驗證 2. 確認後端模型註解 3. 驗證請求格式 ### **4. 應用程式異常** #### **問題症狀**: - 系統崩潰 - 未預期的錯誤 - 堆疊溢出 #### **排查方法**: ```bash BashOutput(bash_id: "33d454", filter: "Exception|fail:|error:") ``` #### **典型日誌**: ``` fail: Error during user registration System.InvalidOperationException: Unable to determine the relationship... at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator... ``` #### **解決步驟**: 1. 查看完整堆疊追蹤 2. 檢查相關程式碼 3. 驗證依賴注入配置 --- ## 📝 實際使用案例 ### **案例 1:用戶註冊失敗排查** **問題**:前端註冊表單提交後返回 500 錯誤 **排查步驟**: 1. **檢查認證日誌** ```bash BashOutput(bash_id: "33d454", filter: "Registration attempt") ``` 2. **查看詳細錯誤** ```bash BashOutput(bash_id: "33d454", filter: "Error during user registration") ``` 3. **檢查資料庫操作** ```bash BashOutput(bash_id: "33d454", filter: "INSERT INTO.*user_profiles") ``` **可能的解決方案**: - 資料庫關聯配置錯誤 - 模型驗證失敗 - 密碼雜湊錯誤 ### **案例 2:JWT Token 驗證失敗** **問題**:用戶登入後無法訪問受保護的端點 **排查步驟**: 1. **查看 Token 生成** ```bash BashOutput(bash_id: "33d454", filter: "User logged in successfully") ``` 2. **檢查 Token 驗證** ```bash BashOutput(bash_id: "33d454", filter: "Bearer.*authenticated|Token.*validation") ``` 3. **查看認證失敗原因** ```bash BashOutput(bash_id: "33d454", filter: "Failed to validate the token") ``` **可能的解決方案**: - JWT 密鑰不匹配 - Token 格式錯誤 - Token 過期 ### **案例 3:API 端點無回應** **問題**:API 請求沒有回應或超時 **排查步驟**: 1. **檢查請求是否到達** ```bash BashOutput(bash_id: "33d454", filter: "Request starting.*POST.*register") ``` 2. **查看路由匹配** ```bash BashOutput(bash_id: "33d454", filter: "Route matched|Executing endpoint") ``` 3. **檢查異常處理** ```bash BashOutput(bash_id: "33d454", filter: "An unhandled exception occurred") ``` **可能的解決方案**: - 路由配置錯誤 - 控制器異常 - 中介軟體問題 --- ## 📊 日誌級別說明 ### **Debug** - **目的**:詳細的開發調試信息 - **內容**:執行流程、參數值、內部狀態 - **例子**: ``` dbug: Creating DbConnection. dbug: Executed DbCommand (2ms) [Parameters=[@p0='value']] ``` ### **Information** - **目的**:重要的業務事件記錄 - **內容**:正常操作、成功事件 - **例子**: ``` info: User registered successfully: 4111625f-e44c-4878-8fd0-4377eed45f04 info: Application started. Press Ctrl+C to shut down. ``` ### **Warning** - **目的**:潛在問題警告 - **內容**:不影響功能但需要注意的情況 - **例子**: ``` warn: Failed to determine the https port for redirect. warn: Invalid model state for registration ``` ### **Error** - **目的**:錯誤和異常記錄 - **內容**:需要立即處理的問題 - **例子**: ``` fail: Error during user registration info: An unhandled exception occurred during request execution ``` --- ## 🎯 快速診斷檢查清單 當遇到問題時,按以下順序檢查: ### **Step 1: 服務健康檢查** ```bash curl "http://localhost:5000/health" ``` **預期結果**:`{"status":"Healthy","timestamp":"..."}` ### **Step 2: 查看最新錯誤** ```bash BashOutput(bash_id: "33d454", filter: "Error|fail|Exception") ``` **目的**:快速找出最近發生的錯誤 ### **Step 3: 檢查特定功能** 根據問題類型選擇: ```bash # 🔐 認證問題 BashOutput(bash_id: "33d454", filter: "Auth|Login|Register|JWT") # 🗄️ 資料庫問題 BashOutput(bash_id: "33d454", filter: "Database|DbCommand|Entity") # 📝 模型驗證問題 BashOutput(bash_id: "33d454", filter: "ModelState|Validation") # 🌐 API 路由問題 BashOutput(bash_id: "33d454", filter: "Route|Endpoint") ``` ### **Step 4: 深入分析** ```bash # 查看詳細追蹤 BashOutput(bash_id: "33d454", filter: "StackTrace|InnerException") # 查看完整請求流程 BashOutput(bash_id: "33d454", filter: "Request starting.*POST") ``` --- ## 💡 進階技巧 ### **1. 組合過濾器** ```bash # 同時監控多個關鍵字 BashOutput(bash_id: "33d454", filter: "Error.*Auth|Exception.*User") # 排除某些日誌 BashOutput(bash_id: "33d454", filter: "Error(?!.*Entity)") ``` ### **2. 時間範圍分析** 日誌包含精確時間戳,可以: - 對比問題發生時間 - 追蹤請求處理時長 - 分析系統性能 ### **3. 關聯分析** 使用 TraceId 和 RequestId 追蹤單一請求的完整生命週期: ``` => TraceId:8270820e8be6f0bdb0cc7ed6c8623004 => RequestId:0HNFL7QLPM33V:00000001 ``` ### **4. 即時監控** 可以定期檢查日誌來監控系統健康狀況: ```bash # 每隔一段時間檢查錯誤 BashOutput(bash_id: "33d454", filter: "Error|fail") ``` --- ## 🔧 常用監控命令 ### **日常監控** ```bash # 檢查服務狀態 curl "http://localhost:5000/health" # 查看最新日誌 BashOutput(bash_id: "33d454") # 只看錯誤 BashOutput(bash_id: "33d454", filter: "Error|Exception|fail") ``` ### **功能測試** ```bash # 測試註冊功能 curl -X POST "http://localhost:5000/api/auth/register" \ -H "Content-Type: application/json" \ -d '{"username": "test", "email": "test@example.com", "password": "testpass123"}' # 測試登入功能 curl -X POST "http://localhost:5000/api/auth/login" \ -H "Content-Type: application/json" \ -d '{"email": "test@example.com", "password": "testpass123"}' ``` ### **問題排查** ```bash # 檢查認證問題 BashOutput(bash_id: "33d454", filter: "Auth|Login|Register|JWT") # 檢查資料庫問題 BashOutput(bash_id: "33d454", filter: "Database|DbCommand|SQL") # 檢查 API 路由問題 BashOutput(bash_id: "33d454", filter: "Route|Endpoint|Controller") ``` --- ## 📚 日誌範例解讀 ### **成功註冊的日誌** ``` info: Registration attempt for user: logtest, Email: logtest@example.com dbug: Executed DbCommand (0ms) [Parameters=[@__request_Email_0='logtest@example.com']] SELECT EXISTS (SELECT 1 FROM "user_profiles" WHERE "u"."email" = @__request_Email_0) dbug: Executed DbCommand (1ms) [Parameters=[@p0='4111625f-e44c-4878-8fd0-4377eed45f04', ...]] INSERT INTO "user_profiles" (Id, username, email, password_hash, ...) info: User registered successfully: 4111625f-e44c-4878-8fd0-4377eed45f04 ``` ### **驗證錯誤的日誌** ``` warn: Invalid model state for registration: {"Password": ["Password must be at least 8 characters"]} dbug: The request has model state errors, returning an error response. info: Executing BadRequestObjectResult, writing value of type 'ValidationProblemDetails' ``` ### **系統異常的日誌** ``` fail: Error during user registration System.InvalidOperationException: Unable to determine the relationship... at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator... info: An unhandled exception occurred during request execution. Request: POST /api/auth/register ``` --- ## 🎯 故障排除流程圖 ``` 問題發生 ↓ 檢查服務是否運行 (/health) ↓ 查看最新錯誤日誌 (Error|Exception) ↓ 根據錯誤類型選擇: ├─ 認證問題 → 檢查 Auth 日誌 ├─ 資料庫問題 → 檢查 DbCommand 日誌 ├─ 驗證問題 → 檢查 ModelState 日誌 └─ 系統異常 → 檢查 StackTrace 日誌 ↓ 分析具體錯誤原因 ↓ 實施修復方案 ↓ 重新測試驗證 ``` --- ## 🚀 最佳實踐 ### **1. 定期監控** - 每次部署後檢查日誌 - 定期查看錯誤趨勢 - 監控關鍵業務流程 ### **2. 錯誤分類** - **緊急**:系統崩潰、資料庫連線失敗 - **重要**:認證失敗、API 異常 - **一般**:驗證錯誤、業務邏輯問題 ### **3. 日誌保存** 重要錯誤日誌應該保存下來用於: - 問題追蹤 - 性能分析 - 系統優化 --- ## 📞 支援 如果遇到無法解決的問題: 1. **收集信息**:保存相關日誌 2. **重現問題**:記錄重現步驟 3. **檢查環境**:確認配置和依賴 4. **尋求協助**:提供完整的錯誤資訊 --- **最後更新**:2025-09-16 **版本**:v1.0 **適用於**:DramaLing .NET Core API Backend --- ## 🔗 相關文檔 - [API 開發指南](./api/README.md) - [資料庫配置](./setup/env-setup.md) - [開發環境設置](./setup/README.md)