能否在Heroku Review App的构建日志中输出时间戳?
Heroku 构建流程添加自定义时间戳记录的实现方案
这个需求完全可以实现,所有配置都可以在你自己的构建流程内完成,不需要依赖Heroku原生的日志聚合能力。
首先说明原生无时间戳的原因:Heroku 构建阶段产生的日志(包括buildpack执行、容器镜像构建环节的输出)不会触发线上运行时日志的聚合注入逻辑,平台不会自动给这部分日志追加时间戳前缀,这是平台设计的固有特性,并非配置失误。
具体可落地的实现方式如下:
- 关键构建步骤手动埋点打时间戳
针对你重点关注的核心构建环节,可以在命令执行前后通过shell直接打印带UTC时区的时间标记,不需要依赖任何额外工具。常用写法示例:
这种方式改动量极小,每段关键环节的起止时间清晰,直接就能计算出单步耗时。哪怕这部分日志没有进入Heroku的实时日志流,你在本地调试构建、或者拉取构建归档日志时,都能完整看到带时间标记的内容。# 记录环节开始时间 echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] 开始执行依赖安装" npm ci # 捕获命令执行结果,避免中断原有构建流程 EXIT_CODE=$? # 记录环节结束时间 echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] 依赖安装完成,退出码为${EXIT_CODE}" # 透传原有退出码,不影响构建流程的正常判断 exit ${EXIT_CODE} - 全链路日志自动批量注入时间戳
如果不想逐行手动添加时间标记,可以利用Heroku构建栈默认预装的ts工具(来自moreutils组件),把整个构建流程的所有标准输出、错误输出全部接入时间戳自动注入逻辑,不需要逐行修改原有构建代码。示例写法:
开启后每一行输出都会自动附带秒级Unix时间戳和可读格式化时间,全链路日志的时间粒度可以精确到单行,完全满足耗时排查的精度要求。# 在构建脚本的最开头加入输出包装逻辑,后续所有命令的输出都会自动带上时间戳前缀 exec > >(ts -s) 2>&1 # 下面正常编写原有构建步骤即可 ./scripts/preprocess.sh npm ci npm run build - 容器构建环节的内置耗时统计
如果你重点关注容器运行时(Docker镜像构建)环节的耗时,Heroku默认已经开启了BuildKit构建能力,你只需要在构建前设置两个环境变量,就能让BuildKit自动输出每个构建步骤的起止时间和总耗时,不需要手动埋点:
配置完成后,BuildKit输出的每一层镜像构建步骤都会直接打印该步骤的执行耗时,可以快速定位是镜像拉取缓慢、还是业务编译步骤的卡顿时长过高。export DOCKER_BUILDKIT=1 export BUILDKIT_PROGRESS=plain
内容的提问来源于stack exchange,提问作者Nick Bender
相关产品推荐
相关产品推荐

