如何消除Groovy日志中的IndyInterface fromCache冗余信息
Groovy IndyInterface 冗余日志问题分析与解决
日志含义
org.codehaus.groovy.vmplugin.v8.IndyInterface fromCache 是Groovy invokedynamic(简称Indy)特性的调试输出:
- Indy是Java 7引入的动态调用优化特性,Groovy通过它提升动态方法调用的性能
fromCache日志表示Groovy正在复用已缓存的Indy调用点,本质是调试级别的信息,正常情况下不应以INFO级别输出。
已尝试方法无效的原因
你用的groovy.indy.logging=false参数是Groovy早期版本的控制项,部分新版本已不再读取该配置;而直接设置Logger级别无效,大概率是因为java.util.logging中Handler的级别优先级高于Logger本身级别,或者你的Logger配置被系统默认的logging.properties覆盖了。
有效解决方法
方法1:直接禁用目标Logger的输出
在代码最开始的位置(比如main方法第一行、静态初始化块)添加以下代码:
import java.util.logging.Logger import java.util.logging.Level def indyLogger = Logger.getLogger("org.codehaus.groovy.vmplugin.v8.IndyInterface") indyLogger.setLevel(Level.OFF) // 关闭父Logger的日志传递,避免父Handler输出该日志 indyLogger.setUseParentHandlers(false)
核心是setUseParentHandlers(false)——即使你设置了Logger级别,父Logger的Handler依然可能输出日志,关闭继承能彻底切断这条日志的输出路径。
方法2:修改系统日志配置文件
找到JRE目录下的lib/logging.properties(或通过-Djava.util.logging.config.file=自定义路径指定配置文件),添加一行:
org.codehaus.groovy.vmplugin.v8.IndyInterface.level = OFF
这种方式全局生效,适合所有使用该JRE环境的应用。
方法3:调整Handler级别(兜底方案)
如果前两种方法无效,说明默认的ConsoleHandler级别设置为INFO,导致所有INFO级日志都被输出。可以针对性调整:
import java.util.logging.Logger import java.util.logging.Level import java.util.logging.ConsoleHandler def indyLogger = Logger.getLogger("org.codehaus.groovy.vmplugin.v8.IndyInterface") indyLogger.setLevel(Level.OFF) indyLogger.setUseParentHandlers(false) // 若需要保留该Logger的严重错误日志,可添加指定级别的Handler def handler = new ConsoleHandler() handler.setLevel(Level.SEVERE) indyLogger.addHandler(handler)
内容的提问来源于stack exchange,提问作者mmo
相关产品推荐
相关产品推荐

