java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java日志与Logback

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

作者:Scigar

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

一、为什么需要日志?

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

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

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

1. 输出语句的弊端

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

2. 日志技术的优势

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

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

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

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

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

1. 日志规范接口

常见的日志接口:

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

2. 日志实现框架

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

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

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

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

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

三、Logback 概述

1. 什么是 Logback?

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

很多现代框架(例如 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 文件完成,默认文件名为:

1. 配置大体结构

典型结构包含:

2. 输出位置(Appender)

常见的输出目的地:

举个简单示例:

<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>

表示:

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

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

好处是显而易见的:

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

总结

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

您可能感兴趣的文章:
阅读全文