第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;这让我实在不敢向…