排查故障时,原始日志常混着请求头、邮箱、完整路径和正文。只让 Claude “忽略敏感信息”已经太晚,因为内容已经被发送。更可控的方法是在本地生成专门的诊断样本:明确允许保留的字段,其余一律不输出,再由人检查结果是否可以共享。本文关注状态码与耗时排查,不试图保留完整业务上下文。
一 先决定分析真正需要什么
假设每行是一个 JSON 对象,只需要服务名、HTTP 状态码和耗时。服务名限于 web、worker;状态码为 100 至 599 的整数;耗时为 0 至 3600000 的整数毫秒。输出添加原文件行号,便于你在本地定位,不保留请求路径、用户标识或自由文本。
这是一份练习约定。真实服务名、精确时间和统计信息也可能敏感,字段白名单不能替代公司共享政策。若故障必须依靠特定请求内容才能复现,应另外制作虚构案例,不要默认把更多原始字段加回去。
二 完整的本地提取器
保存为 log_minimize.py。它使用 Python 标准库,单行最多读取 65537 字节以检测超长行,遇到超过限制的记录停止,而不是继续把整个文件读入内存。
import json
import sys
def clean(record):
if not isinstance(record, dict):
raise ValueError('对象格式错误')
service = record.get('service')
status = record.get('status')
duration = record.get('duration_ms')
if service not in ('web', 'worker'):
raise ValueError('服务名不在白名单')
if type(status) is not int or not 100 <= status <= 599:
raise ValueError('状态码无效')
if type(duration) is not int or not 0 <= duration <= 3600000:
raise ValueError('耗时无效')
return {'service': service, 'status': status, 'duration_ms': duration}
def main(path):
skipped = 0
line_no = 0
with open(path, 'rb') as source:
while True:
line = source.readline(65537)
if not line:
break
line_no += 1
if len(line) > 65536:
raise SystemExit('发现超长行,停止处理;请在本地检查')
try:
item = clean(json.loads(line))
except (ValueError, UnicodeDecodeError):
skipped += 1
continue
print(json.dumps({'line': line_no, **item}, ensure_ascii=False))
print(f'skipped={skipped}', file=sys.stderr)
if __name__ == '__main__':
if len(sys.argv) != 2:
raise SystemExit('用法:python3 log_minimize.py 输入文件')
main(sys.argv[1])
建立虚构的 demo.jsonl:
{"service":"web","status":503,"duration_ms":1800,"email":"demo@example.invalid","token":"FAKE_TOKEN_FOR_TEST"}
{"service":"worker","status":200,"duration_ms":42,"message":"不要输出这段原文"}
{"service":"web","status":true,"duration_ms":10}
not-json
运行 python3 log_minimize.py demo.jsonl > minimized.jsonl。标准输出应只有前两行的允许字段,错误输出应为 skipped=2。Python 的 JSON 文档说明了解码接口;脚本对字段类型和范围的限制则由本例业务约定决定。
三 给 Claude 的协作提示词
我要排查服务出现 503 与高延迟的问题。下面只提供经过本地白名单提取、人工复核的样本。 字段为 service、status、duration_ms、line;它不包含全部请求,也没有时间顺序保证。 请说明这些样本能支持什么结论、不能支持什么结论,再列出下一步要在本地检查的证据。 不要推断具体用户身份,不要把相关性写成故障原因;如需更多数据,请说明最小字段和用途。 样本:[粘贴允许共享的输出]。
如果需要 Claude 协助修改提取器,也只发送虚构日志和期望输出。不要先上传整份文件再要求模型写脱敏脚本。
四 检查输出与统计偏差
本文在 Python 3.12.14 中执行了样例、布尔值拒绝、字段白名单和超长行停止检查。测试只说明这些虚构输入符合预期,不代表所有日志都已安全处理。你仍应打开输出,搜索已知的虚构敏感标记,并检查是否意外保留业务机密。
跳过行会影响分析分母,不能拿两条有效样本推算整个系统的错误率。若出现大量跳过,应先在本地统计原因;不要为了得到更完整的数字而默默放宽规则。分析结束后,按自己的保留制度管理原始日志与派生文件,不要让临时排查材料长期散落在共享目录。
五 给提取器本身留一个退出条件
大日志中若持续出现格式错误,应停止分析并确认日志格式是否变更,而不是把跳过数量当成正常噪声。可以先处理一份受控副本,核对输出条数与预期范围,再扩大到需要的时间段。脚本处理的是逐行 JSON,不能直接用于多行堆栈、压缩文件或混合格式;将这些输入先按明确规则转换,比让解析器猜测更可靠。不要把错误原文写进异常报告,否则会从另一条输出路径泄露刚刚排除的内容。
方法参考:Anthropic 提示工程概览。