# 日誌系統說明
## 📋 日誌特性
### ✅ 追加模式
- 日誌以**追加模式**寫入 `mcp_server.log`
- 不會覆蓋之前的記錄
- 可以追蹤完整的呼叫歷史
### ✅ 函數呼叫記錄
每次工具被呼叫時,會記錄:
- 📍 `geocode_city(city='...')`
- 🌤️ `get_weather(lat=..., lon=..., hours=...)`
- ⚠️ `get_alerts(lat=..., lon=...)`
## 📊 日誌格式
### 伺服器啟動記錄
```
============================================================
🚀 MCP Weather Server Starting
============================================================
📅 Time: 2025-10-02 13:43:10
🔢 PID: 86621
🐍 Python: /home/alex/projects/weather_mcp/.venv/bin/python
📂 Script: /home/alex/projects/weather_mcp/src/weather_mcp/server.py
🔧 Tools: geocode_city, get_weather, get_alerts
📡 Transport: stdio
============================================================
✅ Server ready - waiting for client requests...
============================================================
```
### 函數呼叫記錄
```
📍 geocode_city(city='Tokyo')
🌤️ get_weather(lat=35.6895, lon=139.6917, hours=6)
⚠️ get_alerts(lat=35.6895, lon=139.6917)
```
## 📝 日誌範例
### 單次呼叫
```
📦 Loading weather-mcp-server module...
Called by: /home/alex/projects/weather_mcp/src/weather_mcp/server.py
============================================================
🚀 MCP Weather Server Starting
============================================================
📅 Time: 2025-10-02 13:43:10
🔢 PID: 86621
...
============================================================
✅ Server ready - waiting for client requests...
============================================================
[10/02/25 13:43:10] INFO Processing request of type ListToolsRequest
INFO Processing request of type CallToolRequest
📍 geocode_city(city='Tokyo')
```
### 多次呼叫(追加模式)
```
# 第一次呼叫
============================================================
🚀 MCP Weather Server Starting
============================================================
📅 Time: 2025-10-02 13:43:10
🔢 PID: 86621
...
📍 geocode_city(city='Tokyo')
# 第二次呼叫(追加在後面)
============================================================
🚀 MCP Weather Server Starting
============================================================
📅 Time: 2025-10-02 13:43:11
🔢 PID: 86656
...
🌤️ get_weather(lat=35.6895, lon=139.6917, hours=6)
# 第三次呼叫(繼續追加)
============================================================
🚀 MCP Weather Server Starting
============================================================
📅 Time: 2025-10-02 13:43:13
🔢 PID: 86681
...
📍 geocode_city(city='London')
```
## 🔍 日誌分析
### 查看最近的函數呼叫
```bash
grep -E "📍|🌤️|⚠️" mcp_server.log | tail -10
```
### 查看特定函數的呼叫
```bash
# 查看所有 geocode_city 呼叫
grep "📍 geocode_city" mcp_server.log
# 查看所有 get_weather 呼叫
grep "🌤️ get_weather" mcp_server.log
```
### 統計呼叫次數
```bash
# 統計各函數呼叫次數
echo "geocode_city: $(grep -c '📍 geocode_city' mcp_server.log)"
echo "get_weather: $(grep -c '🌤️ get_weather' mcp_server.log)"
echo "get_alerts: $(grep -c '⚠️ get_alerts' mcp_server.log)"
```
### 查看特定時間的呼叫
```bash
# 查看今天的呼叫
grep "$(date +%Y-%m-%d)" mcp_server.log
```
### 查看最近的伺服器啟動
```bash
grep "🚀 MCP Weather Server Starting" mcp_server.log | tail -5
```
## 🧹 日誌管理
### 清空日誌
```bash
# 完全清空
> mcp_server.log
# 或刪除
rm mcp_server.log
```
### 備份日誌
```bash
# 依日期備份
cp mcp_server.log mcp_server_$(date +%Y%m%d).log
# 壓縮備份
gzip -c mcp_server.log > mcp_server_$(date +%Y%m%d).log.gz
```
### 日誌輪替
```bash
# 當檔案超過 10MB 時輪替
if [ $(stat -f%z mcp_server.log 2>/dev/null || stat -c%s mcp_server.log) -gt 10485760 ]; then
mv mcp_server.log mcp_server_$(date +%Y%m%d_%H%M%S).log
fi
```
## 🔧 修改的檔案
### 1. `client.py` (第 91 行)
```python
# 改為追加模式('a' 而非 'w')
with open("mcp_server.log", "a", encoding="utf-8") as err:
```
### 2. `server.py` - 函數呼叫日誌
```python
# geocode_city (第 35 行)
print(f"📍 geocode_city(city='{city}')", file=sys.stderr, flush=True)
# get_weather (第 76 行)
print(f"🌤️ get_weather(lat={lat}, lon={lon}, hours={hours})", file=sys.stderr, flush=True)
# get_alerts (第 122 行)
print(f"⚠️ get_alerts(lat={lat}, lon={lon})", file=sys.stderr, flush=True)
```
### 3. `server.py` - 啟動分隔線 (第 155 行)
```python
# 加入換行以分隔不同的呼叫
print("\n" + "=" * 60, file=sys.stderr, flush=True)
```
## 📊 日誌用途
### 1. 除錯
- 追蹤函數呼叫順序
- 檢查傳遞的參數
- 確認伺服器啟動時機
### 2. 效能分析
- 統計各函數的呼叫頻率
- 分析伺服器啟動開銷
- 追蹤 PID 變化(每次都是新程序)
### 3. 審計
- 記錄完整的操作歷史
- 追蹤使用者查詢的城市
- 監控 API 使用量
## ⚙️ 自訂設定
### 修改日誌檔案位置
在 `client.py` 中修改:
```python
with open("logs/mcp_server.log", "a", encoding="utf-8") as err:
```
### 停用函數呼叫日誌
註解掉 `server.py` 中的 print 語句:
```python
# print(f"📍 geocode_city(city='{city}')", file=sys.stderr, flush=True)
```
### 新增更多資訊
可以在函數中加入回傳結果記錄:
```python
def geocode_city(self, city: str) -> List[Content]:
print(f"📍 geocode_city(city='{city}')", file=sys.stderr, flush=True)
# ... 執行邏輯 ...
# 記錄結果
if result_found:
print(f" ✅ Found: {display_name}", file=sys.stderr, flush=True)
else:
print(f" ❌ Not found", file=sys.stderr, flush=True)
```
## 📚 相關文件
- [SERVER_STARTUP.md](SERVER_STARTUP.md) - 伺服器啟動機制
- [server.py](../src/weather_mcp/server.py) - 伺服器實作
- [client.py](../src/weather_mcp/client.py) - 客戶端實作
---
**更新日期**: 2024-10-02
**狀態**: ✅ 追加模式 + 函數呼叫記錄已實作