Logging

Log 是构建的主要"UI"工具. 如果日志太过冗长, 那么真正的警告和问题会隐藏其中, 另一方面, 如果你出错了,你又需要搞清楚相关错误信息. Gradle 提供了6个等级的 log, 如表17.1.Logs Level所示.出了那些你可能经常看到的, 还有两个是 Gradle 特定级别的日志,被称为QUIETLIFECYCLE.后者是默认的, 并用于报告生成进度.

表17.1.Logs Level

Level 用途
ERROR 错误信息
QUIET 重要消息信息
WARNING 警告信息
LIFECYCLE 进度消息信息
INFO 信息消息
DEBUG 调试信息

Choosing a log level

你可以在命令行中选择如表 17.2.Log 等级命令行选项所示的选项选择不同的日志级别.如表 17.3.堆栈信息选项中所示的选项来选择堆栈信息.

表17.2.Log 等级命令行选项

选项 输出日志等级
no logging options LIFECYCLE及更高
-q or --quiet QUIET及更高
-i or --info INFO及更高
-d or --debug DEBUG及更高(所有日志信息)

表 17.3.堆栈信息选项

选项 含义
No stacktrace options 无堆栈踪迹输出到控制台的情况下生成错误信息(如编译错误) ,仅在内部异常时打印堆栈信息.如果选择DEBUG日志等级,总会打印截断堆栈信息
-s or --stacktrace 打印截断堆栈信息,我们推荐这个而不是full stacktrace ,Groovy的full stacktrace非常详细.(由于底层的动态调用机制。然而,他们通常不包含你的代码出了什么错的相关信息)
-S or --full-stacktrace 打印全部堆栈信息

编写自己的日志信息

用于记录在你的构建文件的简单方法是将消息写入标准输出.Gradle重定向任何东西写入到标准输出到它的log系统作为QUITE级别的log.

例 17.1.使用标准输出写入log信息

build.gradle

println 'A message which is logged at QUIET level'

摇篮还提供了一个logger属性来构建脚本,这是Logger的一个实例.这个接口继承自SLF4J接口并且加入了一F些Gradle的具体方法.下面是如何在构建脚本中使用此方法的例子:

例 17.2.写入自己的log信息

build.gradle

logger.quiet('An info log message which is always logged.')
logger.error('An error log message.')
logger.warn('A warning log message.')
logger.lifecycle('A lifecycle info log message.')
logger.info('An info log message.')
logger.debug('A debug log message.')
logger.trace('A trace log message.')

你还可以在构建中将其他类直接挂接到Gradle的log系统中(例如buildSrc目录下的类).只使用SLF4J logger,使用这个logger的方式与构建脚本提供的logger方式相同.

例 17.3.使用SLF4J写入log信息

build.gradle

import org.slf4j.Logger
import org.slf4j.LoggerFactory

Logger slf4jLogger = LoggerFactory.getLogger('some-logger')
slf4jLogger.info('An info log message logged using SLF4j')

从外部工具和库记录日志

在内部, Gradle 使用 Ant 和 lvy , 都有自己的 log 系统, Gradle 重定向他们的日志输出到 Gradle 日志系统. 除了Ant/lvy的TRACE级别的日志, 映射到Gradle的DEBUG级别, 其余的都会有一个1:1的映射从 Ant/lvy 的日志等级到 Gradle 的日志等级. 这意味着默认的 Gradle 日志级别将不会显示任何的 Ant /lvy 的输出, 除非它是一个错误或警告.

有许多工具仍然使用标准输出记录,默认的,Gradle将标准输出重定向到QUIET的日志级别和标准错误的ERROR级别.该行为是可配置的.该项目对象提供了一个LoggerManager,当你构建脚本进行评估的时候,允许你改变标准输出或错误重定向的日志级别。

例 17.4.配置标准输出捕获

build.gradle

logging.captureStandardOutput LogLevel.INFO
println 'A message which is logged at INFO level'

任务同样提供了LoggingManager去更改任务执行过程中的标准输出或错误日志级别。

例 17.5.为任务配置标准输出捕获

build.gradle

task logInfo {
    logging.captureStandardOutput LogLevel.INFO
    doFirst {
        println 'A task message which is logged at INFO level'
    }
}

Gradle同样提供了Java Util Logging,Jakarta Commons LoggingLog4j logging的集成工具.

使用这些工具包编写的构建的类的记录的任何日志消息都将被重定向到Gradle的日志记录系统。

改变Gradle的记录内容

你可以用自己的内容取代大部分摇篮的UI记录.你可以这样做,例如,如果你想以某种方式定制UI,如:记录更多或更少的信息,或更改log的格式.你可以使用Gradle.useLogger()方法替换日志.可从一个构建脚本或初始化脚本,或通过嵌入API替换.注意,这会完全禁用Gradle的默认输出.下面的初始化脚本改变任务执行和完成构建后日志的输出.

例 17.6.定制Gradle logs

init.gradle

useLogger(new CustomEventLogger())

class CustomEventLogger extends BuildAdapter implements TaskExecutionListener {

    public void beforeExecute(Task task) {
        println "[$task.name]"
    }

    public void afterExecute(Task task, TaskState state) {
        println()
    }

    public void buildFinished(BuildResult result) {
        println 'build completed'
        if (result.failure != null) {
            result.failure.printStackTrace()
        }
    }
}

gradle -I init.gradle build的输出

> gradle -I init.gradle build [compile] compiling source

[testCompile] compiling test source

[test] running unit tests

[build]

build completed

你的logger可以实现下面列出的任何监听器接口.仅它实现接口被替换,其他接口保持不变。你可以在Section 56.6, “Responding to the lifecycle in the build script”中找到更多相关信息.