一篇文章带你彻底搞懂Java日志与Logback

 更新时间:2026年04月19日 10:05:42   作者:Scigar  
Logback是一个开源的日志框架,Logback旨在提供比log4j更高效、更灵活的日志解决方案,这篇文章主要介绍了Java日志与Logback的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、为什么需要日志?

在开发和运维一个系统时,我们经常会有这样的需求:

  • 想清楚地知道系统运行了哪些步骤
  • 某个时间点系统发生了什么错误
  • 用户反馈“系统卡了/挂了”,希望能还原当时的现场

这时候就离不开:日志(Log)

很多初学者一开始就是在代码里到处写 System.out.println(...) 来“打日志”。 这种方式虽然简单,但有几个明显弊端:

1. 输出语句的弊端

  • 信息只能显示在控制台,关掉控制台就什么都没了
  • 无法方便地记录到文件数据库等其他位置
  • 想“停用日志”或者“少打印点日志”,就得改代码、重新打包、重新上线

对于一个真正的线上系统,这些都是难以接受的。

2. 日志技术的优势

专业的日志框架能帮我们解决上述问题,它具备这些能力:

  • 可以将系统执行信息选择性地记录到:
    • 控制台
    • 文件
    • 数据库(一般不推荐大量打到 DB,中间件会偶尔这么做)
  • 可以通过配置文件来控制:
    • 哪些日志记录
    • 记录到哪里
    • 以什么格式记录
    • 用什么级别(debug/info/warn/error)
  • 可以通过“开关(级别设置)”来决定是否记录日志,而无需修改源代码

一句话:日志框架让“日志”变成一种可配置、可控制的基础设施

二、日志体系:接口与实现

Java 生态中的日志并不是一个单一库,而是一个分层体系,大致可以理解为两类:

  1. 日志规范接口(Facade,门面)
  2. 日志实现框架(具体干活的)

1. 日志规范接口

常见的日志接口:

  • Commons Logging (简称:JCL)
  • Simple Logging Facade for Java (简称:slf4j)

它们本质上是一组接口,定义了像 info()、debug()、error() 等方法。 这些接口并不关心日志具体如何输出、存在哪里,而是提供给各类日志实现框架一个统一的规范

2. 日志实现框架

一些典型的日志实现框架:

  • Log4j
  • Logback
  • Log4j2 等

这些框架才是真正干活的,负责把日志按要求写到控制台、文件、网络等地方。

因为对 Commons Logging 的接口不满意,有人搞了 SLF4J;
因为对 Log4j 的性能不满意,有人搞了 Logback。
Java 日志体系就是这样一步步演进出来的。

在现代项目中,常见组合是:

  • 代码依赖 SLF4J 接口
  • 底层使用 Logback 作为实现

这样你写的代码只依赖接口,以后如果要更换日志实现(从 Logback 换成 Log4j2 等),只要改依赖和配置,而不用改业务代码。

三、Logback 概述

1. 什么是 Logback?

Logback是一个高性能的日志框架:

  • 由 Log4j 作者开发,是 Log4j 的“进化版”
  • 基于 SLF4J 日志规范实现
  • 性能和功能上普遍优于传统的 Log4j

很多现代框架(例如 Spring Boot)默认都使用 Logback 作为日志实现。

2. Logback

Logback 主要分为三个模块:

  1. logback-core

    • 核心模块
    • 为其他模块提供基础功能
    • 使用 Logback 必须有它
  2. logback-classic

    • 完整实现了 SLF4J API 的模块
    • 一般我们日常使用的就是这个模块配合 logback-core
  3. logback-access

    • 与 Tomcat、Jetty 等 Servlet 容器集成
    • 用于记录 HTTP 访问日志

一般 Java 应用最常用的是:logback-core + logback-classic。

四、Logback 快速入门

1. 引入依赖

以 Maven 项目为例,只要引入 SLF4J 接口和 Logback 实现(很多场景 Spring Boot 已经帮你引好了):

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>最新稳定版</version>
</dependency>

logback-classic 会自动依赖 logback-core 和 slf4j-api,通常不用你再额外引。

2. 基本使用方式

在代码中使用时,永远面向 SLF4J 接口编程

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
    // 获取日志对象
    private static final Logger log = LoggerFactory.getLogger(Demo.class);
    public static void main(String[] args) {
        log.trace("这是 trace 级别日志");
        log.debug("这是 debug 级别日志");
        log.info("这是 info 级别日志");
        log.warn("这是 warn 级别日志");
        log.error("这是 error 级别日志");
    }
}

看起来和 System.out.println() 很像,但本质完全不同:

  • 输出位置可以是:控制台 / 文件 / 甚至远程日志收集系统
  • 输出格式、是否输出、输出多少,全由配置文件控制
  • 不需要改业务代码就可以调整日志策略

五、Logback 配置:输出位置与格式

Logback 的配置通常通过一个 XML 文件完成,默认文件名为:

  • logback.xml(最常见)
  • 或 logback-spring.xml

1. 配置大体结构

典型结构包含:

  • <appender>:定义“输出到哪里、以什么格式输出”
  • <logger>:定义某个包/类的日志级别与使用哪些 appender
  • <root>:根日志器,所有日志最终都会归到这里

2. 输出位置(Appender)

常见的输出目的地:

  • 控制台:ConsoleAppender
  • 文件:FileAppender
  • 滚动文件(按大小/日期拆分日志文件):RollingFileAppender

举个简单示例:

<configuration>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <!-- 这里可以配置按日期/大小滚动等 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 根日志器,设置级别和使用的 appender -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

你在笔记中提到:

“logback可以存在文件中,具体文件可以存在哪里,xml文件里面可以设置。”

就是通过 <file>、滚动策略等配置来确定日志保存路径和拆分策略。

六、日志级别详解

项目上线后,常见的两种需求:

  • 线上环境只记录重要的错误信息,不要太多无用日志
  • 某个问题需要排查时,暂时想多打一点日志看看细节

这就要靠日志级别来精细控制输出。

1. 常见日志级别(从低到高)

一般从低到高是:

  1. TRACE:最详细的日志,一般只在调试极其复杂问题时使用
  2. DEBUG:调试信息,开发环境常用
  3. INFO:常规业务运行信息,如重要步骤、关键结果
  4. WARN:警告信息,可能有问题但不影响系统继续跑
  5. ERROR:错误信息,功能失败或系统异常

在配置中给某个 logger 设定了某个级别之后,只会输出该级别及以上的日志。

例如:

<root level="INFO">
    ...
</root>

表示:

  • TRACEDEBUG 级别日志不会输出
  • INFO、、 会输出WARNERROR

2. 通过级别控制日志开关

“可以通过设置日志的输出级别来控制哪些日志信息输出或者不输出。”

好处是显而易见的:

  • 开发环境:可以把级别设为 DEBUG 或 TRACE,看到更多细节
  • 测试环境:设为 INFO,既能看业务流程又不会太吵
  • 生产环境:通常设为 WARN 或 ERROR,只关注潜在问题和错误

最重要的是,这一切都是通过配置文件修改完成,无需改任何业务代码。

总结

到此这篇关于Java日志与Logback的文章就介绍到这了,更多相关Java日志与Logback内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 网关Gateway过滤器的使用详解

    网关Gateway过滤器的使用详解

    Gateway网关的过滤器分为两种,一种是局部过滤器,一种是全局过滤器,过滤器就是过滤一些请求,在这里,全局过滤器的作用是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样,本文给大家介绍网关Gateway过滤器的使用,感兴趣的朋友一起看看吧
    2022-07-07
  • JDK与Dubbo中的SPI详细介绍

    JDK与Dubbo中的SPI详细介绍

    这篇文章主要介绍了JDK中的SPI与Dubbo中的SPI,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Java之ThreadPoolExecutor类详解

    Java之ThreadPoolExecutor类详解

    这篇文章主要介绍了Java之ThreadPoolExecutor类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java函数式编程(九):Comparator

    Java函数式编程(九):Comparator

    这篇文章主要介绍了Java函数式编程(九):Comparator,本文是系列文章的第9篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下
    2014-09-09
  • SpringBoot服务器配置全过程

    SpringBoot服务器配置全过程

    Spring Boot默认请求头最大长度为8KB,可以通过配置文件修改,默认最大连接数取决于所用服务器(如Tomcat、Jetty或Undertow),例如Tomcat默认最大连接数为8192,最大工作线程数为200,最大等待队列长度为100,Jetty和Undertow也有不同的默认配置
    2025-11-11
  • Apache Commons fileUpload实现文件上传之一

    Apache Commons fileUpload实现文件上传之一

    这篇文章主要介绍了Apache Commons fileUpload实现文件上传之一的相关资料,需要的朋友可以参考下
    2016-03-03
  • Java二分查找算法实例详解

    Java二分查找算法实例详解

    在本篇文章里小编给大家分享总结的是一篇关于Java二分查找算法实例详解内容,对此有兴趣的朋友们可以跟着学习下。
    2022-11-11
  • Springboot之如何统计代码执行耗时时间

    Springboot之如何统计代码执行耗时时间

    这篇文章主要介绍了Springboot之如何统计代码执行耗时时间问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java 非对称加密算法RSA实现详解

    java 非对称加密算法RSA实现详解

    这篇文章主要介绍了java 非对称加密算法RSA实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • JAVA JDK8 List分组的实现和用法

    JAVA JDK8 List分组的实现和用法

    今天小编就为大家分享一篇关于JAVA JDK8 List分组的实现和用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论