第6章:日志機制(調試)
歡迎來到我們了解ChatGPT-CodeReview
項目的最后一章
在第5章:文件過濾邏輯(范圍管理器)中,我們學習了機器人如何智能地決定哪些文件需要發送給AI審查。
但一旦機器人開始工作,我們如何知道它實際在做什么?它是否正確過濾了文件?AI是否響應了?是否發生了錯誤?
這就是**日志機制(調試)**發揮作用的地方
可以將其視為機器人的個人日記或飛機的"黑匣子記錄器"。它記錄了機器人內部的所有操作、行為和遇到的任何錯誤。這些詳細的記錄對于理解其行為、診斷問題和調試故障至關重要。
它解決了什么問題?
假設我們的ChatGPT-CodeReview
機器人已經設置好,一個拉取請求被打開,然后……什么都沒發生。沒有審查評論出現。或者審查不完整。如果沒有辦法窺探內部,我們將完全處于黑暗中
日志機制解決了可觀察性和調試的問題。它為機器人的內部世界提供了一個窗口。當我們啟用日志記錄時,機器人會"說出它的想法",告訴我們:
- “我收到了一個新的拉取請求事件。”
- “我正在初始化AI連接。”
- “這些文件被更改了。”
- “我決定忽略
package-lock.json
。” - “我正在將
src/feature.js
發送給AI。” - “糟糕,AI未能響應
src/bug.js
!” - “審查成功完成。”
如果沒有這個"日記",調試就像蒙著眼睛修理一臺復雜的機器
日志記錄讓我們能夠清楚地看到發生了什么,從而更容易確定為什么某些功能正常工作,或者更重要的是,為什么它沒有正常工作。
機器人的日記:日志級別
并非所有的日記條目都同等重要。有時我們需要每一個微小的細節,有時只需要重要事件。日志系統使用"日志級別"來按重要性對消息進行分類。這讓我們可以控制機器人記錄多少信息。
以下是ChatGPT-CodeReview
中主要的日志級別:
日志級別 | 類比 | 對機器人意味著什么 | 何時使用 |
---|---|---|---|
debug | 間諜相機 | 非常詳細的信息,每一步操作。 | 在主動調試特定問題時使用。 |
info | 報紙頭條 | 重要的里程碑和一般進展。 | 默認設置,用于一般理解。 |
warn | 警告標志 | 意外情況,但不是嚴重故障。 | 當懷疑存在小問題時使用。 |
error | 緊急警報 | 阻止操作的重大問題。 | 當功能明顯失效時使用。 |
如何使用日志(控制機器人的日記)
我們通過在.github/workflows/cr.yml
文件中設置LOG_LEVEL
環境變量來控制機器人的日志詳細程度
這是告訴機器人記錄和顯示哪些日記條目的主要方式。
設置LOG_LEVEL
可以在GitHub Actions工作流中配置:
# 文件: .github/workflows/cr.yml (片段)- uses: anc95/ChatGPT-CodeReview@mainenv:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}# ... 其他設置 ...# 👇 在這里設置日志級別!LOG_LEVEL: debug # 在調試時使用 'debug' 獲取最詳細的信息# LOG_LEVEL: info # 使用 'info'(默認)進行常規操作
解釋:
- 如果設置
LOG_LEVEL: debug
,機器人將記錄所有消息,包括debug
、info
、warn
和error
消息。這是最詳細的設置,非常適合深入調試。 - 如果設置
LOG_LEVEL: info
(或不設置LOG_LEVEL
,因為info
是默認值),機器人將僅記錄info
、warn
和error
消息。這提供了良好的概覽,而不會因過多細節而困擾。 - 如果設置為
error
,則僅顯示error
消息。
查看日志的位置
當機器人作為GitHub Action運行時,它記錄的所有消息都會被捕獲并顯示在GitHub倉庫的"Actions"選項卡中。
- 打開GitHub上的倉庫。
- 點擊"Actions"選項卡。
- 點擊特定的工作流運行(例如由拉取請求觸發的運行)。
- 導航到
Code Review
作業,然后點擊Run anc95/ChatGPT-CodeReview@main
步驟。 - 我們將看到所有記錄的日志消息打印在那里,幫助我們跟蹤機器人的操作過程。
幕后:日志機制的工作原理
ChatGPT-CodeReview
項目使用了一個簡單而有效的日志庫loglevel
該庫允許開發者以不同級別(debug
、info
等)編寫日志消息,然后根據LOG_LEVEL
設置控制哪些消息實際顯示。
解析:日志消息的旅程
當機器人的代碼決定記錄一條消息時,以下是發生的事情:
- 機器人調用
log.info()
:在機器人的核心邏輯(例如Probot應用核心(審查協調器))中,調用日志函數如log.info("審查開始...")
。 loglevel
檢查級別:loglevel
庫接收此消息。它將消息的級別(此處為info
)與我們配置的LOG_LEVEL
(例如debug
或info
)進行比較。如果消息的級別等于或高于配置的LOG_LEVEL
,則繼續。- 打印到控制臺:如果允許,
loglevel
庫將消息打印到系統的標準控制臺輸出。 - GitHub Actions捕獲:運行機器人的GitHub Actions運行器會自動捕獲打印到控制臺的所有內容。
- 顯示在日志中:最后,GitHub在運行詳情中顯示這些捕獲的輸出,使其對我們可見。
代碼(日記的設置)
讓我們看看實際配置和使用日志機制的代碼。
-
配置日志記錄器(
src/log.ts
):
此文件負責根據LOG_LEVEL
環境變量設置loglevel
庫。// 文件: src/log.ts import log, { LogLevelNames } from "loglevel";// 此行讀取LOG_LEVEL環境變量 // 如果未設置LOG_LEVEL,則默認為"info" log.setLevel((process.env.LOG_LEVEL as LogLevelNames) || "info");// 導出配置好的'log'對象,供其他文件使用 export default log;
解釋:這個簡短但關鍵的文件初始化了
loglevel
庫。它從環境變量中讀取LOG_LEVEL
(我們在.github/workflows/cr.yml
中設置)。如果沒有設置,機器人將默認使用info
級別的日志記錄,顯示重要的更新而不會過于詳細。 -
使用日志記錄器(
src/bot.ts
):
在機器人的主要邏輯(Probot應用核心(審查協調器))中,log
對象被用于記錄各種事件。// 文件: src/bot.ts (摘錄) import log from 'loglevel'; // 導入配置好的日志記錄器export const robot = (app: Probot) => {// ...app.on(['pull_request.opened', 'pull_request.synchronize'], async (context) => {const chat = await loadChat(context);if (!chat) {log.info('Chat初始化失敗'); // 記錄一個重要事件return 'no chat';}log.debug('pull_request:', context.payload.pull_request); // 記錄詳細的PR負載// ...if (!changedFiles?.length) {log.info('過濾后未發現變更'); // 記錄過濾結果return 'no change';}// ...for (let i = 0; i < changedFiles.length; i++) {const file = changedFiles[i];// ...if (!patch || patch.length > MAX_PATCH_COUNT) {log.info(`${file.filename} 因差異過大而被跳過`); // 記錄跳過文件的原因continue;}try {// ... AI審查邏輯 ...} catch (e) {log.info(`審查 ${file.filename} 失敗`, e); // 記錄審查過程中的錯誤throw e;}}// ...log.info('成功審查', context.payload.pull_request.html_url); // 記錄成功消息return 'success';}); };
解釋:在這里,我們可以看到
log.info()
和log.debug()
的使用。log.info()
用于諸如"Chat初始化失敗"、"過濾后未發現變更"或"成功審查"等消息。這些是正常操作期間需要了解的關鍵里程碑或結果。log.debug()
用于更詳細的細節,例如顯示整個pull_request
負載。這些消息通常僅在LOG_LEVEL
設置為debug
時顯示,幫助我們在需要時深入細節。
通過在機器人執行過程中的各個關鍵點放置這些log
調用,開發者創建了一個全面的"日記",幫助我們理解和調試機器人的行為。
總結
**日志機制(調試)**是我們理解、診斷和調試ChatGPT-CodeReview
機器人的重要工具
通過配置LOG_LEVEL
環境變量,我們可以控制機器人記錄多少關于其操作、過濾決策、AI交互和任何錯誤的信息
這個由loglevel
庫支持并在GitHub Actions工作流運行中顯示的"機器人日記",為我們提供了寶貴的內部運作洞察,使我們能夠有效調試并確保自動化代碼審查順利進行。
至此,我們對ChatGPT-CodeReview
項目的探索告一段落
我們學習了從與GitHub Actions的集成和審查協調,到與AI的對話、文件范圍管理以及通過日志提供可見性的核心組件
END ★,°:.☆( ̄▽ ̄)/.°★* 。