# 長時間直播日誌保存
## 主 App
主日誌仍為 Documents/log.txt;超過約 7,000 行或 8 MiB 時,關閉 handle,將整個檔案移入 LogArchives,不再裁掉前段。下一批重新建立 log.txt。封存以時間及 UUID 命名;單次批次可略超過觸發門檻。
維持 0.5 秒/50 筆先到先寫。背景持續寫入會重用 handle,十秒閒置後才同步並關閉;回前景取消閒置關閉。系統暫停時程式無法持續執行,關檔不是保活機制,仍不能保證程序強制終止前零遺失。
成功 write 才計量;部分寫入失敗先回復,回復成功才有界重試。待寫緩衝 2 MiB、最多三次嘗試;超限或回復失敗以帶外摘要報告。日誌頁顯示活動主檔,完整歷史使用範圍匯出。
## 擴展交接
擴展的 normal/early 通道每次完成批次,以原子寫入發布到 App Group 的 SealedExtensionLogs,不再改寫、截斷共用活動檔。主 App 在啟動、回前景及匯出時接收不可變檔,先複製到 pending 暫存再 rename;成功才刪除交接檔。同名目的檔存在時視為前次已完成複製,避免程序中斷造成重複匯入。
SealedLogAccess 的排他檔案鎖只保護交接發布、匯入與清理;不涵蓋主 log.txt。鎖由 OS 隨 fd 關閉/程序退出釋放。新版本雙方必須一起部署。舊版 group log.txt/early-log.txt 匯出時只讀且固定讀取大小,不截斷;舊擴展若同時改寫,快照可能失敗或不一致,不能當成新協定保證。
兩通道與 Socket 回報可能重複,保留原文不做文字去重。側載沒有共享容器時,沿用擴展既有不落共享檔策略,不能宣稱主 App 暫停仍能跨程序保存。
## 容量與缺口
主 App 封存保留七天、總容量 256 MiB,匯入或輪替後清理最舊檔。擴展尚未交接的目錄每分鐘檢查一次,限制 256 MiB/10,000 檔,超過清理最舊批次。短時間可能超出門檻;單一極大批次亦可能被清理。不保證任意長直播整場永久保存。
清理前留下 retention-notice.txt,匯出會包含缺口警告。缺口摘要保存最近一次清理資訊,不是逐檔完整帳本。所有清理僅作用在專用目錄的普通 .log 檔,排除符號連結。
## 驗收與後續
已加入期限清理與跨封存邊界測試,Apple CI 與實機仍需驗證長時間背景、雙程序競爭、磁碟不足、鎖釋放、輪替與匯出。每批原子封存會增加 metadata I/O,需量測擴展負載;後續可改每程序活動段+封段交接。
目前按日期/時間匯出,不提供「目前這場/上一場」。下一步需以一致的 session ID 建立跨來源、跨午夜、重連與程序重啟索引,不能拿日期冒充直播場次。