SpringBoot LogbackvsLog4j2配置与性能测试对比分析

 更新时间:2025年12月12日 14:53:00   作者:fanxbl957  
本文主要对比了SpringBoot中Logback和Log4j2的日志框架,Logback作为Log4j的继任者,性能稳定,适合大多数应用场景,而Log4j2通过异步日志记录方式,在高并发场景下性能优越,支持多种配置方式,但配置相对复杂,需要排除默认的Logback依赖

一、引言

在Spring Boot应用开发中,日志记录是一个至关重要的环节。它不仅有助于开发者在开发阶段进行调试,还能在生产环境中监控系统运行状态、排查问题。

Spring Boot默认集成了Logback作为日志框架,但同时也支持Log4j2等其他日志框架。

本文将深入对比Logback和Log4j2的配置方法,并通过性能测试来帮助开发者选择更适合自己项目的日志框架。

二、Logback和Log4j2简介

2.1 Logback

Logback是由Log4j创始人设计的另一个开源日志组件,作为Log4j的继任者,它具有更高的性能和更丰富的功能。

Logback被分为三个模块:logback-core、logback-classic和logback-access。其中,logback-core是其他两个模块的基础模块,logback-classic是Log4j的一个改良版本,并且实现了SLF4J API,而logback-access则与Servlet容器集成,提供了HTTP访问日志功能。

2.2 Log4j2

Log4j2是Apache Log4j的升级版,它在Log4j的基础上进行了大量的改进,解决了Log4j和Logback的一些性能和功能上的不足。

Log4j2采用了多线程异步日志记录的方式,在高并发场景下具有更好的性能表现。同时,它还支持多种配置方式,如XML、JSON、YAML等。

三、Spring Boot中Logback的配置

3.1 引入依赖

Spring Boot默认集成了Logback,因此在创建Spring Boot项目时,无需额外引入Logback的依赖。

如果使用Maven,项目的pom.xml中会有如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter-web中已经包含了spring-boot-starter-logging,而spring-boot-starter-logging默认使用Logback作为日志框架。

3.2 配置文件

src/main/resources目录下创建logback.xml文件,以下是一个简单的Logback配置示例:

<configuration>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件输出 -->
    <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{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 设置日志级别 -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

上述配置中,定义了两个appender:一个用于控制台输出,另一个用于文件输出。同时,将根日志级别设置为info,并将日志输出到控制台和文件中。

3.3 使用日志

在Spring Boot项目中,可以通过SLF4J来使用Logback进行日志记录。

以下是一个简单的示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LogbackExampleApplication implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(LogbackExampleApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(LogbackExampleApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        logger.info("This is an info log message.");
        logger.error("This is an error log message.");
    }
}

四、Spring Boot中Log4j2的配置

4.1 排除Logback依赖并引入Log4j2依赖

如果要在Spring Boot项目中使用Log4j2,需要先排除默认的Logback依赖,然后引入Log4j2的依赖。

pom.xml中进行如下配置:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>

4.2 配置文件

src/main/resources目录下创建log4j2.xml文件,以下是一个简单的Log4j2配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <File name="File" fileName="logs/app.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Root>
    </Loggers>
</Configuration>

上述配置中,定义了两个Appender:一个用于控制台输出,另一个用于文件输出。同时,将根日志级别设置为info,并将日志输出到控制台和文件中。

4.3 使用日志

与Logback一样,在Spring Boot项目中也可以通过SLF4J来使用Log4j2进行日志记录。代码示例与Logback的使用示例相同。

五、Logback和Log4j2的性能测试

5.1 测试环境

  • 操作系统:Windows 10
  • Java版本:Java 17
  • Spring Boot版本:3.1.0
  • 测试工具:JMH(Java Microbenchmark Harness)

5.2 测试代码

以下是一个使用JMH进行性能测试的示例代码:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
@Fork(value = 1, jvmArgs = {"-Xms2G", "-Xmx2G"})
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
public class LoggingBenchmark {

    private static final Logger logger = LoggerFactory.getLogger(LoggingBenchmark.class);

    @Benchmark
    public void logInfo() {
        logger.info("This is a log message.");
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
               .include(LoggingBenchmark.class.getSimpleName())
               .build();
        new Runner(opt).run();
    }
}

5.3 测试结果分析

运行上述测试代码,分别在使用Logback和Log4j2的情况下进行测试。测试结果可能会受到多种因素的影响,如硬件配置、日志级别、日志输出方式等。

一般来说,在高并发场景下,Log4j2的异步日志记录方式会比Logback具有更好的性能表现。

六、总结

6.1 Logback的优缺点

优点

  • 与Spring Boot默认集成,配置简单。
  • 性能稳定,适合大多数应用场景。
  • 功能丰富,支持多种日志输出方式。

缺点

  • 在高并发场景下,性能可能不如Log4j2。

6.2 Log4j2的优缺点

优点

  • 采用多线程异步日志记录方式,在高并发场景下性能优越。
  • 支持多种配置方式,灵活性高。

缺点

  • 配置相对复杂,需要排除默认的Logback依赖。

6.3 选择建议

如果项目对日志性能要求不高,且希望使用简单的配置,那么Logback是一个不错的选择。如果项目需要处理大量的并发日志记录,对性能有较高的要求,那么Log4j2更适合。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用跳转结构实现队列和栈流程详解

    Java使用跳转结构实现队列和栈流程详解

    这篇文章主要介绍了Java使用跳转结构实现队列和栈流程,连续结构和跳转结构是数据结构中常见的两种基本数据结构,而我们本次的主角栈和队列都 既可以使用使用跳转结构实现也可以使用连续结构实现
    2023-04-04
  • SpringBoot+Redis+Lua分布式限流的实现

    SpringBoot+Redis+Lua分布式限流的实现

    本文主要介绍了SpringBoot+Redis+Lua分布式限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 通过简单步骤实现SpringMVC文件上传

    通过简单步骤实现SpringMVC文件上传

    这篇文章主要介绍了通过简单步骤实现SpringMVC文件上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java实现Floyd算法

    java实现Floyd算法

    这篇文章主要为大家详细介绍了java实现Floyd算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • idea日志乱码和tomcat日志乱码问题的解决方法

    idea日志乱码和tomcat日志乱码问题的解决方法

    这篇文章主要介绍了idea日志乱码和tomcat日志乱码问题的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 深入了解java 8的函数式编程

    深入了解java 8的函数式编程

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。下面我们来详细了解一下吧
    2019-06-06
  • SpringBoot任意版本集成Swagger各种版本的操作指南

    SpringBoot任意版本集成Swagger各种版本的操作指南

    在学习Swagger生成API文档的时候经常会遇到问题,而目前市面上大部分技术分享者的SpringBoot版本并没和我们的同步,导致一些一模一样的代码,在我们的项目上却无法使用,这是一个经常性的问题,本文章就旨在和大家搞定SpringBoot任意版本集成Swagger各种版本
    2024-07-07
  • 从基础到实战详解SpringBoot获取资源文件全指南

    从基础到实战详解SpringBoot获取资源文件全指南

    在 SpringBoot 开发中,我们经常需要访问各类资源文件,本文将系统讲解 SpringBoot 中资源文件的存放规则,获取方法及实战技巧,需要的可以了解下
    2025-07-07
  • SpringBoot文件上传的几种常见方式(单文件上传、多文件上传)

    SpringBoot文件上传的几种常见方式(单文件上传、多文件上传)

    本文详解SpringBoot文件上传实现,涵盖单文件、多文件上传及大小类型限制方法,强调隐私保护与非法文件防范的社会责任,适配不同场景需求,提供技术解决方案与合规实践指导,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • IDEA进程已结束,退出代码-1073741819 (0xC0000005)的bug

    IDEA进程已结束,退出代码-1073741819 (0xC0000005)的bug

    这篇文章主要介绍了IDEA进程已结束,退出代码-1073741819 (0xC0000005)的bug,本文通过实例代码图文的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论