logging.level.org...: debug(保安/网络层监控)和 @Slf4j(店长/业务层监控)的物理边界。
这个“保安与店长”的比喻非常传神!在 Java 后端开发中,这两者之间所谓的**“物理边界”,本质上是“框架底层(Infrastructure)”与“业务代码(Business Logic)”之间的壁垒**。
我们可以顺着你的比喻,结合一个请求进入服务器的全生命周期,把这个边界彻底拆解开:
1. 外围防线:logging.level...(保安 / 框架层)
物理位置:存在于你的配置文件中(如
application.yml)。作用域:包裹在你写的代码之外的所有第三方框架(比如 Spring MVC、Tomcat、MyBatis、Redis 客户端等)。
行为特征:
只看协议,不懂业务。当你在 yml 里开启了
logging.level.org.springframework.web: debug,这就相当于给大楼保安发了指令:“凡是进大门的,把车牌号和几点几分全记下来!”保安(框架)会在日志里疯狂输出:收到一个 HTTP GET 请求、路径是
/api/users/123、携带了什么 Header。当你开启
logging.level...mybatis: debug时,相当于车库保安在记录:执行了一句SELECT * FROM user的 SQL,耗时 20 毫秒。
边界局限:保安永远不知道这个叫“123”的用户进来是为了买东西还是为了退款,他只负责记录物理层面的“动作”。
2. 核心内场:@Slf4j(店长 / 业务层)
物理位置:存在于你亲手敲的
.java源码里(Controller、Service、核心组件类)。作用域:你写的那几行具体的核心业务逻辑。
行为特征:
只认逻辑,不管底层。你在代码里写下
log.info("用户 {} 正在尝试下单,商品 ID: {}", userId, productId),这就相当于店长在店里拿着对讲机喊:“注意,VIP 客户张三正在看那个很贵的包!”店长(你的代码)完全不关心张三是坐哪路公交车(HTTP 协议)来的,也不关心仓库管理员去拿货跑了几步路(SQL 怎么拼接的)。
边界局限:店长的视野只在店里。如果大门外的马路塌了(Tomcat 突然拒绝连接),或者仓库钥匙断了(数据库连接池满了),店长是完全不知道的,因为请求根本没走到店长面前。
物理边界的总结
这两者的界线非常清晰,一条线画在了**“你写的代码”与“别人的轮子”**之间:
| 维度 | logging.level (保安 / 框架层) | @Slf4j (店长 / 业务层) |
|---|---|---|
| 控制方式 | 通过修改 YML/Properties 配置 | 通过 Java 代码手动编写 log.xxx() |
| 感知内容 | HTTP 状态码、请求路径、SQL 语句、内存变化 | 订单号、用户 ID、业务报错提示、逻辑分支 |
| 主要用途 | 排查“连接不通”、“SQL 报错”、“请求被拦截”等底层环境或框架问题。 | 排查“为什么金额算错了”、“为什么用户没领到券”等业务逻辑问题。 |
在实际排查 Bug 的时候,通常是先看“店长”(@Slf4j),如果店长说“我根本没看见这个人”,再去**调取“保安”(logging.level)**的监控,看人是不是死在了大门口。