SpringBoot日志插件log4J和slf4J的使用和比较含完整示例

点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》

1. 前言

本文主要介绍了在 Spring Boot 框架中如何使用 Log4j 和 Slf4j,并通过对比分析它们的优缺点,帮助读者更好地选择合适的日志记录工具。文章中提供了完整的示例代码,并附有详细的注释说明。

2. Log4j的使用

Log4j 是一个流行的 Java 日志记录框架,为 Spring Boot 提供了强大的日志管理功能。下面是如何在 Spring Boot 项目中集成 Log4j 的基本步骤:

2.1 添加依赖

pom.xml 文件中添加 Log4j 相关依赖:

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

2.2 配置 Log4j

src/main/resources 目录下创建一个名为 log4j2.xml 的配置文件,配置 Log4j 的日志级别、输出格式和输出目的地等。例如:

<?xml version="1.0" encoding="UTF-8"?>  
<Configuration status="WARN">  <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>  <Logger name="com.example.demo" level="debug" additivity="false">  <AppenderRef ref="Console"/>  </Logger>  <Logger name="org.springframework" level="error">  <AppenderRef ref="Console"/>  </Logger>  </Loggers>  
</Configuration>

在上述配置中,我们定义了一个Console Appender,它将日志输出到控制台。PatternLayout定义了日志输出的格式。

Loggers部分,我们定义了不同级别的日志行为:

  1. 根记录器(Root Logger)设置为INFO级别,这意味着所有INFO级别及以上的日志都会被记录。它引用了一个名为"Console"的Appender,这意味着这些日志将输出到控制台。
  2. com.example.demo记录器设置为DEBUG级别。这意味着该包下的所有DEBUG级别及以上的日志都会被记录。注意,由于根记录器的级别是INFO,因此该记录器下的INFO和WARN级别的日志将不会被记录。
  3. org.springframework记录器设置为ERROR级别。这意味着该包下的所有ERROR级别及以上的日志都会被记录。同样地,由于根记录器的级别是INFO,因此该记录器下的INFO、DEBUG和WARN级别的日志将不会被记录。

你可以根据需要调整这些配置,以满足你的日志需求。

2.3 在代码中使用Log4j

在 Java 类中通过 @Autowired 注入 Logger 实例,然后使用 Logger 记录日志。例如:

import org.apache.logging.log4j.LogManager;  
import org.apache.logging.log4j.Logger;  public class MyLog4jExample {  private static final Logger logger = LogManager.getLogger(MyLog4jExample.class);  public static void main(String[] args) {  logger.info("This is an info message.");  logger.debug("This is a debug message.");  logger.warn("This is a warning message.");  logger.error("This is an error message.");  }  
}

在这个示例中,我们首先导入了 Log4j 的 LogManagerLogger 类。然后,在 MyLog4jExample 类中,我们创建了一个静态的 Logger 实例。通过调用 LogManager.getLogger() 方法,我们获取了一个与当前类关联的 Logger 实例。

main 方法中,我们使用 Logger 的不同方法记录了不同级别的日志消息。info() 用于记录信息消息,debug() 用于记录调试消息,warn() 用于记录警告消息,error() 用于记录错误消息。

要运行这个示例,只需将代码保存为 MyLog4jExample.java 并编译运行即可。请确保已正确配置 Log4j 的相关依赖和配置文件,以便在运行时捕获和处理日志消息。

3. Slf4J的使用

Slf4j 是一个简单日志门面(Simple Logging Facade for Java),它为各种日志框架提供了统一的接口。在 Spring Boot 中使用 Slf4j 的步骤与 Log4j 类似。

3.1 添加依赖

pom.xml 文件中添加 Slf4j 相关依赖:

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-logging</artifactId>  
</dependency>  
<dependency>  <groupId>org.slf4j</groupId>  <artifactId>slf4j-api</artifactId>  <version>1.7.30</version> <!-- 使用适当的版本 -->  
</dependency>

3.2 配置 Slf4j

创建一个名为 logback-spring.xml 的配置文件(如果使用 Logback 作为实现的话),配置日志级别、输出格式和输出目的地等。例如:

<?xml version="1.0" encoding="UTF-8"?>  
<configuration>  <include resource="org/springframework/boot/logging/logback/defaults.xml"/>  <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>  <root level="INFO">  <appender-ref ref="FILE" />  </root>  <logger name="com.example.myapp" level="DEBUG" additivity="false">  <appender-ref ref="FILE" />  </logger>  <logger name="org.springframework" level="WARN" additivity="false">  <appender-ref ref="FILE" />  </logger>  <logger name="org.springframework.web" level="ERROR" additivity="false">  <appender-ref ref="FILE" />  </logger>  
</configuration>

在这个配置中:

  • <root level="INFO"> 设置了根日志记录器的级别为 INFO。这意味着所有级别为 INFO 及以上的日志消息都将被记录。
  • <logger name="com.example.myapp" level="DEBUG" additivity="false"> 配置了名为 com.example.myapp 的日志记录器的级别为 DEBUG。这意味着该记录器将记录 DEBUG 及以上级别的日志消息。additivity="false" 表示该记录器的日志消息不会传递给其父记录器。
  • <logger name="org.springframework" level="WARN" additivity="false"> 配置了名为 org.springframework 的日志记录器的级别为 WARN。这意味着该记录器将记录 WARN 及以上级别的日志消息。
  • <logger name="org.springframework.web" level="ERROR" additivity="false"> 配置了名为 org.springframework.web 的日志记录器的级别为 ERROR。这意味着该记录器将记录 ERROR 及以上级别的日志消息。

你可以根据需要添加更多的 <logger> 元素来配置特定包的日志级别。通过这种方式,你可以灵活地控制不同包的日志输出级别,以满足你的需求。

将此配置文件放置在 src/main/resources 目录下。如果是其他实现(如 Log4j),则应相应地调整配置文件名和路径。

3.3 在代码中使用Slf4j

import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  public class MySlf4jExample {  private static final Logger logger = LoggerFactory.getLogger(MySlf4jExample.class);  public static void main(String[] args) {  logger.info("This is an info message.");  logger.debug("This is a debug message.");  logger.warn("This is a warning message.");  logger.error("This is an error message.");  }  
}

在这个示例中,我们首先导入了 LoggerLoggerFactory 类。然后,在 MySlf4jExample 类中,我们创建了一个静态的 Logger 实例。通过调用 LoggerFactory.getLogger() 方法,我们获取了一个与当前类关联的 Logger 实例。

main 方法中,我们使用 Logger 的不同方法记录了不同级别的日志消息。info() 用于记录信息消息,debug() 用于记录调试消息,warn() 用于记录警告消息,error() 用于记录错误消息。

要运行这个示例,只需将代码保存为 MySlf4jExample.java 并编译运行即可。请确保已正确配置 Slf4j 的实现(如 Logback 或 Log4j),以便在运行时捕获和处理日志消息。

4. Log4j 和 Slf4j 的优缺点比较

  1. 功能与灵活性

    • Log4j: 提供了一套完整的日志解决方案,包括强大的配置、多种输出目的地、灵活的日志级别管理等。
    • Slf4j: 作为门面模式,为多种日志框架提供了统一的接口,允许开发者根据需要选择具体的日志实现。
  2. 性能与资源占用

    • Log4j: 在性能和资源占用方面相对较高,尤其是在大量日志记录时。
    • Slf4j: 由于其抽象层,性能和资源占用相对较低。
  3. 社区与支持

    • Log4j: 有庞大的社区支持和广泛的使用,遇到问题时更容易找到解决方案。
    • Slf4j: 同样有强大的社区支持,但由于其通用性,具体的实现(如 Logback、Log4j)可能不如 Log4j 社区那么活跃。
  4. 集成与兼容性

    • Log4j: 通常与 Java 企业应用集成得更好,尤其是一些老旧的系统。
    • Slf4j: 在现代的微服务和云原生应用中更为流行,因为它提供了更好的可插拔性。
  5. 易用性

    • Log4j: 提供了完整的解决方案,无需额外选择日志实现,但配置可能相对复杂。
    • Slf4j: 需要选择一个具体的日志实现,但配置相对简单,尤其是使用默认配置时。
  6. 扩展性与定制性

    • Log4j: 由于其强大的功能集,提供了更多的定制选项和扩展点。
    • Slf4j: 由于其抽象性,定制和扩展可能不如 Log4j 直接。
  7. 依赖与版本问题

    • Log4j: 可能与其他库存在版本冲突,尤其是当使用较旧的版本时。
    • Slf4j: 由于其抽象性,通常较少与其他库产生版本冲突。
  8. 文档与教程

    • Log4j: 有大量的文档和教程可供参考。
    • Slf4j: 同样有丰富的文档和教程,但可能不如 Log4j 那么集中。
  9. 费用考虑

    • Log4j: 通常需要购买商业许可,尤其是对于企业级应用。

    • Slf4j: 完全免费,没有商业限制。

  10. 移动性与现代化

    • Log4j: 由于其历史悠久,可能在一些现代应用场景中显得过时或不够灵活。

    • Slf4j: 由于其灵活性和可插拔性,更适合现代的微服务和云原生应用。

5. 总结

Log4j 和 Slf4j 都是广泛使用的 Java 日志框架,各有其优缺点。在选择时,建议根据项目的具体需求和场景来权衡。如果需要一个完整的日志解决方案并且对性能和资源占用不太敏感,Log4j 可能是一个不错的选择。如果更倾向于灵活性、可插拔性和现代应用集成,Slf4j 可能更为合适。无论选择哪个框架,都应确保正确配置并遵循最佳实践来获得最佳的日志记录效果。

点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data Envers 数据审计实战

随着各行各业信息化发展&#xff0c;决策者们越来越意识到数据版本追踪的重要性&#xff0c;尤其是上市公司&#xff0c;数据对于他们尤为重要。考虑到研发成本&#xff0c;对重要表单数据支持页面级的修改历史查看、对所有业务数据支持DB级的版本查看是一个不错的选择。 对于…

有奖调查 | @所有人,MatrixOne 有一份问卷邀您填写~

MO社区系统调查问卷 活动时间&#xff1a;即日起至2月17日 前言 PREFACE 在“信创”国产化操作系统的号召下&#xff0c;随着 CentOS 7 的维护周期接近尾声&#xff0c;社区很多小伙伴都在积极调研新的操作系统进行测试和更换。为最大程度的保障 MatrixOne 在社区使用场景下…

设计模式学习笔记(一):基本概念;UML

文章目录 参考面向对象的设计原则创建型模式结构型模式行为型模式 UML视图图&#xff08;Diagram&#xff09;模型元素(Model Element)通用机制类之间的关系关联关系复杂&#xff01;&#xff01;聚合关系组合关系 依赖关系泛化关系接口与实现关系 参考 https://github.com/fa…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

c#cad 创建-圆(二)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是一个AutoCAD插件&#xff0c;用于在模型空间中创建一个圆形。 首先&#xff0c;我们需要定义一个命令类CreateCircleCommand&#xff0c;并在命名空间CreateCircleInCad中声明。 在CreateCircleCommand类中&a…

h5页面内嵌到app,解决ios无法使用左右侧滑返回上一页

背景&#xff1a;vuevant组合开发的h5页面&#xff0c;嵌入多个app,其中安卓手机都可实现侧滑返回上一页&#xff0c;而苹果端不行&#xff0c;app本身不展示title顶部的返回箭头。 解决办法&#xff1a;判断机型&#xff0c;处理ios端监听左右滑动事件&#xff0c;结合transit…

Java中的深拷贝和浅拷贝

在 Java 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是两种不同的对象复制方式&#xff0c;它们在处理对象复制时的行为有所不同。 一、定义 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对象…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

flutter使用webview_flutter在安卓和ios上打开网页

webview_flutter仓库地址&#xff1a;webview_flutter | Flutter package github地址&#xff1a;https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter 要打开非https协议的网页&#xff0c;需要在安卓平台上添加权限&#xff1a;andro…

C++ [NOIP2007 提高组] 矩阵取数游戏

有一个n行m列的矩阵&#xff0c;每个格子中有一个正整数。现在要从左上角的格子(1, 1)出发&#xff0c;每次只能向下或向右走一格&#xff0c;最后到达右下角的格子(n, m)。在走过的格子中取数&#xff0c;求取得的数的和的最大值。 输入&#xff1a; 第一行包含两个整数n和m&a…

若依整合mybatis-plus

文章目录 1.注释掉原本的MybatisConfig2. 将mybatis的配置文件改为mybatis-plus文件 ##前言 出先下列异常&#xff1a; 请求地址’/prod-api/user’,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ruoyi.web.mapper.Us…

HP数组面试题

PHP数组面试题 问题&#xff1a; 如何创建一个空数组和一个带有初始值的数组&#xff1f; 答案&#xff1a; 创建空数组&#xff1a;可以使用array()函数或空数组语法[]来创建一个空数组&#xff0c;例如$arr array();或$arr [];。创建带有初始值的数组&#xff1a;可以在创建…

C# BackgroundWorker的使用

C# 中的 BackgroundWorker 类是 .NET Framework 提供的一个组件&#xff0c;用于在后台线程上异步执行长时间运行的操作&#xff0c;同时保持与用户界面&#xff08;UI&#xff09;的交互&#xff0c;如更新进度信息或处理取消请求。这使得可以轻松地在不冻结UI的情况下执行耗时…

003集—三调数据库添加三大类字段——arcgis

在国土管理日常统计工作中经常需要用到三大类数据&#xff08;农用地、建设用地、未利用地&#xff09;&#xff0c;而三调数据库中无三大类字段&#xff0c;因此需要手工录入三大类字段&#xff0c;并根据二级地类代码录入相关三大类名称。本代码可一键录入海量三大类名称统计…

什么是Java中的垃圾回收器,你能解释一下不同种类的垃圾回收算法吗?

什么是Java中的垃圾回收器&#xff0c;你能解释一下不同种类的垃圾回收算法吗&#xff1f; 在Java中&#xff0c;垃圾回收器是一种负责自动管理内存的机制&#xff0c;它负责检测和回收不再使用的对象&#xff0c;释放它们占用的内存空间。垃圾回收器的存在大大简化了程序员对…

数字图像处理(实践篇)四十五 OpenCV-Python 使用ORB算法(包括算法概述)检测图像上的特征点

目录 一 ORB算法 二 涉及的函数 三 实践 ORB: An efficient alternative to SIFT or SURF SIFT 和 SURF 已获得专利,使用需要付费。但是ORB并不需要。ORB 最重要的一点是它来自“

学习总结13

# 最大正方形 ## 题目描述 在一个 n* m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 ## 输入格式 输入文件第一行为两个整数 n,m(1< n,m< 100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0…

【日常总结】SourceTree 1.5.2.0 更换用户名称和密码

一、场景 二、问题 三、解决方案 > 方案一&#xff1a;删除缓存文件 > 方案二&#xff1a;更新最新版本&#xff0c;可以直接修改密码&#xff08;推荐&#xff09; 方案一&#xff1a;删除缓存文件 Stage 1&#xff1a;设置显示隐藏文件 Stage 2&#xff1a;打开…

SouthernBiotech重组单克隆二抗

您是否在二抗的使用中遇到以下情况&#xff1a; 亲和力低&#xff0c;非特异性强&#xff1f; 稳定性差&#xff0c;批间差异大&#xff1f; SouthernBiotech(欣博盛生物)新推出重组单克隆二抗可避免出现以上问题&#xff01; 虽然传统多克隆二抗在实验中扮演很重要的角色&a…