Gradle插件必须用Project.logger而非println,因其支持日志级别、过滤及CI上下文;需统一加前缀、脱敏敏感信息,并注意版本兼容性。

Gradle插件里用 logger 而不是 println
直接写 println 看似简单,但会绕过 Gradle 的日志系统:它不区分级别、不支持过滤、不随 --info 或 --debug 开关生效,CI 上还可能被截断或丢失上下文。插件中必须用 Project.logger(或 Task.logger)。
实操建议:
-
logger.lifecycle("✅ 配置完成")—— 对用户可见的稳定状态,适合 CI 报告 -
logger.debug("Resolved version: {}", version)—— 带参数占位符,避免字符串拼接开销,且只在--debug时输出 -
logger.warn("Fallback to default config")—— 明确提示潜在风险,比info更易被注意到 - 避免
logger.error("Failed")代替异常抛出——日志不是控制流,该 throw 还得 throw
自定义日志前缀让输出可追溯
多个插件共存时,logger.info("Loaded") 完全看不出是谁打的。尤其在复合构建或 pluginManagement 中,日志混在一起根本分不清归属。
实操建议:
- 在插件
apply()开头统一设置前缀:project.logger = project.logger.withPrefix("[my-plugin]") - 对关键 Task 实例,可在
doFirst里临时增强:logger = logger.withPrefix("[MyTask:${name}]") - 前缀不要带空格或特殊符号(如
[my-plugin]✅,[my plugin]❌),否则某些 IDE 日志面板会解析失败
敏感信息和动态值要过滤或脱敏
日志里意外打印 project.findProperty("NEXUS_PASSWORD") 或 System.getenv("AWS_SECRET") 是高频安全事故。Gradle 不会自动屏蔽,全靠插件作者守门。
实操建议:
- 永远不用
logger.debug("Config: {}", config)直接 dump 对象——重写toString()或显式白名单字段 - 检测环境变量或属性是否含敏感关键词(
SECRET、TOKEN、KEY),匹配则替换为<redacted></redacted> - CI 场景下,加
if (project.hasProperty("ci")) { logger = logger.withThreshold(LogLevel.WARN) }降级日志量
日志级别与 Gradle 版本兼容性
Gradle 7.0+ 默认禁用 --debug 下的 logger.debug 输出(除非显式启用),而旧版默认开启。升级后发现“日志不见了”,大概率是这个原因。
实操建议:
- 检查
gradle.properties是否含org.gradle.logging.level=debug—— 这会强制全局 debug 级别,掩盖插件自身配置 - 在插件测试中用
TestKit启动时,显式传参:withArguments("--debug", "--no-daemon") - Gradle 8.4+ 开始支持
logger.trace(),但仅限极少数调试场景;多数插件仍应守住debug/info/warn三层
logger.debug 当成 println 无脑用——这三处一漏,日志就从帮手变成噪音源。



















