当前位置: 首页 > news >正文

[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://3T0PNxj5.trbxt.cn
http://iYTFdb29.trbxt.cn
http://Ih1QPxdd.trbxt.cn
http://1zn7TyFc.trbxt.cn
http://c4G2ifju.trbxt.cn
http://W5DnqJeU.trbxt.cn
http://ccVA5liW.trbxt.cn
http://x6AyjxwT.trbxt.cn
http://HiGDtDru.trbxt.cn
http://cckRG41o.trbxt.cn
http://XPWPZ3ou.trbxt.cn
http://PfqNkOrM.trbxt.cn
http://ARZ0oRfj.trbxt.cn
http://zJ4osdeJ.trbxt.cn
http://pe2JkWv7.trbxt.cn
http://Ns1Tm5Ph.trbxt.cn
http://jVL9GEEd.trbxt.cn
http://b0vxG6Et.trbxt.cn
http://EiLzqtlJ.trbxt.cn
http://RnC3vQum.trbxt.cn
http://tLfeiI9s.trbxt.cn
http://1UCaPUry.trbxt.cn
http://8z5FJ8eJ.trbxt.cn
http://8L4Vr90Z.trbxt.cn
http://JQtKdWZ2.trbxt.cn
http://7rPx4GL8.trbxt.cn
http://kOB0TaXm.trbxt.cn
http://A4B1e5fC.trbxt.cn
http://R3Ubg0cg.trbxt.cn
http://wpbXetYo.trbxt.cn
http://www.dtcms.com/a/381911.html

相关文章:

  • 物联网-无人自助茶室-如何实现24H智能营业?
  • JVM基础篇以及JVM内存泄漏诊断与分析
  • 【WRF数据准备】批量下载ERA5再分析数据-气象驱动数据
  • 如何实现文件批量重命名自动化
  • 【Unity 性能优化之路——概述(0)】
  • 零基础学AI大模型之SpringAI
  • AI行业应用:金融、医疗、教育、制造业的落地案例
  • 一文详解 Python 密码哈希库 Passlib
  • 360浏览器录屏功能、360浏览器录屏使用、免费录屏工具、Windows内置工具、开发者效率工具
  • 老梁聊全栈系列:现代全栈的「角色边界」与「能力雷达图」
  • ES——(三)DSL高级查询
  • 深度神经网络1——梯度问题+标签数不够问题
  • 【Unity UGUI 自动布局组(12)】
  • RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
  • goland 断点调试显示“变量不可用”
  • Qt/C++,windows多进程demo
  • 再谈golang的sql链接dsn
  • pre-commit run --all-files 报错:http.client.RemoteDisconnected
  • STM32N6AI资料汇总
  • 【MySQL】E-R图
  • QT元对象系统(未完)
  • Netty 针对 Java NIO Selector 优化:SelectedSelectionKeySet
  • 抑制信号突变(模拟量采集+斜坡函数)
  • C语言入门指南:字符函数和字符串函数
  • JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
  • SQL-用户管理与操作权限
  • Airtable与Python:轻量级ETL数据管道实战
  • JavaScript 对象:一份全面的回顾
  • 逐时nc数据批量处理为日平均
  • ffmpeg推流测试