如何从Jenkins完整下载超大体积的控制台输出日志
Jenkins超大控制台日志完整下载方案
直接访问/consoleText接口下载不全、报curl: (18) transfer closed with outstanding read data remaining错误,本质是大日志流式传输过程中,受网络波动、服务端/代理超时配置、接口传输限制影响,连接被提前断开导致的;浏览器加载卡顿是因为一次性加载超大纯文本占用过高内存导致,可以按优先级选下面的方案解决:
方案1:直接读取Jenkins服务器上的原始日志文件(100%完整,最稳定)
Jenkins所有构建的控制台日志都会以纯文本格式持久化存储在主节点磁盘上,完全不走HTTP接口传输,没有大小、超时限制,是最可靠的获取方式:
- 日志默认存储路径为
${JENKINS_HOME}/jobs/<任务名称>/builds/<构建号>/log,对应示例中my-job的第5次构建,路径就是${JENKINS_HOME}/jobs/my-job/builds/5/log - 只要有Jenkins主节点的SSH登录权限,直接通过scp、sz等方式把该文件拉到本地即可,速度远快于HTTP下载
- 注意:即使是分布式构建、Pipeline任务,日志也会统一汇总存储在主节点的上述路径,不需要到构建Agent节点查找
方案2:带容错、断点续传参数的curl下载(无服务器登录权限时首选)
之前用的curl、wget命令没有配置重试、断点续传、超时参数,遇到连接波动就会直接中断下载,用下面的命令可以自动重试、从断点位置续传,直到完整下载整个文件:
curl -L --retry 10 --retry-delay 5 --continue-at - \ --connect-timeout 30 --max-time 0 \ http://j:8080/job/my-job/5/consoleText \ -o jenkins_my-job_5_full.log
参数说明:
--retry 10:遇到传输错误最多自动重试10次--continue-at -:自动检测本地已下载的文件片段,从断点位置续传,不需要每次中断都从头重下--max-time 0:不限制单次传输的总时长,避免大文件传一半因为客户端默认超时被主动终止-L:自动跟随HTTP重定向,避免Jenkins做了路径跳转时下载到错误的跳转提示页
如果Jenkins前面挂了Nginx等反向代理,出现反复断连的情况,可以临时调大反向代理的proxy_read_timeout参数到足够大(比如300s以上),配合断点续传一般都能下完。
方案3:通过Jenkins CLI导出日志
Jenkins官方自带的CLI工具对日志传输做了分块处理,比直接调用HTTP接口稳定性更高:
- 先从自身Jenkins服务下载CLI工具包:
wget http://j:8080/jnlpJars/jenkins-cli.jar
- 执行命令导出指定构建的日志到本地文件:
java -jar jenkins-cli.jar -s http://j:8080/ console my-job 5 > jenkins_my-job_5_full.log
如果Jenkins开启了账号鉴权,在命令中追加-auth <你的用户名>:<你的API Token>参数即可。
后续优化建议
- 后续执行
ansible-playbook -vvv这类会产生超大输出的任务时,不要把全量调试日志直接打到Jenkins控制台,可以把日志同时输出到构建节点本地文件,构建结束后将该日志作为构建制品归档,后续直接下载制品即可,完全避免控制台日志接口的传输限制:
示例执行命令:
在任务配置中把ansible-playbook -vvv your_playbook.yml | tee ansible_debug_full.logansible_debug_full.log添加为归档制品,后续直接从构建的制品列表下载即可。 - 超大日志不要直接在浏览器中打开,几十到上百MB的纯文本会占用大量浏览器内存导致卡顿、卡死,下载到本地后用VS Code、Notepad++等专用文本编辑器打开检索,流畅度会高很多。
内容的提问来源于stack exchange,提问作者chenchuk
相关产品推荐
相关产品推荐

