import org.gradle.internal.logging.text.StyledTextOutputFactory

import static org.gradle.internal.logging.text.StyledTextOutput.Style
def outLogger = services.get(StyledTextOutputFactory).create("colouredOutputLogger")

class CustomExecutionLogger extends BuildAdapter implements TaskExecutionListener {
    private logger
    private failedTask

    CustomExecutionLogger(passedLogger) {
        logger = passedLogger
    }

    void buildStarted(Gradle gradle) {
        failedTask = null
    }

    void beforeExecute(Task task) {
    }

    void afterExecute(Task task, TaskState state) {
        def failure = state.getFailure()
        if(failure) {
            failedTask = task
        }
    }

    void buildFinished(BuildResult result) {
        def failure = result.getFailure()
        if(failure) {
            if(failedTask && (failedTask.getClass().getName().contains("BuildToolTask"))) {
                // the error from this task is already logged
                return
            }

            println ""
            logger.withStyle(Style.FailureHeader).println failure.getMessage()

            def causeException = failure.getCause()
            while (causeException != null) {
                failure = causeException
                causeException = failure.getCause()
            }
            if(failure != causeException) {
                logger.withStyle(Style.Failure).println failure.getMessage()
            }
            println ""
        }
    }
}

gradle.useLogger(new CustomExecutionLogger(outLogger))