dramaling-vocab-learning/docs/03_development/error-logging-guide.md

502 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔍 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")
```
**可能的解決方案**
- 資料庫關聯配置錯誤
- 模型驗證失敗
- 密碼雜湊錯誤
### **案例 2JWT 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 過期
### **案例 3API 端點無回應**
**問題**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)