java:slf4j、log4j、log4j2、logback日志框架的区别与示例

文章目录

    • 背景
    • [SLF4J - 简单日志门面:](#SLF4J - 简单日志门面:)
    • [Log4j - 强大而古老的日志框架:](#Log4j - 强大而古老的日志框架:)
    • [Log4j2 - Log4j的升级版:](#Log4j2 - Log4j的升级版:)
    • [Logback - Log4j的继任者:](#Logback - Log4j的继任者:)
    • 比较
    • Springboot集成slf4j、log4j2
    • 参考

背景

在Java开发中,日志记录是一个不可或缺的组成部分。为了满足不同的需求,Java社区涌现出多个日志框架,其中包括SLF4J、Log4j、Log4j2和Logback。本文将比较这些框架,以及为什么在项目中选择使用它们。

SLF4J - 简单日志门面:

SLF4J 是一个为Java提供简单日志的门面。它并不是一个具体的日志实现,而是提供了一个通用的API,允许开发者选择底层的日志框架。下面是一个简单的SLF4J使用示例:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SLF4JExample {
    private static final Logger logger = LoggerFactory.getLogger(SLF4JExample.class);

    public static void main(String[] args) {
        logger.info("Hello, SLF4J!");
    }
}

slf4j不是一个真正意义的可用应用程序,他是一个接口层

就像java 的接口性质一样,单纯集成了slf4j 的话,执行比如log.info log.debug等方法,只能在控制台打印日志,并不会在持久化到文件,或者其他自定义介质上,slf4j至少需要一个实现层框架,比如log4j,logback等

Log4j - 强大而古老的日志框架:

Log4j 是Java社区中最早的日志框架之一,提供了丰富的功能,包括异步日志、插件支持等。下面是一个Log4j的使用示例:

java 复制代码
import org.apache.log4j.Logger;

public class Log4jExample {
    private static final Logger logger = Logger.getLogger(Log4jExample.class);

    public static void main(String[] args) {
        logger.info("Hello, Log4j!");
    }
}

Log4j2 - Log4j的升级版:

Log4j2 是 Log4j 的升级版,解决了 Log4j 1.x 存在的性能和线程安全问题。它引入了新的特性,如异步日志、插件体系结构等。以下是一个Log4j2的使用示例:

java 复制代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j2Example {
    private static final Logger logger = LogManager.getLogger(Log4j2Example.class);

    public static void main(String[] args) {
        logger.info("Hello, Log4j2!");
    }
}

Logback - Log4j的继任者:

Logback 是由 Log4j 的创始人开发的日志框架,旨在成为 Log4j 的继任者。它具有与 Log4j 相似的功能,并被认为是更现代和性能更好的选择。以下是一个Logback的使用示例:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackExample {
    private static final Logger logger = LoggerFactory.getLogger(LogbackExample.class);

    public static void main(String[] args) {
        logger.info("Hello, Logback!");
    }
}

比较

slf4j,log4j,log4j2,logback 时间线:log4j ->slf4j ->logback ->log4j2

  • SLF4J 是一个日志门面,它允许在不修改应用代码的情况下切换不同的日志实现。一般与具体的实现框架(如Logback或Log4j2)一起使用。

  • Log4j 是一个功能强大而古老的日志框架,提供了许多高级功能。然而,由于其1.x版本存在一些问题,现在更推荐使用 Log4j2。

  • Log4j2 是 Log4j 的升级版,解决了旧版本的一些问题,性能更好,并引入了新特性。在现代项目中,是一个不错的选择。

  • Logback 是由 Log4j 的创始人开发的日志框架,旨在成为 Log4j 的继任者。它具有较好的性能和一些新特性,是一个流行的选择。

在选择日志框架时,考虑项目需求、性能、易用性和社区支持等因素是很重要的。大多数现代Java应用程序选择使用 SLF4J 作为日志门面,结合 Logback 或 Log4j2 作为底层实现,以提供较好的性能和灵活性。

Springboot集成slf4j、log4j2

Spring Boot默认使用SLF4J作为日志门面,并且通过classpath中的依赖关系,Log4j2会被自动识别并成为默认的日志实现。下面是一个简单的示例:

1、添加依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2、创建Log4j2配置文件:

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

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

也可以不配置xml文件,使用 application.properties

shell 复制代码
logging.file.path=./logs
logging.level.root=info
logging.file.name=./logs/app.log

3、编写Spring Boot应用程序:

创建一个简单的Spring Boot应用程序,使用SLF4J进行日志记录。例如,创建一个HelloController:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

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

    @GetMapping("/hello")
    public String hello() {
        logger.info("你好啊,我是log4j");
        return "Hello, world!";
    }
}

可以看到命令行打印出来了

由于我们在 application.properties 配置了日志的路径,所以在这个路径下也保存了一份日志,你也可以将日志保存到数据库或者其他地方

参考

https://blog.csdn.net/madness1010/article/details/128332275

相关推荐
小bo波12 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
夜微凉412 小时前
三、Spring
java·后端·spring
橘右今13 小时前
2026 Java后端高频面试宝典
java·开发语言·面试
xyzzklk14 小时前
解决Salesforce无法向外发送邮件
android·java·开发语言·网络·crm·salesforce·客户关系管理
biubiubiu070614 小时前
SpringBoot关于外部化配置
java·spring boot·spring
Full Stack Developme14 小时前
Spring Bean 依赖注入
python·spring·log4j
zzz_236814 小时前
【Spring】面试突击系列(二):SpringBoot 入门与自动配置原理
java·spring boot·spring
Full Stack Developme14 小时前
Spring AOP 与 AspectJ
java·后端·spring
快乐的木子李14 小时前
最新版Maven免安装配置教程
java·maven
wuminyu15 小时前
Java锁机制之Java对象重量级锁源码剖析
java·linux·c语言·jvm·c++