今天我在测试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.x | Java 6+ ✅ |
| 1.3.x | Java 8(部分模块已升级)⚠️ |
| 1.4.x | Java 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-simple和logback.xml- Java 8 项目锁定 Logback 1.2.x
1211

被折叠的 条评论
为什么被折叠?



