Глава 24. Логгирование.

Лог - основной 'UI(пользовательский интерфейс)' инструмента сборки. Если он слишком многословный, настоящие предупреждения и проблемы из-за этого могут быть скрыты. С другой стороны, вам нужна соответствующая информация для понимания того, что что-то пошло не так. Gradle определяет 6 уровней лога, которые показаны в Таблице 24.1. Уровни лога. Существует два присущих Gradle уровня лога, в добавление к тем, которые вы могли видеть. Это уровни QUIET и LIFECYCLE. Последний используется по умолчанию и выводит информацию о прогрессе сборки.

Таблица 24.1. Уровни лога
УровеньИспользует для
ERRORСообщений об ошибках
QUIETСообщений с важной информацией
WARNINGПредупреждений
LIFECYCLEСообщений с информацией о прогрессе
INFOИнформационных сообщений
DEBUGОтладочных сообщений

24.1. Выбор уровня лога.

Вы можете использовать переключатели командной строки, показанные в Таблице 24.2 Опции командной строки для выбора уровня лога, для выбора разлиных уровней лога. В Таблице 24.3 Опции командной строки для выбора трассировки стека вы найдете перекючатели командной строки, которые влияют на трассировку стека логгирования.

Таблица 24.2. Опции командной строки для выбора уровня лога
ОпцияВыводимые уровни лога
нет опций логгированияLIFECYCLE и выше
-q или --quietQUIET и выше
-i или --infoINFO и выше
-d или --debugDEBUG и выше (т.е., все сообщения)
Таблица 24.3. Опции командной строки для выбора трассировки стека
ОпцияЗначения
Нет опций трассировки стекаНа консоль не печатается трассировка стека в случае ошибки сборки (например, ошибка компиляции). Только в случае внутренних исключений трассировки стека будут напечатаны. Если выбран уровень лога DEBUG, урезанные трассировки стека будут напечатаны.
-s или --stacktraceПечатаются урезанные трассировки стека. Вместо полные трассировок стека рекомендуем использовать урезанные. Полные трассировки стека Groovy чрезвычайно многослоные (Из-за лежащих в основе механизмов динамического вызова. К тому же обычно они не содержат важной информации о том что пошло не так в вашем коде.) С этой опцией отображаются трассировки стека для сообщений об устаревших функциях.
-S или --full-stacktraceПечатаются полные трассировки стека. С этой опцией отображаются трассировки стека для сообщений об устаревших функциях.

24.2. Запись ваших собственных сообщений лога.

Простой вариант для логгирования в вашем сборочном файле - запись сообщений в стандартное устройство вывода. Gradle перенаправляет все, что пишется в стандартное устройство вывода, в систему логгирования с уровнем лога QUIET.

Пример 24.1. Использование stdout для записи сообщений лога.

build.gradle

println 'A message which is logged at QUIET level'
	  

Также Gradle предоставляет свойство logger в сборочном скрипте, которое явлеятся экземпляром Logger. Этот интерфейс наследуется от интерфейса SLF4J Logger и добавляет специфичные для Gradle методы. Ниже пример использования этого свойства в сборочном скрипте:

Пример 24.2. Запись ваших собственных сообщений лога.

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 из других классов в вашей сборке (например, классов из папки buildSrc). Просто используйте логгер SLF4J. Вы можете использовать этот логгер таким же образом, как используете логгер, предоставленный вам в сборочном скрипте.

Пример 24.3. Использование 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')
	  

24.3. Логгирование из внешних инструментов и библиотек.

Внутри себя Gradle использует Ant и Ivy. У них есть свои собственные системы логгирования. Gradle перенравляет их вывод в лог в свою систему логгирования. Есть отображение 1:1 из уровней лога Ant/Ivy в уровни лога Gradle, за исключением уровня TRACE Ant/Ivy, который отображается на уровень лога DEBUG. Это означает, что используемые по умолчанию уровень лога в Gradle не покажет ничего из вывода Ant/Ivy за исключением ошибки или предупреждения.

Есть еще множество инструментов, которые используют стандартное устройство вывода для логгирования. По умолчанию, Gradle перенаправляет вывод с уровнем лога QUIET, а стандартную ошибку с уровнем ERROR. Это поведение настраиваемое. Объект проекта предоставляет LoggingManager, который позволяет вам изменить уровни лога, которые перенаправляются в стандартный вывод и ошибку, когда вычисляется ваш сборочный скрипт.

Пример 24.4. Настройка захвата стандартного устройства вывода.

build.gradle

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

Для изменения уровня лога для стандартного вывода или ошибки во время выполнения задачи, в задачах также есть LoggingManager.

Пример 24.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 Logging и Log4j инструментариев логгирования. Любые сообщения лога, которые ваши сборочные классы записывают с использованием этих инструментариев логгирования, будут перенаправлены в систему логгирования Gradle.

24.4. Изменение того, что Gradle логгирует.

Вы можете заменить многое из UI логгирования Gradle своим собственным. Вы можете это сделать, например, если пожелаете настроить UI некоторым способом - логгировать больше или меньше информации или изменить форматирование. Вы заменяете логгирование используя метод Gradle.useLogger(java.lang.Object). Он доступен из сборочного скрипта, инициализационного скрипта или посредством встраиваемого API. Обратите внимание, что это полностью отключает вывод Gradle по умолчанию. Ниже пример скрипта инициализации, который изменяет то, как логгируется выполнение задачи и завершение сборки.

Пример 24.6. Настройка того, что логгирует 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

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

[testCompile]
compiling test source

[test]
running unit tests

[build]

build completed
	  

Ваш логгер может реализовывать любой из интерфесов прослушивателей перечисленных ниже. Когда вы регистрируете логгер, заменяется только логгирование для интерфейсов, которые он реализует. Логгирования для остальные интерфейсов остается нетронутым. Вы можете выяснить больше об интерфейсах слушателей в Секции 22.6 Реагирование на жизненный цикл сборочного скрипта.