配置 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 反馈 — 无需本地设置。
此课程中的所有课时
- 结构化日志为何重要
- SLF4J 外观与日志记录器
- 参数化日志记录
- 配置 Logback