把带彩色输出的命令重定向到 build.log,用 grep 搜关键词一条都搜不到,cat 文件看到每行前面是 ^[[32m 和 ^[[0m。日志里能对上时间点,这种反而好排。
程序检测到终端才输出颜色,但很多工具只要有 TERM 就输出,重定向后转义序列原样写进文件。grep 匹配的是可见文本,前面夹着控制序列就匹配不上。这一点先确认清楚,后面就不用反复试。
NO_COLOR=1 npm run build > build.log sed -r 's/\x1B\[[0-9;]*[mK]//g' build.log > clean.log grep -c 'ERROR' clean.log
「ANSI 颜色码」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:运行时设置 NO_COLOR=1 或 --no-color;已经生成的文件用 sed 去掉 ANSI 序列;管道下游用 less -R 查看 不要直接 cat;CI 里统一导出 NO_COLOR 环境变量。
结果对不对很好判断,日志里不再出现 ESC 序列 grep 能正常命中关键词。
