Jenkins 控制台日志被截断速查:日志过大、归档完整日志与 tee 落文件
更新时间:2026-10-24。FAQ 速查页,面向打开构建控制台发现日志「只有开头没有结尾」、或「只有结尾没有开头」、关键报错行凭空消失的同学。Jenkins 日志截断的本质是「展示层、存储层、产生层」三段各有自己的上限与时机:浏览器展示有分段加载策略、归档只收你显式点名的文件、而构建被中止时最后一段输出根本没来得及写盘。病因收敛在五根轴上:日志体积超过页面单次渲染上限导致看着像截断、归档配置没把完整日志带上、构建被 abort 或超时杀掉丢了尾部、quiet period 与并发误判让人看错了构建编号、以及流水线步骤把子进程输出吞进缓冲区没落盘。顺一遍基本必中。如果问题是日志里中文乱码而不是截断,转 Jenkins 中文乱码速查。
本文要回答的问题
- 控制台日志只显示一半,是丢了还是没加载完?
- 想长期保存完整构建日志,应该怎么归档?
- 构建被手动停止后,为什么最后几行日志不见了?
- 流水线里 shell 步骤的输出为什么会缺一段?
tee落文件和标准归档各适合什么场景?
一、报错原文与典型现象
日志截断没有固定报错原文,它的「报错」就是现象本身——日志在某处戛然而止(控制器地址以 jenkins.example.com 占位,任务路径以 /proj/demo 占位):
# 现象一:页面顶部提示分段加载
This log is too large to display in full.
Showing only the beginning / end of the log.# 现象二:构建被中止,尾部丢失
Started by user 张三
...
Sending interrupt signal to process
Aborted by 李四
# 之后的清理步骤输出全部不见# 现象三:归档里只有指定文件
Archiving artifacts
'build/report.html' 已归档
# 控制台完整日志不在归档清单里读现象先分三段:页面明确提示「too large to display」是展示层截断,日志本身完好;Aborted by 之后内容消失是产生层丢尾;归档里没有日志文件是存储层没配置。三段修法互不相干,先定性。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| 页面提示日志过大只显示部分 | 超网页单次渲染上限 | 下载完整日志(/consoleText)比对 | 用 consoleText 全量查看或 tee 落文件 |
| 归档产物里没有日志文件 | archiveArtifacts 未包含日志 | 看构建页「归档产物」清单 | 把日志文件加入归档通配 |
| Aborted 后尾部输出消失 | 进程被杀,缓冲区未刷盘 | 对比被 abort 与正常构建的尾行 | 关键步骤 trap 信号,日志实时 tee 落盘 |
| 看错了构建编号以为丢日志 | quiet period 合并了连续触发 | 核对触发时间与构建编号 | 按时间线定位真正的目标构建 |
| sh 步骤输出缺中间一段 | 子进程 stdout/stderr 缓冲未行刷 | 加 --line-buffered 或 stdbuf 重跑 | 用 stdbuf 强制行缓冲,或 tee 分流 |
| Blue Ocean 界面日志不全 | 分段折叠未展开或接口分页 | 切回经典 UI 的 consoleText 对比 | 经典界面取全量,或直接用 REST API 拉取 |
三、排查决策图
下面这张图是标准排查路线,颜色按角色区分:红是报错入口与命中的根因,蓝是排查动作,绿是通过分支,橙是修复动作,紫是防复发沉淀。
读这张图抓分水岭:先拉 https://jenkins.example.com/job/proj/job/demo/123/consoleText 拿全量纯文本——全量里有、页面没有,就是展示层的事,换视图即可;全量里也缺,才轮到查 abort、缓冲、归档这些产生层与存储层的问题。不要一上来就改流水线,八成只是页面没加载全。
四、逐条排查展开
「日志过大只显示部分」是展示策略不是数据丢失。 经典 UI 对超大日志分段渲染,页面上方会给出只显示开头或结尾的提示。处置很简单:点页面上的「完整日志」链接,或直接访问 /consoleText 拿整份纯文本。真正的隐患是这类大日志任务本身——单份日志几十上百 MB,既拖慢页面又撑大磁盘,应顺手配上构建保留策略,需要长期留档的按下一条 tee 落文件。
归档里没有日志,是配置漏了不是 Jenkins 没存。 Jenkins 的控制台日志默认只活在 builds/<编号>/log,会随构建保留策略一起被旋转删除;archiveArtifacts 只收你显式通配的文件。想长期留完整日志,标准做法是在关键步骤里 sh 'make test 2>&1 | tee build/test.log',再 archiveArtifacts artifacts: 'build/*.log', allowEmptyArchive: true 把落盘的日志归档。tee 的价值是「分流」:一路继续上控制台,一路实时写文件——即使构建后面被 abort,文件里已有的部分已经在磁盘上。
Aborted 丢尾是信号时序问题。 手动停止或超时被杀时,Jenkins 向进程组发中断信号,进程立刻退出,stdout 缓冲区里没刷盘的最后一段输出随进程一起消失;流水线后续的清理步骤如果不在 post { always } 里,也根本不会执行。处置两手:一是关键长步骤的输出实时 tee 落文件,绕过缓冲区问题;二是构建脚本里 trap 住 TERM/INT 信号,在退出前把收尾信息显式写出。排查时对比一次正常构建和一次被 abort 构建的最后五行,缺的那段去哪了一目了然。
quiet period 让人看错构建,不是日志丢了。 连续触发多次构建时,静默期(quiet period)会把它们合并排队,你以为看的「刚才那次」其实是前一个编号。现象是「日志内容和我改的对不上」,被误报成截断。核对构建页顶部的触发时间与触发者,按时间线重新定位目标构建即可;频繁中招的团队把任务的 quiet period 调小,或改用参数化触发让每次构建意图明确。
流水线 sh 步骤缺中间段,多半是缓冲问题。 某些子进程检测到 stdout 不是终端就切到全缓冲模式,输出攒够一个缓冲块才写一次,构建中断或日志查看时机不对时就表现为「中间少一段」。处置:给命令套 stdbuf -oL -eL 强制行缓冲,或确认程序本身有 flush 选项。这类问题和 tee 落文件是绝配——tee 写文件的那份走自己的描述符,控制台丢段不影响文件完整。
Blue Ocean 的日志是另一套渲染管线。 它按步骤分页加载、折叠显示,长日志经常「看着不全」。这不是数据问题:切回经典 UI 的 consoleText,或直接调 REST API 拉全量,两者对不上才需要深挖。
五、规范做法与预防
- 关键步骤 tee 落文件成标配:长耗时、需留档的步骤一律
2>&1 | tee <文件>,控制台与文件双通道。 - 日志进归档清单:
archiveArtifacts通配覆盖日志目录,配合allowEmptyArchive防空转失败。 - 清理步骤放 post always:依赖日志排障的收尾动作写进
post { always { ... } },abort 也能跑到。 - 保留策略覆盖日志寿命:buildDiscarder 管住 builds 目录,长期留档靠归档外置而不是无限保留构建。
- 构建脚本 trap 信号:长任务脚本首部
trap 'echo 收尾信息' TERM INT,被杀前留下最后现场。 - 排障入口统一 consoleText:团队约定查日志先看全量纯文本,减少「页面没加载完」类误报。
这一篇在知识体系里的位置
本篇是 Jenkins 排错速查簇的日志入口篇,定位「日志完整性」:日志完整但里面中文乱码看 Jenkins 中文乱码速查;构建被 abort 的根因是超时看 Jenkins 构建超时挂起速查;日志与产物越攒越多撑爆磁盘看 Jenkins 磁盘写满速查。「consoleText 定真假 → 展示层换视图、产生层治缓冲、存储层配归档」这条主线对一切日志类问题通用。
一句话总结
Jenkins 日志「截断」先拉 /consoleText 全量对比:全量完整就是页面分段加载的事,换全量视图即可;全量也缺才查真凶——构建被 abort 丢尾用 tee 实时落文件加 trap 信号保住现场,sh 步骤缺段用 stdbuf 强制行缓冲,归档没日志就把 tee 出的文件加进 archiveArtifacts。tee 分流、post always 收尾、保留策略管寿命,日志完整性问题基本绝迹。