本卡屬 FR-085(母卡 CM-XXXX,建完補號),第 2 棒:log 全鏈(jedi monorepo)。只掃不修。 建議在 C1 驗收完之後跑。
掃 jedi-common 的 logger/ 共 32 檔。這是全站 log 的設定與寫入鏈:每一行 log 長什麼樣、帶哪些欄位(操作者是誰)、寫到哪裡(螢幕/檔案/資料庫的 system_logs 表/遠端追蹤服務)。要找的是:log 會不會把密碼、token、完整網址、完整錯誤堆疊寫出去;log 上標的「操作者」能不能被偽造;寫到資料庫的那份有沒有客戶隔離。只找問題、不修問題。
這是 jedi-common 裡唯一一條「資料離開 process」的路,看的是「什麼東西被寫出去」而不是「誰能讀」,心智模型跟另外兩棒完全不同。它自成 DDD 四層(db_log/system_log/ 下 app/domain/infra),與其他兩棒零耦合。宿主 import 只有 7 處,但它靠 dictConfig 全域掛載生效,爆炸半徑跟 import 數無關。
首腦與偵察 agent 讀過程式碼後的起點,未經驗證。工具不會照這份清單走(連續四個 arc 如此),工具沒答的你要自己開檔查,並在報告標明「(工具未報,runner 人工查證)」。
logger/middleware.py:13 user_id_var.set(request.headers.get("X-UserId", "System"))、logger/decorator.py:11 同款。首腦已 grep BE 與 FE 兩個 repo:沒有任何地方設定 X-UserId header——意思是正常流量這個值永遠是 System,而任何人送一個 X-UserId: admin 就能讓稽核紀錄寫成別人做的。要追:這兩個 contextvar 最後流到哪(custom_formatter.py?db_handler.py 的 user_uid?),跟 session/auth/auth_context.py 那個真正的登入身分是不是兩套?哪一套進了 system_logs 表?decorator.py:13 adapter.info(f"Request: {request.method} {request.url}")。要追:哪些端點用了這個 decorator(grep 宿主)?有沒有 token/密碼走 query string 的端點(例如下載連結、簽名網址)?logger/db_log/db_handler.py:14-16 message += '\n\n' + record.exc_text,整段 exc_text 寫進 system_logs。要追:(a) traceback 裡會不會夾帶區域變數值(密碼、token)?(b) public.system_logs 表有沒有 RLS policy——首腦 grep scripts/init/02-schema.sql 沒看到,請用 DEV 庫 SELECT * FROM pg_policies WHERE tablename='system_logs' 實查(唯讀);沒有的話,誰能讀這張表?custom_formatter.py:27 與 :35 OTLPSpanExporter(endpoint="localhost:4317", insecure=True),這段在模組頂層、import 就執行(副作用)。要追:正式環境有沒有 4317 在聽?沒有的話 exporter 會怎樣(靜默丟棄?累積記憶體?阻塞?);有的話 span 內容含什麼(request 參數?SQL?)。custom_formatter.py:44-49 在 format 時呼叫 get_user_context(),把 login_name/uid/nickname 加進每行。要追:這跟 ① 的 X-UserId 是兩套身分並存嗎?哪套可信?db_handler.py:19 datetime.strptime(record.asctime, ...)——asctime 只在 formatter 跑過才存在,且 emit() 沒有 try/except。要追:handler 炸了會怎樣(logging 模組預設印到 stderr 繼續,還是把原本的 request 打死)?有沒有「log 寫入失敗 → 例外 → 又要寫 log → 無限遞迴」的組合?config_dev.py/config_stg.py/config_prod.py:DBLogHandler 掛在哪些頂層 logger(DEV 是 7 個且 propagate=False)、prod 哪些 logger 是 DEBUG level(偵察看到 prod 的 infra 是 DEBUG)、RotatingFileHandler 寫 log/ 的檔案權限、log 檔會不會進出貨 image。逐項對照三個檔。utils/common_utils.py:150 mark_password(在第 3 棒 C3,本棒允許越界讀它)。要追:logger 這一鏈有沒有任何地方呼叫它?沒有的話,request body 裡的密碼是不是原文進 log?system_logs 表的歸屬移到 jedi-log(FR-080 design 第③組),但寫入端仍在本套件的 db_log/。表結構在 BE scripts/init/02-schema.sql。core/app_factory.py 掛 dictConfig;api/log_forwarding/+infra/log_forwarding/ 是 FR-068 的 log 轉發鏈(在 jedi-log-forwarding 套件,不在本棒),本棒只看 jedi-common 這一段。