Log 格式說明
LogEntry 欄位
第一階段已實作的輸出欄位如下:
| 欄位 | 說明 | 必填 |
|---|---|---|
| Timestamp | Log 時間,使用 ISO 8601 格式 | 是 |
| Level | INFO / ERROR | 是 |
| TaskId | 任務識別碼 | 是 |
| NodeId | 節點代號 | 是 |
| NodeName | 節點名稱 | 是 |
| DeviceId | 設備識別碼 | 依情境 |
| CommandName | 命令名稱 | 依情境 |
| Status | 節點狀態,例如 completed / failed | 是 |
| RetryCount | 實際重試次數 | 是 |
| TimeTakenMs | 節點整體耗時毫秒數 | 是 |
| ErrorCode | 錯誤代碼,成功時為 NONE | 是 |
| Message | 紀錄訊息 | 是 |
範例:
2026-05-22T00:26:20.6077037+08:00 level="INFO" taskId="demo-task" nodeId="light-on" nodeName="開啟燈號" deviceId="LED_001" command="LightOn" status="completed" retryCount=0 timeTakenMs=0 errorCode="NONE" message="Mock command 'LightOn' completed."
ConsoleLogWriter 與 FileLogWriter 共用 LogEntryFormatter,確保 Console 與檔案輸出格式一致。字串欄位會使用雙引號包住,換行、反斜線與雙引號會被轉義,避免單筆 Log 斷行造成後續查詢困難。
後續目標欄位
| 欄位 | 說明 | 必填 |
|---|---|---|
| Timestamp | Log 時間 | 是 |
| Level | Debug / Info / Warn / Error | 是 |
| TaskId | 任務識別碼 | 是 |
| NodeId | 節點代號 | 是 |
| NodeName | 節點名稱 | 是 |
| DeviceId | 設備代號 | 依情境 |
| DeviceName | 設備名稱 | 依情境 |
| CommandName | 命令名稱 | 依情境 |
| Status | 任務或節點狀態 | 是 |
| StartTime | 開始時間 | 是 |
| EndTime | 結束時間 | 是 |
| TimeTakenMs | 耗時 | 是 |
| ErrorCode | 錯誤代碼 | 失敗時必填 |
| ErrorMessage | 錯誤訊息 | 失敗時必填 |
| RetryCount | 重試次數 | 依情境 |
| RawRequest | 原始送出資料 | 依情境 |
| RawResponse | 原始回應資料 | 依情境 |
| Operator | 操作人 | 依情境 |
| HostName | 主機名稱 | 是 |
| AppVersion | 程式版本 | 是 |
原則
- 不得只寫「失敗」。
- 錯誤需能追到 Task、Node、Device、Command。
- RawRequest / RawResponse 可依資料敏感度決定是否遮蔽。
- 第一階段先輸出 FileLogWriter / ConsoleLogWriter / MemoryLogWriter。