CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Java 生态与工具链/课时/日志框架
RawBlame
课时目录12 节

Java 生态与工具链

  1. 01Java 生态地图
  2. 02数据库访问
  3. 03Hibernate 深入
  4. 04EBean ORM
  5. 05日志框架
  6. 06Javadoc 与文档
  7. 07Play Framework
  8. 08Javalin 微框架
  9. 09REST Assured
  10. 10JMeter 性能测试
  11. 11Java 加密基础
  12. 12综合练习

日志框架

slf4j、logback、log4j2、tinylog。

30 分钟

日志框架

System.out.println 排障一次还行,上线后你需要 级别、格式、滚动文件与集中采集。Java 生态的标准答案是 SLF4J 门面 + Logback / Log4j2 实现——spring-boot-essentials 默认如此;本课让你在脱离 Spring 时也能正确配置,并与 java-core-essentials 的异常栈追踪配合。

学习目标

  • 用 SLF4J API 写日志,理解门面与实现分离
  • 配置 Logback 的控制台与按日滚动文件
  • 区分 DEBUG/INFO/WARN/ERROR 的使用场景,避免日志噪音与敏感信息泄露

SLF4J 基本用法

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PaymentService {
    private static final Logger log = LoggerFactory.getLogger(PaymentService.class);

    public void charge(String orderId, long amountCents) {
        log.info("charge start orderId={} amount={}", orderId, amountCents);
        try {
            // ... 调用支付网关
            log.debug("gateway response received orderId={}", orderId);
        } catch (Exception ex) {
            log.error("charge failed orderId={}", orderId, ex);
            throw ex;
        }
    }
}

占位符 {} 优于字符串拼接:实现层可延迟 toString(),且避免 null 拼接 NPE。

Logback 配置(logback.xml)

<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>14</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>%d ISO8601 [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="com.example.payment" level="DEBUG"/>
  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
</configuration>

门面 vs 实现 vs 竞品

组件角色
SLF4J应用代码只依赖此 API
LogbackSpring Boot 默认实现,与 SLF4J 同作者
Log4j2高性能替代,需 log4j-slf4j2-impl 桥接
Tinylog极简依赖,适合 Android/CLI,API 不同

禁止在业务代码里直接 import org.apache.logging.log4j.Logger——换实现时要改全库。

最佳实践

  • 生产默认 INFO;排障时临时调高包级别,而非永久 DEBUG
  • 结构化字段:订单号、traceId 用 key=value,便于 ELK/Loki 检索
  • 不要打密码、token、完整卡号;PII 需脱敏
  • 异常用 log.error("msg", ex) 保留栈,不要只 ex.getMessage()

练习

  • 为 jev-db 的 UserRepository 加 INFO(成功)与 ERROR(SQL 异常)日志
  • 写 logback.xml,验证日志同时输出控制台与 logs/app.log
  • 用 <logger name="org.hibernate.SQL" level="DEBUG"/> 观察 ORM SQL,再改回 WARN

小结

SLF4J 写代码,Logback 配输出;级别与格式决定线上可观测性。 下一课用 Javadoc 把 API 契约写进源码。

加载本节练习…
← 上一课EBean ORM下一课 →Javadoc 与文档