Gradle学习(十九)——日志

原创 2018年01月31日 14:54:39

日志是构建工具的重要部分,如果信息打印的太多,关键性的错误和警告就会被淹没,也就是说你需要更加相关的信息来确定发生了什么错误。Gradle总共分了6个日志级别,和你通常看到的不一样,多了QUIETLIFECYCLE级别,LIFECYCLE还是默认的日志级别,主要用于输出构建进程的信息。

日志级别

级别 用途
ERROR 错误消息
QUIET 重要信息的消息
WARNNING 警告消息
LIFECYCLE 构建进程信息的消息
INFO 信息的消息
DEBUG Debug消息

选择日志的级别

你可以通过命令行选项来选择日志的级别,也可以通过gradle.properties文件来配置日志的级别,还可以通过命令行选型来确定是否要打出日志的堆栈信息。

命令行下设置日志级别

选项 输出日志级别
-q 或者 –quit QUIET或者更高级别
-w 或者 –warn WARN或者更高级别
-i 或者 –info INFO或者更高级别
-d 或者 –debug DEBUG或者更高级别

命令行下设置堆栈选项

选项 意义
什么也不加 当构建错误产生时,不会打印堆栈信息,只有在产生内部错误时才会打印堆栈信息,当日志级别调整为DEBUG时,会打印出截断的堆栈信息
-s 或者 –stacktrace 提供截断的堆栈信息,但我们建议打印全部的堆栈信息,因为groovy动态语言的特性,截断的堆栈信息并不能完全找到错误所在。
-S 或者 –full-stacktrace 打印完整的堆栈信息

自己打印日志消息

打印日志最简单的方式就是在构建文件中使用标准输出,Gradle会把标准输出重定向到QUITE级别的日志

println 'A message which is logged at QUIET level'

Gradle还提供了logger属性,它是一个Logger的实例,Logger接口继承于SLF4J的Logger接口,并增加了一些Gradle特有的方法。

logger.info('info')
logger.debug('debug')
logger.lifecycle('lifecycle')
logger.quiet('quite')
logger.error('error')
logger.warn('warn')
logger.trace('trace')

还可以使用典型的SLF4J的模式来输入日志,比如占位符操作

def hello='hello'
logger.info('this is {}',hello)

你还可以直接hook进gradle的日志系统直接使用SLF4J的logger,就像之前使用构建脚本中的logger那样使用它

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和ivy都有自己的日志系统,Gradle可以把他们的日志重定向到Gradle的日志系统。这种重定向可以1:1的同样的日志级别可以被映射过来,但是要除去ant/ivy的TRACE级别,这个级别会映射成Gradle的DEBUG级别。这意味着默认情况下除了error和warn级别,你不会看到ant/ant的其他日志输出。

已经有很多工具可以记录日志,但是很多时候还是使用标准输出。默认情况下,Gradle会把标准输出重定向到QUITE级别,并且把标准错误重定向到ERROR级别。Project对象还提供了logging属性,这个属性是个LoggingManager实例,可以来设置标准输出和标准错误重定向后的日志级别

logging.captureStandardOutput LogLevel.INFO
println 'info'

也可以只在任务的执行期间改变标准输出和错误重定向后日志级别,但这里的logging就是Task的实例提供的了

task logInfo {
    doLast {
        logging.captureStandardOutput LogLevel.INFO
        println 'info'
    }
}

Gradle还提供了Java Util Logging,Jakarta Commons Logging和Log4j logging工具包的集成,你使用这些工具的任何日志输出,都会被重定向到Gradle的日志系统

更改Gradle的日志UI

你可以用自定义的日志来替换Gradle的日志UI,比如你想增加多一些日志,或者减少一些日志,或者更改日志的格式。你可以通过Gradle.useLogger(java.lang.Object)方法来实现,可以在build.gradle或者在init.gradle中实现,但要注意一点,一旦实现这个,你就屏蔽了对应的Gradle的默认的日志UI。

useLogger(new CustomEventLogger())

class CustomEventLogger extends BuildAdapter implements TaskExecutionListener {

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

    @Override
    void afterExecute(Task task, TaskState taskState) {taskState.executed
        println "after [$task.name] executed:$taskState.executed"
    }
}

执行命令如下:

± % gradle -I init.gradle logInfo                                         

> Configure project :

> Task :logInfo
before [logInfo]
after [logInfo] executed:true

1 actionable task: 1 executed

你可以可以实现以下监听接口,来达到自定义日志UI的目的,要注意的是,只替换你实现了的接口的日志记录。

  • BuildListener
  • ProjectEvaluationListener
  • TaskExecutionGraphListener
  • TaskExecutionListener
  • TaskActionListener
版权声明:本文为博主原创文章,未经博主允许不得转载。

Gradle 1.12 翻译——第十八章. 日志

日志是构建工具的主要界面。如果日志太多,真正的警告和问题容易被隐藏。另一方面,如果出了错,你需要找出相关的信息。Gradle 定义了6个日志级别,如表 18.1,“日志级别”所示。除了那些您通过可能会...
  • maosidiaoxian
  • maosidiaoxian
  • 2014年11月18日 09:11
  • 7083

Manifest merger failed with multiple errors, see logs问题处理

在android开发的时候,有时候会遇到这样的问题Error:Execution failed for task ':test:processDebugManifest'. > Manifest me...
  • Picasso_L
  • Picasso_L
  • 2016年11月08日 18:24
  • 11011

添加第三方依赖导致的问题

今天添加了一个第三方的库,结果报错 Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger f...
  • qq_37324563
  • qq_37324563
  • 2018年01月22日 11:43
  • 9

Gradle学习总结——抓重点学Gradle

前言网上关于Gradle的教程很多,但很多都是以“面”切入— 通过大量讲解其用法及其API分类来阐述。但Gradle API使用技巧众多,API更是成千上百,臣妾记不住呀。个人深信,技术之道与练功之道...
  • u012562943
  • u012562943
  • 2016年09月09日 10:32
  • 2924

[Gradle中文教程系列]-跟我学Gradle-附录-2.Gradle的日志级别

Gradle在执行时提供了6个常用日志级别,并且提供了友好的参数可以让你随心所欲的控制控制台输出。日志级别 日志级别 级别描述 ERROR 错误消息 QUIET 重要的信息消息 ...
  • pkaq_
  • pkaq_
  • 2017年01月10日 13:18
  • 266

gradle学习(19)-log系统

1.log信息的分类 除了常用的 debug,info,warning,error ,gradle自己特有的quiet和lifecycle。 2.选择log等级 -q/-...
  • qhshiniba
  • qhshiniba
  • 2015年01月13日 00:59
  • 4498

AndroidStudio 使用Gradle 控制Log 日志输出

我们在开发APP的时候,在测试的时候需要打Debug 包,在正式发布的时候打 Release 包;但是在正式发布的时候我们需要把在研发阶段的Log日志打印给取消掉,设置用户不可见,研发可见。过多的打印...
  • wlytctw
  • wlytctw
  • 2016年09月27日 15:20
  • 5401

图片下方或四周有文字,文字上方或四周有图片及其在代码中修改textview中的图片

之前 在遇到图片下方带文字的时候,都是用两个控件来完成的,今天发现了一个属性,可以简单实现这个功能。 如下:             android:id="@+id/iv_order_reserv...
  • daogepiqian
  • daogepiqian
  • 2015年11月04日 17:40
  • 1310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gradle学习(十九)——日志
举报原因:
原因补充:

(最多只允许输入30个字)