当前位置: 代码网 > it编程>编程语言>Java > 一篇文章带你彻底搞懂Java日志与Logback

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

2026年04月19日 Java 我要评论
一、为什么需要日志?在开发和运维一个系统时,我们经常会有这样的需求:想清楚地知道系统运行了哪些步骤某个时间点系统发生了什么错误用户反馈“系统卡了/挂了”,希望能还原当时的现场这

一、为什么需要日志?

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

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

这时候就离不开:日志(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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com