Log4j配置后调用logger.info无法输出日志问题求助
问题根因
- 静态Logger实例初始化早于日志配置执行:你定义的
public static final Logger logger是类静态成员,会在Main类加载阶段就完成初始化,此时main方法里的BasicConfigurator.configure()还没有运行,Logger初始化时没有绑定有效输出配置,后续配置执行后也不会重新绑定已经初始化的Logger实例,这是该场景下最常见的问题。 - Logger获取方式不规范:调用
Logger.getLogger("Main.class")时传入的是固定字符串,若Log4j配置了按名称匹配的日志级别规则,可能匹配不到对应规则导致级别被限制;规范写法是传入当前类的Class对象:Logger.getLogger(Main.class)。 - 存在其他配置覆盖默认规则:如果你的项目classpath下存在
log4j.properties或log4j.xml配置文件,Log4j会优先加载这些文件的配置,若这些配置里根Logger级别设为WARN及以上,INFO级别的日志会被直接过滤。
排查解决步骤
- 调整配置执行顺序,保证日志配置先于Logger初始化运行,可以把配置代码放在静态代码块中:
public class Main { // 类加载阶段先执行日志配置 static { BasicConfigurator.configure(); } // 配置完成后再初始化Logger实例 public static final Logger logger = Logger.getLogger(Main.class); public static void main(String[] args) { logger.info("Starting Game..."); } }
- 清理冲突配置文件:检查项目编译后的classpath目录,删除测试阶段冗余的
log4j.properties、log4j.xml配置文件,避免默认配置被覆盖。 - 显式指定日志级别验证:如果调整顺序后仍无输出,可以在日志打印前手动设置Logger级别,确认是否是级别限制导致的问题:
logger.setLevel(Level.INFO); logger.info("Starting Game...");
- 检查依赖完整性:确认项目中同时导入了Log4j的API和实现包,避免依赖缺失导致配置不生效。
内容的提问来源于stack exchange,提问作者Pluto7073
相关产品推荐
相关产品推荐

