鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 日志
快速開(kāi)始 Web 應(yīng)用
更多關(guān)于任務(wù)
編寫構(gòu)建腳本
守護(hù)進(jìn)程
問(wèn)題解決
日志
插件
總覽
快速開(kāi)始 Java
教程-"This and That"
使用 Gradle 圖形化用戶界面
從 Gradle 使用 Ant
依賴管理的基礎(chǔ)
構(gòu)建環(huán)境
處理文件
構(gòu)建腳本的基本
使用 Gradle 命令行
快速開(kāi)始 Groovy
安裝
介紹

日志

日志是構(gòu)建工具的主要"UI"。如果日志太多,真正的警告和問(wèn)題容易被隱藏。另一方面,如果出了錯(cuò),你需要找出相關(guān)的信息。Gradle 定義了6個(gè)日志級(jí)別,如表 Table 18.1, “Log levels” 所示。除了那些您通過(guò)可能會(huì)平??吹降娜罩炯?jí)別之外,有兩個(gè) Gradle 特定日志級(jí)別。這兩個(gè)級(jí)別分別是 QUIETLIFECYCLE。 默認(rèn)使用后面的這個(gè)日志級(jí)別,用于報(bào)告構(gòu)建進(jìn)度。

Table 18.1. Log levels

級(jí)別 用途
ERROR Error 錯(cuò)誤信息
QUIET 重要信息
WARNING Warning 警告信息
LIFECYCLE 過(guò)程信息
INFO 信息
DEBUG Debug 調(diào)試信息

選擇級(jí)別

在 Table 18.2, “Log level command-line options” 中命令行,是用來(lái)選擇不同的級(jí)別的選項(xiàng)。 Table 18.3, “Stacktrace command-line options” 中的是影響堆棧跟蹤日志

Table 18.2. Log level command-line options

選項(xiàng) 輸出日志的級(jí)別
no logging options LIFECYCLE 及更高
-q or --quiet QUIET 及更高
-i or --info INFO 及更高
-d or --debug DEBUG 及更高 (所有的日志信息)

Table 18.3. Stacktrace command-line options

選項(xiàng) 含義
No stacktrace options 構(gòu)建錯(cuò)誤(如編譯錯(cuò)誤)時(shí)沒(méi)有棧跟蹤打印到控制臺(tái)。只有在內(nèi)部異常的情況下才打印棧跟蹤。如果選擇 DEBUG 日志級(jí)別,則總是輸出截取后的棧跟蹤信息。
-s or --stacktrace 輸出截?cái)嗟臈8?。我們推薦使用這一個(gè)選項(xiàng)而不是打印全棧的跟蹤信息。Groovy 的全棧跟蹤非常冗長(zhǎng) (由于其潛在的動(dòng)態(tài)調(diào)用機(jī)制,然而他們通常不包含你的的代碼中哪里錯(cuò)了的相關(guān)信息。)
-S or --full-stacktrace 打印全棧的跟蹤信息。

編寫自己的日志消息

在構(gòu)建文件,打印日志的一個(gè)簡(jiǎn)單方法是把消息寫到標(biāo)準(zhǔn)輸出中。Gradle 會(huì)把寫到標(biāo)準(zhǔn)輸出的所有內(nèi)容重定向到它的日志系統(tǒng)的 QUIET 級(jí)別中。

Example 18.1. Using stdout to write log messages

build.gradle

    println 'A message which is logged at QUIET level'

Gradle 還提供了一個(gè) logger 屬性給構(gòu)建腳本,它是一個(gè) Logger 實(shí)例。該接口擴(kuò)展自 SLF4J 的 Logger接口,并添加了幾個(gè) Gradle 的特有方法。下面是關(guān)于如何在構(gòu)建腳本中使用它的示例:

Example 18.2. Writing your own log messages

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)建腳本中通過(guò)其他使用的類掛鉤到 Gradle 的日志系統(tǒng)中(例如 buildSrc 目錄中的類)。只需使用一個(gè) SLF4J 的logger對(duì)象。你可以在構(gòu)建腳本中,用與內(nèi)置的logger同樣的方式使用這個(gè)logger。

Example 18.3. Using SLF4J to write log messages

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') 

使用外部工具和庫(kù)記錄日志

Gradle 內(nèi)部使用 Ant 和 Ivy。它們都有自己的日志系統(tǒng)。Gradle 將他們?nèi)罩据敵鲋囟ㄏ虻?Gradle 的日志系統(tǒng)。從 Ant/Ivy 的日志級(jí)別到 Gradle 的日志級(jí)別是一對(duì)一的映射,除了 Ant/Ivy 的 TRACE 級(jí)別,它是映射到 Gradle 的 DEBUG 級(jí)別的。這意味著默認(rèn)情況下, Gradle 日志級(jí)別將不會(huì)顯示任何 Ant/Ivy 的輸出,除非是錯(cuò)誤或警告信息。

有很多的工具仍然在使用標(biāo)準(zhǔn)輸出日志記錄。默認(rèn)情況下,Gradle 將標(biāo)準(zhǔn)輸出重定向到 QUIET日志級(jí)別,把標(biāo)準(zhǔn)錯(cuò)誤輸出重寫向到 ERROR 級(jí)別。這種行為是可配置的。Project 對(duì)象提供了一個(gè) LoggingManager,它允許您在計(jì)算構(gòu)建腳本時(shí),修改標(biāo)準(zhǔn)輸出和錯(cuò)誤重定向的日志級(jí)別。

Example 18.4. Configuring standard output capture

build.gradle

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

為能在任務(wù)執(zhí)行過(guò)程中更改標(biāo)準(zhǔn)輸出或錯(cuò)誤的日志級(jí)別,task也提供了一個(gè) LoggingManager。

Example 18.5. Configuring standard output capture for a task

build.gradle

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

Gradle 還提供了對(duì) Java Util Logging,Jakarta Commons Logging 和 Log4j 的日志工具的集成。你生成的類使用這些日志記錄工具輸出的任何日志消息,都將被重定向到 Gradle 的日志系統(tǒng)。

改變 Gradle 日志

您可以用您自己的 logging UI 大量地替換 Gradle 的。你可以這樣做,例如,如果您想要以某種方式自定義 UI ——以輸出更多或更少的信息,或修改日志格式您可以使用 Gradle.useLogger() 方法替換這個(gè) logging。它可以在構(gòu)建腳本,或 init 腳本,或通過(guò)內(nèi)嵌的 API 訪問(wèn)。請(qǐng)注意它完全禁用 Gradle 的默認(rèn)輸出。下面是一個(gè)示例,在 init 腳本中修改任務(wù)執(zhí)行和構(gòu)建完成的日志打印。

Example 18.6. Customizing what 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()
            }
        }
    }

執(zhí)行 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 可以實(shí)現(xiàn)下面列出的任何監(jiān)聽(tīng)器接口。當(dāng)你注冊(cè)一個(gè) logger時(shí),只能替換它實(shí)現(xiàn)的接口的日志記錄。其他接口的日志記錄是不變的。