0Pricing
Java Academy · 课时

配置 Logback

追加器、模式与级别

配置 Logback 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

什么是 Logback?

Logback 是一种流行的 SLF4J 后端,由 Log4j 的同一位作者编写。它实际执行 SLF4J 调用所描述的日志记录操作。

您可以通过类路径上名为 logback.xml 的文件进行配置,该文件通常位于 src/main/resources 下。

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

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("Logback reads logback.xml at startup");
    }
}

三个构建模块

Logback 配置包含三个核心概念:

  • 日志记录器:带有级别的日志事件命名来源。
  • 附加器:日志的目标位置(控制台、文件)。
  • 编码器/布局:将事件格式化为文本。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("logger -> appender -> encoder -> output");
    }
}

控制台附加器

最简单的配置是将所有内容发送到控制台。编码器的模式控制每行的格式。

此 XML 位于 logback.xml 中,而不是您的 Java 代码中。

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

理解模式

模式转换词以 % 开头:

  • %d 表示时间戳,%level 表示级别。
  • %logger 表示日志记录器名称,%thread 表示线程。
  • %msg 表示您的消息,%n 表示换行。

%-5level 会将级别左侧填充到宽度 5。

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

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        // Output rendered by pattern: time LEVEL logger - message
        log.info("hello");
    }
}

根日志记录器与级别

<root> 元素为整个应用设置默认级别,并指定它写入哪些附加器。

设置 level="info" 表示会输出 INFO、WARN 和 ERROR;DEBUG 与 TRACE 会被抑制。

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
  </appender>
  <root level="warn">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

按软件包设置级别

添加 <logger> 元素,即可覆盖某个软件包的级别。这样,您可以为自己的代码启用 DEBUG,同时让库保持安静。

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
  </appender>
  <logger name="com.example.app" level="debug" />
  <root level="info">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

滚动文件附加器

在生产环境中,您通常会按日期或大小写入会滚动的文件,这样日志就不会无限增长。

RollingFileAppender 配合基于时间的策略每天创建一个文件,并保留数量受限的历史记录。

<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>30</maxHistory>
  </rollingPolicy>
  <encoder>
    <pattern>%d %-5level [%thread] %logger{36} - %msg%n</pattern>
  </encoder>
</appender>

同时使用多个附加器

根日志记录器可以引用多个附加器,因此日志可以同时发送到控制台和文件。

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder><pattern>%-5level %msg%n</pattern></encoder>
  </appender>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/app.log</file>
    <encoder><pattern>%d %-5level %msg%n</pattern></encoder>
  </appender>
  <root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

输出 MDC

若要在每行中包含请求 ID 等 MDC 上下文,请将 %X{key} 添加到模式中。

这样,您放入 MDC 的任何值都会自动显示。

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

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        MDC.put("requestId", "req-1234");
        // Pattern: %X{requestId} %-5level %msg%n
        log.info("handled");
        MDC.clear();
    }
}

可加性

默认情况下,日志记录器的事件也会发送到其祖先的附加器。这称为可加性。

如果某个软件包日志记录器有自己的附加器,而您不希望输出重复,请在其上设置 additivity="false"。

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
  </appender>
  <logger name="com.example.audit" level="info" additivity="false">
    <appender-ref ref="STDOUT" />
  </logger>
  <root level="warn">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

自动重新加载与变量

Logback 可以通过 <configuration scan="true"> 定期重新加载配置,这对于无需重启即可更改级别非常有用。

您还可以使用 ${LOG_DIR} 占位符读取属性,例如日志目录。

<configuration scan="true" scanPeriod="30 seconds">
  <property name="LOG_DIR" value="logs" />
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${LOG_DIR}/app.log</file>
    <encoder><pattern>%d %-5level %msg%n</pattern></encoder>
  </appender>
  <root level="info"><appender-ref ref="FILE" /></root>
</configuration>

快速检查

测试您对 Logback 配置的了解。

回顾

您已经学习了如何配置 Logback:

  • 配置位于 logback.xml 中,其中包含日志记录器、附加器和编码器。
  • 模式使用 %d、%level、%msg 和 %X{} 格式化日志行。
  • RollingFileAppender 会滚动日志;请设置按软件包划分的级别和可加性。
  • 启用 scan 以进行实时重新配置。

您已经完成了日志记录课程。

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

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("Logback configuration course complete");
    }
}

常见问题解答

「配置 Logback」课时是免费的吗?

是的 — 「配置 Logback」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「配置 Logback」这节课中我会学到什么?

追加器、模式与级别 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「配置 Logback」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 结构化日志为何重要
  2. SLF4J 外观与日志记录器
  3. 参数化日志记录
  4. 配置 Logback
← 返回 Java Academy