Skip to content
DAILY QUOTE

“ ”

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)**的监控,看人是不是死在了大门口。