一篇文章带你彻底搞懂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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java包装类型Long的==操作引发的低级bug

    浅谈Java包装类型Long的==操作引发的低级bug

    本文主要介绍了浅谈Java包装类型Long的==操作引发的低级bug,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • SpringBoot使用RabbitMQ延时队列(小白必备)

    SpringBoot使用RabbitMQ延时队列(小白必备)

    这篇文章主要介绍了SpringBoot使用RabbitMQ延时队列(小白必备),详细的介绍延迟队列的使用场景及其如何使用,需要的小伙伴可以一起来了解一下
    2019-12-12
  • Spring的两种事务管理机制的基本概念和demo示例

    Spring的两种事务管理机制的基本概念和demo示例

    Spring事务包括声明式事务管理和注解式事务管理,我们通过概念和小demo的形式一步一步地来一起学习这个知识点,需要的朋友可以参考下
    2023-07-07
  • 利用java实现二叉搜索树

    利用java实现二叉搜索树

    这篇文章主要介绍了利用java实现二叉搜索树,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • java中如何调用js

    java中如何调用js

    Nashorn是Java8中引入的一个新的JavaScript引擎,它允许在JVM上运行JavaScript代码,并且可以与Java代码相互调用,Nashorn遵循JSR233规范,是一个纯Java实现的JavaScript引擎,可以与Java程序无缝集成,提供动态脚本执行和灵活性
    2025-01-01
  • 【面试】Spring事务面试考点吐血整理(建议珍藏)

    【面试】Spring事务面试考点吐血整理(建议珍藏)

    本文是小编给大家收藏整理的Spring事务面试考点,非常不错,值得收藏,感兴趣的朋友参考下吧
    2019-04-04
  • 详谈Lock与synchronized 的区别

    详谈Lock与synchronized 的区别

    下面小编就为大家带来一篇详谈Lock与synchronized 的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • JustAuth整合第三方登录组件样例

    JustAuth整合第三方登录组件样例

    这篇文章主要为大家介绍了JustAuth整合第三方登录组件样例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 如何在java中使用Jython

    如何在java中使用Jython

    这篇文章主要介绍了如何在java中使用Jython,由于项目中需要用到Java调用Python的脚本,来实现一些功能,就对jython做了一些了解,通过jython可以实现java对python脚本的调用,需要的朋友可以参考一下
    2022-03-03
  • Spring计划任务用法实例详解

    Spring计划任务用法实例详解

    这篇文章主要介绍了Spring计划任务用法,结合实例形式详细分析了spring计划任务相关原理、配置、使用方法及操作注意事项,需要的朋友可以参考下
    2019-11-11

最新评论