Ebean 无法打印 SQL 日志?一步步排查与终极解决方案(Java 8 + Maven 环境)

今天我在测试Ebean框架,发现SQL日志无法正常显示,通过不断调整,最后成功显示SQL日志。

适用场景:使用 Ebean ORM 框架,配置了日志但 SQL 语句始终不输出
技术栈:Java 8、Maven、Ebean 12.x、MySQL、Logback
关键词:Ebean SQL 日志、BeanNotEnhancedException、slf4j-simple、logback-classic、Java 版本兼容性


🧩 问题现象

application.properties 中配置了:

io.ebean.db.logging=sql
io.ebean.db.loglevel=DEBUG

logback.xml 中也配置了:

<logger name="io.ebean.SQL" level="DEBUG"/>
<logger name="io.ebean.TXN" level="TRACE"/>

但执行查询后,控制台始终不打印 SQL 语句,仅输出:

[main] INFO io.ebean - ebean version: 12.16.1
[main] INFO io.ebean.core - Started database[db] platform[MYSQL] in 640ms
BeanList size[6] list[UserInfo(...)]

🔍 排查过程

第一步:确认日志配置是否正确?

Ebean 的 SQL 日志依赖两个特定的 logger:

  • io.ebean.SQL → 输出 SQL 语句
  • io.ebean.TXN → 输出绑定参数(如 bind: [123, 'Ana']

⚠️ 注意:必须是 大写 SQL,不是 io.ebean.sql

✅ 配置无误。


第二步:是否启用了字节码增强(Enhancement)?

Ebean 的高级功能(包括 SQL 日志)依赖实体类被增强。未增强的类会进入“fallback 模式”,部分功能被禁用。

检查发现:

  • 实体类 UserInfo 继承 io.ebean.Model,标注 @Entity
  • 项目中包含 ebean.mf,但 未启用运行时增强

✅ 解决方案:添加 ebean-agent 依赖

<dependency>
    <groupId>io.ebean</groupId>
    <artifactId>ebean-agent</artifactId>
    <version>12.16.1</version>
    <scope>runtime</scope>
</dependency>

Ebean 12+ 默认使用 Java Agent 进行运行时增强ebean.mf 不再是必需。


第三步:日志框架是否真的生效?

关键发现:项目中引入了:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.36</version>
</dependency>

slf4j-simple 是一个极简日志实现,具有以下限制:

  • 默认日志级别为 INFO
  • 不支持 logback.xml 配置
  • 无法输出 DEBUG 级别日志

因此,尽管写了 logback.xml,但根本未被加载

✅ 解决方案:移除 slf4j-simple,改用 logback-classic

<!-- 删除 slf4j-simple -->
<!-- 添加 logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.13</version> <!-- 兼容 Java 8 -->
</dependency>

第四步:Java 版本兼容性问题

更换为 logback-classic 后,出现新错误:

java.lang.UnsupportedClassVersionError: 
ch/qos/logback/... compiled by Java 11 (class file version 55.0), 
but this JVM only supports up to 52.0 (Java 8)

原因:logback 1.4.x 要求 Java 11+,而项目使用 Java 8

✅ 解决方案:使用 Logback 1.2.13(最后一个支持 Java 8 的稳定版本)

Logback 版本最低 Java 版本
1.2.xJava 6+ ✅
1.3.xJava 8(部分模块已升级)⚠️
1.4.xJava 11+ ❌

✅ 最终解决方案

1. pom.xml 依赖配置(Java 8 兼容)

<dependencies>
  <!-- Ebean 核心 -->
  <dependency>
    <groupId>io.ebean</groupId>
    <artifactId>ebean</artifactId>
    <version>12.16.1</version>
  </dependency>

  <!-- 运行时增强(关键!) -->
  <dependency>
    <groupId>io.ebean</groupId>
    <artifactId>ebean-agent</artifactId>
    <version>12.16.1</version>
    <scope>runtime</scope>
  </dependency>

  <!-- MySQL 驱动 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
  </dependency>

  <!-- Lombok -->
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.32</version>
    <scope>provided</scope>
  </dependency>

  <!-- ✅ Logback for Java 8 -->
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.13</version>
  </dependency>
</dependencies>

2. logback.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>${LOG_PATTERN}</pattern>
      <charset>UTF-8</charset>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
  </root>

  <!-- ✅ 打印 SQL -->
  <logger name="io.ebean.SQL" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
  </logger>

  <!-- ✅ 打印绑定参数 -->
  <logger name="io.ebean.TXN" level="TRACE" additivity="false">
    <appender-ref ref="CONSOLE"/>
  </logger>
</configuration>

3. 实体类示例

package com.ebean.model;

import io.ebean.Model;
import lombok.Data;
import javax.persistence.*;

@Entity
@Table(name = "user_info")
@Data
public class UserInfo extends Model {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
}

🎯 验证结果

成功输出 SQL 日志:

2025-10-30 10:17:00.974 [main] INFO  io.ebean - ebean version: 12.16.1
2025-10-30 10:17:00.994 [main] INFO  io.avaje.config - Loaded properties from [resource:application.properties] 
2025-10-30 10:17:01.060 [main] DEBUG io.ebean.internal - Classpath search entities[1] searchTime[15] in packages[[com.ebean.model]]
2025-10-30 10:17:01.333 [main] INFO  io.ebean.datasource - DataSourcePool [db] autoCommit[false] transIsolation[READ_COMMITTED] min[2] max[200] in[262ms]
2025-10-30 10:17:01.341 [main] DEBUG io.ebean.core - platform for productName[mysql] version[5.7]
2025-10-30 10:17:01.354 [main] DEBUG io.ebean.BackgroundExecutor - Created backgroundExecutor ebean-db (schedulePoolSize=1, shutdownWaitSeconds=30)
2025-10-30 10:17:01.476 [main] DEBUG io.ebean.internal - BeanPersistControllers[0] BeanFinders[0] BeanPersistListeners[0] BeanQueryAdapters[0] BeanPostLoaders[0] BeanPostConstructors[0]
2025-10-30 10:17:01.582 [main] DEBUG io.ebean.internal - Entities[1]
2025-10-30 10:17:01.636 [main] INFO  io.ebean.core - Started database[db] platform[MYSQL] in 604ms
2025-10-30 10:17:01.721 [main] DEBUG io.ebean.SQL - txn[1001] select t0.id, t0.name, t0.age from user_info t0; --bind() --micros(31866)
2025-10-30 10:17:01.723 [main] DEBUG io.ebean.SUM - txn[1001] FindMany type[UserInfo] origin[6JGT1.A.A] exeMicros[34348] rows[6] predicates[] bind[]
BeanList size[6] list[UserInfo(id=1, name=Ana, age=27), UserInfo(id=2, name=Ame, age=24), UserInfo(id=3, name=Clid, age=24), UserInfo(id=4, name=Dave, age=24), UserInfo(id=5, name=Eva, age=24), UserInfo(id=6, name=Maybe, age=27)]
2025-10-30 10:17:01.727 [EbeanHook] DEBUG io.ebean - Ebean shutting down
2025-10-30 10:17:01.727 [EbeanHook] DEBUG io.ebean.BackgroundExecutor - BackgroundExecutor stopped
2025-10-30 10:17:01.739 [EbeanHook] INFO  io.ebean.datasource - DataSourcePool [db] shutdown min[2] max[200] free[2] busy[0] waiting[0] highWaterMark[1] waitCount[0] hitCount[3]  psc[hit:0 miss:1 put:1 rem:0]

💡 总结与建议

问题根源解决方案
使用 slf4j-simple改用 logback-classic
未启用 Ebean 增强添加 ebean-agent 依赖
Logback 版本过高使用 1.2.13 兼容 Java 8
logger 名称错误使用 io.ebean.SQL(大写)

最佳实践

  • 开发时始终启用 ebean-agent
  • 避免混用 slf4j-simplelogback.xml
  • Java 8 项目锁定 Logback 1.2.x

📚 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值