最可靠方式是使用 --console=plain --no-daemon 配合重定向,如 ./gradlew --console=plain --no-daemon build > build.log 2>&1,可避免Daemon缓存、ANSI污染及日志截断,适用于CI和问题排查。

Gradle构建日志保存到文件的常用方式
直接用 --console=plain --no-daemon 配合重定向最可靠,尤其在CI或排查问题时。Gradle默认不把日志写入文件,得靠Shell或Gradle自身日志配置干预。
用命令行重定向(推荐用于临时调试)
这是最快生效的方式,适用于本地复现、Jenkins脚本或一键保存全量输出。注意:它捕获的是标准输出和标准错误的合并流,不是Gradle内部的日志系统。
- 保存全部输出(含进度条、彩色字符):
./gradlew build > build.log 2>&1 - 去掉ANSI颜色和交互式控制符(更干净):
./gradlew --console=plain --no-daemon build > build.log 2>&1 - 如果想同时看屏幕输出又存文件,用
tee:./gradlew --console=plain build 2>&1 | tee build.log
⚠️ 坑点:不加 --no-daemon 时,后台Daemon进程可能缓存输出,导致日志截断或延迟写入;--console=plain 能避免乱码和不可见控制字符污染日志。
通过 gradle.properties 启用详细日志并配合 --info 或 --debug
单纯重定向只保留终端可见内容。若要记录Gradle内部事件(比如任务执行顺序、依赖解析细节),需提升日志级别,并确保日志框架能落地到文件——但Gradle默认不写文件,必须借助JVM系统属性或自定义初始化脚本。
- 在项目根目录
gradle.properties中加:org.gradle.logging.level=INFO(仅影响Gradle自身日志级别,不影响重定向内容) - 真正起作用的是运行时参数:
./gradlew --info build > build-info.log 2>&1 - 如需结构化日志(比如JSON格式),得用第三方插件如
gradle-logging-plugin,但属于进阶场景,稳定性与维护成本需权衡
用 init.gradle 自定义日志输出(适合团队统一规范)
如果多个项目都要自动落盘日志,可在 GRADLE_USER_HOME/init.gradle 或项目级 gradle/init.gradle 中配置Logback。Gradle 6.0+ 默认用SLF4J+Logback,支持XML配置。
示例(放在 gradle/init.gradle):
initscript {
dependencies {
classpath files("${System.properties['java.home']}/lib/tools.jar")
}
}
gradle.buildFinished { result ->
def logFile = new File("build/gradle-${new Date().format('yyyyMMdd-HHmmss')}.log")
logging.addStandardOutputCapture().addOutputCapture(logFile.newPrintWriter())
}
⚠️ 注意:这个写法捕获的是Gradle的 StandardOutputCapture,不是完整日志系统;真正稳定可控的方案仍是重定向 + --console=plain --no-daemon,尤其涉及多模块、并发任务或失败中断时,Init脚本容易漏掉早期异常堆栈。
真正难处理的是Daemon生命周期、多线程日志交织、以及不同Gradle版本对 logging API 的兼容性变化——这些细节一旦出问题,日志就断在最需要的时候。


















