这篇论文提出了一种名为 ReLog 的新方法,旨在解决软件开发中一个非常头疼的问题:如何写好“日志”(Logging)。
为了让你轻松理解,我们可以把软件开发比作在黑暗的森林里开飞机,而“日志”就是飞行员留下的飞行记录或黑匣子数据。
1. 以前的做法:盲人摸象(静态生成)
现状:
以前,程序员或自动化工具写日志,就像是在看地图(静态代码分析)来猜飞机飞到了哪里。
- 比喻: 想象你在写一本日记,但你从来没出过门,只是坐在家里看着地图,凭想象写:“今天天气不错,我飞过了 A 山,B 河。”
- 问题: 这种日记写出来可能语法完美,但完全没用。因为飞机可能根本没飞过去,或者在飞的时候遇到了大风暴(Bug),但日记里没记下来。
- 旧方法的局限: 以前的自动化工具只是模仿人类程序员写的日记,看“长得像不像”,而不关心“能不能帮人找到飞机失事的原因”。而且,它们只写一次,写完就不管了。
2. 这篇论文的创新:像人类一样“边飞边记”(ReLog)
核心思想:
ReLog 认为,写日志不应该是一次性写完就结束,而应该是一个**“飞行 -> 记录 -> 检查 -> 修正”**的循环过程。
ReLog 是怎么工作的?(四步走)
起飞(生成初始日志):
- 让程序先跑一次。就像飞机先起飞,看看实际发生了什么。
- 如果飞机在某个地方卡住了(报错),ReLog 就会说:“嘿,这里不对劲,我要在这里记一笔。”
检查黑匣子(编译与修复):
- 有时候,新加的日记本(日志代码)可能会把飞机弄坏(编译错误)。
- 比喻: 就像你往飞机里塞了一个新零件,结果螺丝没拧紧,飞机飞不起来。ReLog 有个“维修工”(编译修复模块),专门负责把新加的日志修好,确保飞机能继续飞,不会半路散架。
看记录够不够(评估):
- 飞机落地后,ReLog 会请一位**“超级侦探”(LLM 大模型)**来检查刚才的飞行记录。
- 侦探会问: “这记录里有没有说清楚为什么飞机坠毁了?有没有记下当时的风速?有没有记下哪个零件过热了?”
- 如果记录太模糊(比如只写了“出事了”),侦探就会说:“不行,这太简略了,没法破案。”
修正日记(迭代优化):
- 根据侦探的反馈,ReLog 会回去修改日志。
- 比喻: 侦探说:“你只记了‘引擎响了’,但没记‘引擎声音变大了’和‘冒黑烟了’。”于是 ReLog 就把日记改成:“引擎声音变大,且冒黑烟。”
- 然后,再次起飞、再次检查、再次修正……直到日记本里包含了所有破案需要的关键线索。
3. 为什么要这么做?(为了 AI 侦探)
以前写日志主要是给人类看的。但在 AI 时代,日志还要给AI 侦探(用于自动修复 Bug 的 AI)看。
- 旧方法: 给 AI 看一本写得像诗一样的日记,但全是废话,AI 看了也猜不出飞机为什么坠毁。
- ReLog 方法: 给 AI 看一本**“破案专用”的日记。它不追求写得漂亮,只追求信息量足**。哪怕多写几句,只要能帮 AI 找到 Bug 的根源,就是好日志。
4. 结果怎么样?
论文做了很多实验(就像在模拟器里试飞了 300 多次):
- 找 Bug 更准: ReLog 生成的日志,让 AI 找 Bug 的准确率比以前的方法高出了很多(就像侦探破案率从 40% 提升到了 52%)。
- 修 Bug 更多: 有了这些高质量的日志,AI 成功修复了 97 个 Bug,而以前的方法只能修 60 多个。
- 即使没有源代码也能破案: 即使不给 AI 看飞机的设计图纸(源代码),只给它看 ReLog 生成的飞行记录,它也能猜出大概哪里出了问题。
总结
这篇论文的核心贡献就是打破了“写日志是一次性任务”的旧观念。
它提出:写日志应该像人类调试程序一样,是“跑一跑、看一看、改一改”的迭代过程。 通过让 AI 不断根据实际运行结果来优化日志内容,最终生成出对“自动修复 Bug"最有用的信息。
一句话概括:
以前的日志是“为了写而写”,现在的 ReLog 是**“为了破案而写”**,它通过不断的“试飞”和“修正”,确保留下的每一行字都能帮 AI 侦探揪出真正的罪魁祸首。
论文技术总结:Logging Like Humans for LLMs (ReLog)
1. 研究背景与问题定义 (Problem)
核心痛点:
现有的自动日志语句生成方法主要存在两个局限性,难以适应大语言模型(LLM)时代的软件维护需求:
- 静态单步生成 (Static Single-Pass): 现有方法通常仅基于静态代码分析(如 AST、上下文)一次性生成日志,忽略了程序的实际运行行为。然而,有效的日志往往需要根据运行时观察(如异常、性能瓶颈)进行迭代调整。
- 评估标准偏差 (Evaluation Bias): 现有研究通常通过计算生成日志与开发者手写日志的文本相似度来评估效果。这种假设隐含了“开发者写的日志就是黄金标准”,但实际上开发者日志可能存在缺陷,且相似度高低并不直接等同于日志对下游任务(如缺陷定位、修复)的实用价值。
新挑战:
在 LLM 时代,日志不仅供人类开发者阅读,更是 LLM 进行缺陷定位、故障分析和程序修复的关键输入。因此,日志生成的目标应从“模仿人类”转向“为下游 LLM 任务提供可观测性(Observability)”。
2. 方法论:ReLog 框架 (Methodology)
为了解决上述问题,作者提出了 ReLog,一个由运行时反馈驱动的迭代式日志生成框架。ReLog 将日志生成视为一个闭环的“执行 - 评估 - 优化”过程,而非静态预测任务。
核心流程(四个阶段):
初始日志生成 (Initial Generation):
- 结合源代码上下文和初始执行结果(如异常堆栈、返回值)生成初始日志语句。
- 若程序正常执行,则基于代码上下文生成;若出现异常,则聚焦于故障相关区域。
- 输出为离散的日志语句列表及其插入位置,而非重写整个代码块。
编译修复 (Compilation Repair):
- 将生成的日志插入代码后,系统尝试编译。
- 若编译失败(如变量未定义、类型不匹配),利用编译器报错信息作为反馈,自动修复日志语句(如修正变量名、添加导入),确保代码可执行。
- 关键点: 仅修改新生成的日志部分,保持原始逻辑不变。
日志充分性评估 (Log Sufficiency Evaluation):
- 执行修复后的代码,收集运行时日志。
- 引入一个基于 LLM 的评估器(Critic),根据结构化标准评估日志是否足以支持下游任务。评估维度包括:
- 可追溯性 (Traceability): 是否清晰暴露了执行路径。
- 状态可见性 (State Visibility): 关键变量和中间状态是否被记录。
- 因果关联 (Causal Linkage): 是否提供了解释故障原因的证据,而不仅仅是现象。
- 若评估不通过,生成具体的改进反馈(如“缺少除数为零的检查”)。
迭代优化 (Iterative Refinement):
- 基于评估器的反馈,优化器(Refiner) 对日志列表进行针对性修改(添加、删除或修改语句)。
- 重复上述“执行 - 修复 - 评估 - 优化”循环,直到日志满足诊断需求或达到最大迭代次数(实验设为 5 次)。
3. 实验设置与数据集 (Experimental Setup)
为了验证生成的日志对 LLM 下游任务的实用性,作者构建了基于 Defects4J 的两个新基准数据集,并设计了两种调试场景:
- 直接调试 (Direct Debugging): LLM 代理同时拥有故障源代码和生成的运行时日志。任务包括缺陷定位和程序修复。
- 间接调试 (Indirect Debugging): LLM 代理无法访问源代码,仅依靠运行时日志和调用上下文进行缺陷定位。这模拟了生产环境下的黑盒调试场景。
对比基线:
包括传统深度学习方法(LANCE, FastLog, LANCE2)和基于 LLM 的方法(UniLog, GoStatic 等)。
4. 主要结果 (Results)
实验在多个 LLM(GPT-5-mini, DeepSeek-V3, Qwen3-Coder, GLM-4.7)上进行了验证,结果显示 ReLog 显著优于所有基线:
4.1 直接调试表现
- 缺陷定位 (Defect Localization): ReLog 的 F1 分数达到 0.520,比最佳基线(UniLog, 0.447)高出 16.33%。
- 程序修复 (Program Repair): ReLog 成功修复了 97 个缺陷,远超基线(UniLog 修复 63 个,LANCE 仅 38 个)。
- 编译成功率: ReLog 实现了 0 次编译失败,而部分基线(如 FastLog, LANCE2)有高达 140+ 次的编译失败,导致无法生成有效日志。
4.2 间接调试表现 (无源码场景)
- 在仅依赖日志的情况下,ReLog 的 F1 分数为 0.408,比最佳基线(GoStatic, 0.350)高出 16.57%。
- 证明了 ReLog 生成的日志包含足够的诊断信息,即使没有源码也能辅助 LLM 定位故障。
4.3 消融实验与通用性
- 组件重要性: 移除“编译修复”模块会导致编译失败率剧增,召回率下降;移除“迭代优化”模块会导致 F1 分数大幅下降(从 0.520 降至 0.388)。两者缺一不可。
- 模型无关性: ReLog 在不同 LLM 上均表现稳定,证明其性能提升主要源于框架设计(迭代反馈机制),而非特定模型的强大能力。
5. 核心贡献 (Key Contributions)
- 提出 ReLog 框架: 首个将日志生成视为运行时反馈驱动的迭代过程的框架,通过执行、修复、评估、优化的闭环,生成对 LLM 下游任务真正有用的日志。
- 新的评估范式: 摒弃了传统的“文本相似度”评估,提出了基于下游任务效用(Downstream Utility) 的评估方法,直接衡量日志在缺陷定位和修复中的实际价值。
- 构建新基准: 基于 Defects4J 构建了直接调试和间接调试两个数据集,填补了评估生成日志在 LLM 辅助调试场景下实用性的空白。
- 实证结果: 证明了迭代优化和编译修复机制能显著提升日志质量,使 LLM 在有无源码的情况下均能更准确地定位和修复缺陷。
6. 意义与影响 (Significance)
- 范式转变: 将日志生成从“静态模仿人类”转变为“动态服务机器(LLM)”,强调日志的可观测性和诊断价值。
- 提升自动化调试能力: 为 LLM 驱动的自动化软件工程(ASE)提供了高质量的数据输入,显著提升了 LLM 在复杂故障场景下的推理和修复能力。
- 工程实践指导: 揭示了日志语句往往需要多次迭代才能完善,为开发者和自动化工具提供了新的优化思路,即通过运行时反馈来动态调整日志策略。
总结: ReLog 通过模拟人类开发者“观察日志 -> 发现问题 -> 修改代码”的迭代过程,利用 LLM 和编译器反馈自动化了这一循环,成功生成了能够最大化下游调试效率的日志语句,是 LLM 时代软件维护领域的一项重要进展。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。