java.util.logging配置异常:日志级别未从属性文件加载求助
解决java.util.logging配置不生效及HttpClient日志无输出问题
看起来你遇到的问题核心不是Eclipse阻止配置加载,而是日志系统初始化时机和配置逻辑的几个细节没处理对,我帮你一步步排查解决:
一、日志配置文件未生效的根本原因:加载时机错误
JVM在启动时就会初始化java.util.logging.LogManager,它会在此时读取java.util.logging.config.file系统属性并加载配置。而你在main方法里才设置这个系统属性,这时候日志系统已经完成初始化了,所以你的配置根本没被用上!
两种修复方案:
方案1:通过JVM启动参数指定配置(推荐)
在Eclipse的Run Configuration中,找到你的项目的运行配置,切换到Arguments标签页,在VM arguments里添加:
-Djava.util.logging.config.file=src/main/resources/logging.properties
(注意路径要根据你的Resources文件夹实际位置调整,如果是Maven项目,默认src/main/resources就是源文件夹,路径是对的)
方案2:代码中手动重新加载配置
如果必须在代码里加载,不能用System.setProperty,而是要手动读取配置流并让LogManager重新加载:
public static void main(String[] args) { // 先手动加载配置 try (InputStream configStream = POSClient.class.getClassLoader().getResourceAsStream(LOGGING_PROPERTY_FILE)) { if (configStream != null) { LogManager.getLogManager().readConfiguration(configStream); } else { System.err.println("Could not find logging.properties in classpath"); } } catch (IOException e) { System.err.println("Failed to load logging configuration: " + e.getMessage()); } // 再初始化日志器 logger = Logger.getLogger(LOGGER_NAME); // 测试日志 logger.log(Level.INFO, "This INFO log should NOT show if config works"); logger.log(Level.WARNING, "This WARNING log should show"); }
二、为什么INFO日志还是会输出?
除了加载时机问题,还要检查两个点:
- 确保没有代码硬设日志级别:检查你的代码里有没有
logger.setLevel(Level.INFO)这类语句,这会覆盖配置文件的设置。 - 配置文件的Logger级别是否匹配:你的
LOGGER_NAME是POSClient.class.getName(),也就是完整类名(比如com.cineops.pos.POSClient),配置里的com.cineops.pos.level = WARNING是正确的(父包级别会被子类继承),但如果之前日志系统已经初始化,可能Logger已经继承了默认的INFO级别,所以必须重新加载配置后再获取Logger。
三、HttpClient日志无输出的问题
你的配置有两个关键错误:
- ConsoleHandler级别过滤了日志:你设置
java.util.logging.ConsoleHandler.level = WARNING,而org.apache.http.level = FINEST,Handler的级别是WARNING,所以所有低于WARNING的日志(比如FINEST、INFO)都会被Handler过滤掉,根本不会输出到控制台!要看到HttpClient的FINEST日志,必须把Handler级别改成至少FINEST:java.util.logging.ConsoleHandler.level = FINEST - Wire日志级别设置错误:
org.apache.http.wire是负责输出请求/响应详细内容的Logger,你设置它的级别为SEVERE,这意味着只有严重错误才会输出,如果你想看到Wire日志,需要改成:
(如果不想看太详细的内容,可以改成org.apache.http.wire.level = FINESTFINER或FINE)
四、验证配置是否正确加载
可以在代码里加几句调试代码,确认配置是否被读取:
// 检查系统属性 System.out.println("Logging config file path: " + System.getProperty("java.util.logging.config.file")); // 检查Logger级别 System.out.println("POSClient logger level: " + logger.getLevel()); System.out.println("Apache HTTP logger level: " + Logger.getLogger("org.apache.http").getLevel());
另外,确保你的Resources文件夹在Eclipse中被标记为Source Folder:右键文件夹 → Build Path → Use as Source Folder,这样编译后配置文件会被放到classpath根目录,才能被getResourceAsStream找到。
内容的提问来源于stack exchange,提问作者Saminda Peramuna
相关产品推荐
相关产品推荐

