[code-review] 日志機制 | `LOG_LEVEL`

第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,機器人將記錄所有消息,包括debuginfowarnerror消息。這是最詳細的設置,非常適合深入調試。
  • 如果設置LOG_LEVEL: info(或不設置LOG_LEVEL,因為info是默認值),機器人將僅記錄infowarnerror消息。這提供了良好的概覽,而不會因過多細節而困擾。
  • 如果設置為error,則僅顯示error消息。

查看日志的位置

當機器人作為GitHub Action運行時,它記錄的所有消息都會被捕獲并顯示在GitHub倉庫的"Actions"選項卡中。

  1. 打開GitHub上的倉庫。
  2. 點擊"Actions"選項卡。
  3. 點擊特定的工作流運行(例如由拉取請求觸發的運行)。
  4. 導航到Code Review作業,然后點擊Run anc95/ChatGPT-CodeReview@main步驟。
  5. 我們將看到所有記錄的日志消息打印在那里,幫助我們跟蹤機器人的操作過程。

幕后:日志機制的工作原理

ChatGPT-CodeReview項目使用了一個簡單而有效的日志庫loglevel

該庫允許開發者以不同級別(debuginfo等)編寫日志消息,然后根據LOG_LEVEL設置控制哪些消息實際顯示。

解析:日志消息的旅程

當機器人的代碼決定記錄一條消息時,以下是發生的事情:

機器人核心邏輯Loglevel庫系統控制臺GitHub Actions運行器1. 調用log.info("審查開始...")2. 檢查當前LOG_LEVEL是否允許'info'消息3. 如果允許,將消息打印到控制臺4. 控制臺輸出被運行器捕獲5. 輸出顯示在GitHub Actions日志中機器人核心邏輯Loglevel庫系統控制臺GitHub Actions運行器
  1. 機器人調用log.info():在機器人的核心邏輯(例如Probot應用核心(審查協調器))中,調用日志函數如log.info("審查開始...")
  2. loglevel檢查級別loglevel庫接收此消息。它將消息的級別(此處為info)與我們配置的LOG_LEVEL(例如debuginfo)進行比較。如果消息的級別等于或高于配置的LOG_LEVEL,則繼續。
  3. 打印到控制臺:如果允許,loglevel庫將消息打印到系統的標準控制臺輸出。
  4. GitHub Actions捕獲:運行機器人的GitHub Actions運行器會自動捕獲打印到控制臺的所有內容。
  5. 顯示在日志中:最后,GitHub在運行詳情中顯示這些捕獲的輸出,使其對我們可見。

代碼(日記的設置)

讓我們看看實際配置和使用日志機制的代碼。

  1. 配置日志記錄器(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級別的日志記錄,顯示重要的更新而不會過于詳細。

  2. 使用日志記錄器(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 ★,°:.☆( ̄▽ ̄)/.°★* 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96648.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

n8n工作流平臺入門學習指南

目錄 1、基礎背景 2、核心概念 2.1 節點(Nodes) 2.2 連接(Connections) 2.3 工作流(Workflows) 3、常用節點說明 4、基于Docker快速部署 5、學習資料 6、常見問題 強烈推薦&#xff0c;大家不懂的直接問&#xff1a;N8N大師&#xff08;GPT&#xff09;&#xff0c;科…

【Oracle經驗分享】字符串拼接過長問題的解決方案 —— 巧用 XMLAGG

&#x1f4d1; 目錄&#x1f50d; 問題背景?? 常見拼接方式的限制&#x1f4a1; XMLAGG 的解決方案&#x1f4dd; 示例代碼&#x1f4cc; 注意事項? 總結&#x1f50d; 問題背景在日常開發中&#xff0c;我們經常需要把多行數據拼接成一個字符串。例如將某個字段的多條記錄拼…

AJAX入門-URL、參數查詢、案例查詢

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在VS code中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML、CSS、JavaScript系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查…

【SpringBoot】24 核心功能 - Web開發原理 -Spring Boot 異常處理機制

前言 在開發 Web 應用程序時&#xff0c;異常處理是一個至關重要的部分。Spring Boot 提供了一套強大的異常處理機制&#xff0c;使得開發者能夠輕松地處理和響應各種異常情況。本文將深入探討 Spring Boot 中的異常處理機制&#xff0c;包括默認的錯誤處理規則、定制錯誤處理邏…

JVM第一部分

PC寄存器&#xff1a;存儲的是數字 0, 3, 6, 10, 17 這樣的字節碼偏移量。 LineNumberTable&#xff1a;是一個映射表&#xff0c;它將上述的偏移量“翻譯”成我們程序員能看懂的源代碼行號。 JVM堆 JVM堆由兩部分組成&#xff1a;年輕代老年代 年輕代包括三部分&#xff1a;ed…

IDEA使用Maven和MyBatis簡化數據庫連接(配置篇)

目錄&#xff1a; Maven:簡化項目構建 MyBatis:簡化Jdbc Maven&#xff1a;是一款項目構建與依賴管理工具&#xff0c;核心作用是自動化項目編譯、打包等流程&#xff0c;并統一管理項目所需的第三方 Jar 包&#xff08;如 MyBatis 的 Jar 包&#xff09;。 MyBatis&#xf…

Java 泛型詳解:從基礎到高級應用

目錄 一、泛型的基本概念 為什么需要泛型&#xff1f; 二、泛型類與泛型接口 【1】定義泛型類 【2】定義泛型接口 三、泛型方法 四、泛型通配符 【1】無界通配符&#xff08;?&#xff09; 【2】上界通配符&#xff08;? extends T&#xff09; 【3】下界通配符&am…

嵌入式 Linux 啟動機制全解析:從 Boot 到 Rootfs

&#x1f680; 嵌入式 Linux 啟動機制全解析&#xff1a;從 Boot 到 Rootfs 在嵌入式系統中&#xff0c;Linux 的啟動流程不僅是內核加載的過程&#xff0c;更是 bootloader、設備樹、初始根文件系統、啟動配置文件等多個組件協同工作的結果。不同的文件系統和啟動方式會影響系…

Python 操作Office的PPT、Word、Excel,同時兼容WPS

文章目錄概要一、環境準備1. 安裝必要的Python庫2. 系統要求二、核心實現原理1. 檢測已安裝的Office類型2. 初始化對應的應用程序三、完整代碼實現四、使用示例五、WPS兼容處理詳解1. 形狀和文本框訪問兼容處理2. PPT圖片粘貼兼容處理3. 資源釋放的重要性六、圖片操作實現詳解1…

ISP之DHCPv6-PD(前綴代理)為用戶下發前綴

一、組網需求家庭用戶要使用IPv6地址接入互聯網。為方便用戶接入&#xff0c;運營商使用DHCPv6-PD的方式給家用路由器下發IPv6地址前綴&#xff0c;用戶路由器LAN側不需要手工指定鏈路的IPv6地址前綴&#xff0c;家用路由器可以給用戶終端自動配置IPv6地址和其它網絡參數。本例…

Django全棧班v1.04 Python基礎語法 20250912 上午

rm 刪除命令 注意&#xff1a;刪除操作是不可逆的&#xff0c;一旦刪除就無法撤銷&#xff0c;請謹慎使用。刪除文件&#xff1a; rm file.py遞歸刪除目錄&#xff1a; rm -r demo/強制刪除&#xff1a; rm -f file.py交互式刪除&#xff1a; rm -i *.txt課程定位 “學習Python…

Java 21 虛擬線程高并發落地:中間件適配、場景匹配與細節優化的技術實踐

作為 Java 21 的核心特性,虛擬線程(Virtual Thread)憑借 “用戶態調度”“輕量級資源占用” 的優勢,成為高并發場景下線程模型優化的重要方向。但在實際落地中,不少團隊會陷入 “技術用了卻沒效果” 的困境 ——QPS 提升有限、中間件調用阻塞、CPU 使用率異常升高。 本文…

數據庫在并發訪問時,不同隔離級別下臟讀幻讀問題

數據庫隔離級別并非安裝后就固定&#xff0c;絕大多數主流數據庫&#xff08;如MySQL、PostgreSQL、SQL Server&#xff09;都支持動態調整和運行中自定義&#xff0c;具體調整范圍可分為全局、會話和語句三個層級。 全局級別調整&#xff1a;修改數據庫配置文件&#xff08;如…

JVM從入門到實戰:從字節碼組成、類生命周期到雙親委派及打破雙親委派機制

摘要&#xff1a;本文圍繞 Java 字節碼與類加載機制展開&#xff0c;詳解字節碼文件組成、類的生命周期&#xff0c;介紹類加載器分類、雙親委派機制及打破該機制的方式&#xff0c;還闡述了線程上下文類加載器與 SPI 機制在 JDBC 驅動加載中的應用&#xff0c;幫助深入理解 Ja…

多源最短路(Floyd算法

多源最短路簡介 多源最短路算法用于解決圖中任意兩節點間最短路徑的問題&#xff0c;廣泛應用于交通網絡、社交關系分析、路由優化等場景。與單源最短路&#xff08;如Dijkstra&#xff09;不同&#xff0c;它一次性計算所有節點對的最短距離&#xff0c;適合需要全局路徑規劃的…

【攻防實戰】記一次攻防實戰全流程

那天我向眾神祈禱&#xff0c;最后回答我的卻只有掙扎十年依舊不甘的自己&#xff01;成功究竟是饋贈還是償還。 前言 網絡安全技術學習&#xff0c;承認??的弱點不是丑事&#xff0c;只有對原理了然于?&#xff0c;才能突破更多的限制。 擁有快速學習能力的安全研究員&…

Anaconda配置環境變量和鏡像

Anaconda配置環境變量和鏡像 下載失敗就是開了梯子 Anaconda 作用&#xff1a;包管理&#xff08;集中&#xff0c;有序&#xff09;和環境管理&#xff08;版本切換&#xff09;使用conda命令對虛擬環境創建、刪除自帶python解釋器pip&#xff08;python自帶的包管理工具&…

給定單詞倒排

實現代碼&#xff1a;public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 輸入的字符串String input scanner.nextLine();// 存儲單詞List<String> words new ArrayList<>();// 存儲當前單詞StringBuilder currentWord new S…

IO進程——進程引入、進程函數接口

一、引入1、進程&程序1.1 程序編譯好的可執行的文件存放在磁盤上的指令和數據的有序集合&#xff08;文件&#xff09;程序是靜態的&#xff0c;沒有任何執行的概念1.2 進程一個獨立的可調度的任務執行一個程序所分配的資源的總稱進程是程序執行的一次過程進程是動態的&…

周末游戲推薦:安卓端俄羅斯方塊,經典與創新的結合

前段時間&#xff0c;每到周末我都會給大家推薦一些離線的經典游戲&#xff0c;原本打算將這個傳統一直延續下去。然而&#xff0c;我實在找不到足夠好用且無廣告的游戲了。有些游戲剛開始用的時候還不錯&#xff0c;但用著用著就開始頻繁彈出廣告&#xff0c;這讓我實在不敢向…