如何阻止导入的第三方库使用自定义logging.properties日志配置?
问题根因
java.util.logging(简称JUL)的配置是JVM全局生效的,你在logging.properties里配置的.level=ALL是给根logger设置的全局默认级别,同时绑定的ConsoleHandler、FileHandler也是全局生效的。所有没有单独做日志配置的第三方依赖,都会默认继承根logger的配置规则——GraphStream本身没有内置自定义JUL配置,自然会直接复用你这套日志规则,把所有级别的日志打到你的控制台和业务日志文件里,和配置文件命名冲突没有关系。
可用解决方案
- 方案1:直接在现有配置文件中给GraphStream单独设置日志规则
找到GraphStream的包根路径org.graphstream,在你的logging.properties末尾追加如下配置:# 只留GraphStream的致命错误日志,完全不需要可以直接设为OFF org.graphstream.level = SEVERE # 清空继承的全局handler,不往你的控制台、日志文件写内容 org.graphstream.handlers = - 方案2:将自定义日志规则绑定到专属业务包,不做全局配置
不要把自定义的输出handler挂在全局根logger上,只给你自己的业务代码根包配置日志规则,示例配置如下:
这种配置方式下,只有你自己业务包下的代码会走自定义的日志输出路径、格式、级别规则,所有第三方依赖的日志都会走JUL默认配置,不会混入你的业务日志。# 根logger使用默认配置,不绑定自定义输出handler handlers= .level= INFO # 替换成你自己的业务代码根包路径 com.your.business.package.handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler com.your.business.package.level = ALL # 关闭父级handler继承,避免日志重复输出 com.your.business.package.useParentHandlers = false - 方案3:代码层面手动修改第三方包的日志配置
如果不想改配置文件,可以在项目初始化日志的代码段里,手动获取GraphStream的logger对象修改规则:import java.util.logging.Level; import java.util.logging.Logger; // 获取GraphStream根logger Logger gsRootLogger = Logger.getLogger("org.graphstream"); // 关闭全局handler继承 gsRootLogger.setUseParentHandlers(false); // 设置日志输出级别,全关用Level.OFF gsRootLogger.setLevel(Level.SEVERE);
日志输出示例:前3行为自身业务日志,其余内容均属于GraphStream
内容的提问来源于stack exchange,提问作者Kfir Ettinger
相关产品推荐
相关产品推荐


