日志是構(gòu)建工具的主要界面。如果日志太多,真正的警告和問題容易被隱藏。另一方面,如果出了錯,你需要找出相關(guān)的信息。Gradle 定義了6個日志級別,如表 18.1,“日志級別”所示。除了那些您通過可能會看到的日志級別之外,有兩個 Gradle 特定日志級別。這兩個級別分別是 QUIET 和 LIFECYCLE. 默認(rèn)使用后面的這個日志級別,用于報告構(gòu)建進(jìn)度。
表 18.1. 日志級別
Level | 用于 |
ERROR | 錯誤消息 |
QUIET | 重要的信息消息 |
WARNING | 警告消息 |
LIFECYCLE | 進(jìn)度信息消息 |
INFO | 信息性消息 |
DEBUG | 調(diào)試消息 |
您可以使用表 18.2,“日志級別的命令行選項”中所示的命令行開關(guān)來選擇不同的日志級別。在表 18.3,“棧跟蹤的命令行選項”中,你可以看到影響棧跟蹤日志的命令行開關(guān)。
表 18.2. 日志級別的命令行選項
選項 | 輸出日志級別 |
沒有日志選項 | LIFECYCLE 及更高 |
--quiet
|
QUIET 及更高 |
--info
|
INFO 及更高 |
--debug
|
DEBUG 及更高 |
表 18.3. 棧跟蹤的命令行選項
選項 | 意義 |
沒有棧跟蹤選項 | 構(gòu)建錯誤(如編譯錯誤)時沒有棧跟蹤打印到控制臺。只有在內(nèi)部異常的情況下才打印棧跟蹤。如果選擇 DEBUG 日志級別,則總是輸出截取后的棧跟蹤信息。 |
--stacktrace
|
輸出截斷的棧跟蹤。我們推薦使用這一個選項而不是打印全棧的跟蹤信息。Groovy 的全棧跟蹤非常冗長 (由于其潛在的動態(tài)調(diào)用機(jī)制,然而他們通常不包含你的的代碼中哪里錯了的相關(guān)信息。) |
--full-stacktrace
|
打印全棧的跟蹤信息。 |
在構(gòu)建文件,打印日志的一個簡單方法是把消息寫到標(biāo)準(zhǔn)輸出中。Gradle 會把寫到標(biāo)準(zhǔn)輸出的所有內(nèi)容重定向到它的日志系統(tǒng)的 QUIET 級別中。
使用標(biāo)準(zhǔn)輸出寫日志
build.gradle
println 'A message which is logged at QUIET level'
Gradle 還提供了一個 logger 屬性給構(gòu)建腳本,它是一個 Logger 實例。該接口擴(kuò)展自 SLF4J的 Logger 接口,并添加了幾個 Gradle 的特有方法。下面是關(guān)于如何在構(gòu)建腳本中使用它的示例:
編寫自己的日志消息
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.')
您也可以在構(gòu)建腳本中通過其他使用的類掛鉤到 Gradle 的日志系統(tǒng)中(例如 buildSrc 目錄中的類)。只需使用一個 SLF4J 的 logger 對象。你可以在構(gòu)建腳本中,用與內(nèi)置的 logger 同樣的方式使用這個 logger。
使用 SLF4J 編寫日志消息
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 內(nèi)部使用 Ant 和 Ivy。它們都有自己的日志系統(tǒng)。Gradle 將其日志輸出重定向到 Gradle 的日志系統(tǒng)。從 Ant/Ivy 的日志級別到 Gradle 的日志級別是一對一的映射,除了 Ant/Ivy 的 TRACE 級別之外,它是映射到 Gradle 的 DEBUG 級別的。這意味著默認(rèn)情況下, Gradle 日志級別將不會顯示任何 Ant/Ivy 的輸出,除非是錯誤或警告信息。
有很多的工具仍然在使用標(biāo)準(zhǔn)輸出日志記錄。默認(rèn)情況下,Gradle 將標(biāo)準(zhǔn)輸出重定向到QUIET日志級別,把標(biāo)準(zhǔn)錯誤輸出重寫向到 ERROR 級別。這種行為是可配置的。Project 對象提供了一個LoggingManager,它允許您在計算構(gòu)建腳本時,修改標(biāo)準(zhǔn)輸出和錯誤重定向的日志級別。
配置標(biāo)準(zhǔn)輸出捕獲
build.gradle
logging.captureStandardOutput LogLevel.INFO
println 'A message which is logged at INFO level'
為能在任務(wù)執(zhí)行過程中更改標(biāo)準(zhǔn)輸出或錯誤的日志級別,task 也提供了一個 LoggingManager。
對任務(wù)配置標(biāo)準(zhǔn)輸出捕獲
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 Logging 和 Log4j 的日志工具的集成。你生成的類使用這些日志記錄工具輸出的任何日志消息,都將被重定向到 Gradle 的日志系統(tǒng)。
您可以用您自己的 logging UI 大量地替換 Gradle 的。你可以這樣做,例如,如果您想要以某種方式自定義 UI ——以輸出更多或更少的信息,或修改日志格式您可以使用 Gradle.useLogger() 方法替換這個 logging。它可以在構(gòu)建腳本,或 init 腳本,或通過內(nèi)嵌的 API 訪問。請注意它完全禁用 Gradle 的默認(rèn)輸出。下面是一個示例,在 init 腳本中修改任務(wù)執(zhí)行和構(gòu)建完成的日志打印。
自定義 Gradle 日志
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 的輸出結(jié)果
> gradle -I init.gradle build
[compile]
compiling source
[testCompile]
compiling test source
[test]
running unit tests
[build]
build completed
你的 logger 可以實現(xiàn)下面列出的任何監(jiān)聽器接口。當(dāng)你注冊一個 logger 時,只能替換它實現(xiàn)的接口的日志記錄。其他接口的日志記錄是不變的。
更多建議: