| 问题 | 技术关键词 / 要点 | 通俗解释 |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| **为什么 `logger.warn()` 前要用 `logger.isWarnEnabled()`?** | 避免不必要的**字符串拼接开销**;如果日志级别高于 WARN,拼接参数的计算就白做了。注意:SLF4J 的**占位符 `{}`** 写法已自带延迟拼接,此时可省略判断 | 就像发快递前先打电话确认对方在不在家——如果没人收,你就不用费劲打包了。用 `{}` 占位符相当于"货到付款",只有真要打印时才拼字符串 |
| [[为什么不能直接用 Log4j / Logback 的 API?]] | 应通过**SLF4J 门面**(Facade)编程,实现**日志实现与业务代码解耦**;更换底层框架(Log4j → Logback)时无需改业务代码,符合**依赖倒置原则** | 就像用万能充电头(SLF4J)而不是某品牌专用线——换手机(换日志框架)时,充电头不用换,插上就能用 |
| [[什么是分布式日志系统?]] | 将多台服务器的日志**统一采集、传输、存储、检索**。典型架构:**ELK**(Elasticsearch + Logstash + Kibana)、**Loki + Grafana**;核心能力:全链路 **TraceID** 串联、集中查询、告警 | 一个大公司有几百间办公室,每间都有自己的监控录像。分布式日志系统就是把所有录像汇总到一个中控室,让你在一块屏幕上就能搜到任何一间房间、任何时间段的画面 |
| [[记录日志影响性能怎么办?]] | ① 使用**异步 Appender**(AsyncAppender)把写日志放到独立线程/队列;② 合理设置**日志级别**,生产环境关闭 DEBUG;③ 避免在日志中调用 `toString()` 等**昂贵操作**;④ 采用**采样日志**(Sampling)降低高频日志量 | 把"写日记"这件事交给助理(异步线程)去做,你继续干正事;同时只记重要的事(提高级别),别事无巨细全写——既省时间又省纸 |