Gradle Logging

日志是构建工具的主要“ UI”。 如果太冗长,那么真正的警告和问题很容易被隐藏起来。 另一方面,你需要相关的信息来判断事情是否出了问题。 Gradle 定义了6个日志级别,如日志级别所示。 除了通常可以看到的日志级别之外,还有两个 gradle 特定的日志级别。 这些层次是安静和生命周期。 后者是默认的,用于报告构建进度。

ERROR
Error messages

QUIET
Important information messages

WARNING
Warning messages

LIFECYCLE
Progress information messages

INFO
Information messages

DEBUG
Debug messages

无论使用何种日志级别,都会显示控制台的丰富组件(生成状态和进度区域中的工作)。 在 Gradle 4.0之前,这些富组件只显示在日志级 LIFECYCLE 或更低的级别。

Choosing a log level 选择一个日志级别

可以使用日志级别命令行选项中显示的命令行开关来选择不同的日志级别。 您还可以使用 Gradle.properties 配置日志级别,请参见 Gradle 属性。 在 Stacktrace 命令行选项中,可以找到影响 Stacktrace 日志记录的命令行开关。

Writing your own log messages 写你自己的日志消息

在构建文件中登录的一个简单选项是将消息写入标准输出。 在 QUIET 日志级别,Gradle 将写入标准输出的任何内容重定向到其日志系统。

示例1. 使用 stdout 写日志消息
build.gradle

println 'A message which is logged at QUIET level'

Gradle 还为构建脚本提供了一个 Logger 属性,这是 Logger 的一个实例。 该接口扩展了 SLF4J Logger 接口,并添加了一些 Gradle 特定的方法。 下面是一个在构建脚本中如何使用的例子:

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

使用典型的 SLF4J 模式将占位符替换为日志消息中的实际值。

build.gradle

logger.info('A {} log message', 'info')

您还可以从构建中使用的其他类(例如 buildSrc 目录中的类)中连接到 Gradle 的日志系统。 只需使用 SLF4J 记录器。 您可以像在构建脚本中使用提供的记录器一样使用这个记录器。

import org.slf4j.LoggerFactory

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

Logging from external tools and libraries 从外部工具和库中记录日志

在内部,Gradle 使用 Ant 和 Ivy。 两者都有自己的记录系统。 Gradle 将他们的日志输出重定向到 Gradle 日志系统。 从 ant / ivy 日志级别到 Gradle 日志级别有1:1的映射,但 ant / ivy TRACE 日志级别映射到 Gradle DEBUG 日志级别。 这意味着默认的 Gradle 日志级别不会显示任何 ant / ivy 输出,除非它是一个错误或警告。

现在仍然有许多工具使用标准输出进行日志记录。 默认情况下,Gradle 将标准输出重定向到 QUIET 日志级别,将标准错误重定向到 ERROR 级别。 此行为是可配置的。 项目对象提供了一个 LoggingManager,它允许您在评估构建脚本时更改标准输出或错误重定向到的日志级别。

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

若要在任务执行期间更改标准输出或错误的日志级别,任务还提供 LoggingManager。

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

还提供了与 javautillogging、 Jakarta Commons Logging 和 Log4j 日志工具包的集成。 您的构建类使用这些日志工具包写入的任何日志消息都将被重定向到 Gradle 的日志系统。

Changing what Gradle logs 修改 Gradle 日志

你可以用自己的日志界面替换 Gradle 的大部分日志界面。 例如,如果您希望以某种方式自定义 UI ——记录更多或更少的信息,或更改格式,则可以这样做。 您可以使用 Gradle.useLogger (java.lang。 对象)方法。 这可以从构建脚本、 init 脚本或通过嵌入 API 访问。 注意,这将完全禁用 Gradle 的默认输出。 下面是一个 init 脚本示例,它改变了记录任务执行和生成完成的方式。

customLogger.init.gradle

useLogger(new CustomEventLogger())

class CustomEventLogger extends BuildAdapter implements TaskExecutionListener {

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

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

    void buildFinished(BuildResult result) {
        println 'build completed'
        if (result.failure != null) {
            result.failure.printStackTrace()
        }
    }
}
$ gradle -I customLogger.init.gradle build

> Task :compile
[compile]
compiling source


> Task :testCompile
[testCompile]
compiling test source


> Task :test
[test]
running unit tests


> Task :build
[build]

build completed
3 actionable tasks: 3 executed

记录器可以实现下面列出的任何侦听器接口。 注册日志程序时,只替换它实现的接口的日志记录。 其他接口的日志记录保持不变。 您可以在 Build 生命周期事件中找到关于侦听器接口的更多信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342