当前位置: 首页 > news >正文

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的使用和比较含完整示例》

相关文章:

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

点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》 1. 前言 本文主要介绍了在 Spring Boot 框架中如何使用 Log4j 和 Slf4j&#xff0c;并通过对比分析它们的优缺点&#xff0c;帮助读者更好地选择合适的日志记录工具。文章中提供了完整的示例代码&#xff…...

我的世界Java版服务器如何搭建并实现与好友远程联机Minecarft教程

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…...

如何进行游戏服务器的负载均衡和扩展性设计?

​在进行游戏服务器的负载均衡和扩展性设计时&#xff0c;需要考虑多个方面&#xff0c;以确保服务器的稳定性和可扩展性。以下是一些关键的步骤和考虑因素&#xff1a; 负载均衡的需求分析 在进行负载均衡设计之前&#xff0c;需要深入了解游戏服务器的负载特性和需求。这包括…...

机器学习数学基础

机器学习基础 1、标量、向量、矩阵、张量2、概率函数、概率分布、概率密度、分布函数3、向量的线性相关性4、最大似然估计5、正态分布(高斯分布)6、向量的外积(叉积)7、向量的内积(点积)8、超平面(Hyperplane)9、广义线性模型(GLM)10、伯努利分布与二项分布11、凸函数…...

SpringBoot注解--04--01--注解@Mapper在IDEA中自动注入警告的解决方案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 问题原因 解决方案方法1&#xff1a;为 Autowired 注解设置required false方法2&#xff1a;用 Resource 替换 Autowired方法3&#xff1a;在Mapper接口上加上Repo…...

【Java八股面试系列】JVM-垃圾回收

目录 垃圾回收 堆空间的基本结构 内存分配和回收原则 分代收集机制 Minor GC 流程 空间分配担保 老年代 大对象直接进入老年代 长期存活的对象将进入老年代 GC的区域 对象存活判定算法 引用计数法 可达性分析算法 finalize() 字符串常量判活 类判活 垃圾回收算…...

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…...

初识C语言·编译与链接

1 翻译环境和运行环境 C语言标准ANSI C 实现C语言代码的时候 一般需要经过两种环境&#xff0c;一是翻译环境&#xff0c;二是运行环境&#xff0c;计算机能识别的是二进制的指令&#xff0c;人写完代码后通过翻译环境&#xff0c;使代码变成计算机能读懂的可执行的机器指令&a…...

堆与滑动窗口的结合(算法村第十六关黄金挑战)

滑动窗口最大值 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大…...

ES6-let

一、基本语法 ES6 中的 let 关键字用于声明变量&#xff0c;并且具有块级作用域。 - 语法&#xff1a;let 标识符;let 标识符初始值; - 规则&#xff1a;1.不能重复声明let不允许在相同作用域内重复声明同一个变量2.不存在变量提升在同一作用域内&#xff0c;必须先声明才能试…...

如何发布自己的npm包:

1.创建一个打包组件或者库&#xff1a; 安装weback&#xff1a; 打开项目&#xff1a; 创建webpack.config.js,创建src目录 打包好了后发现两个js文件都被压缩了&#xff0c;我们想开发使用未压缩&#xff0c;生产使用压缩文件。 erserPlugin&#xff1a;&#xff08;推荐使用…...

JavaSE——流程控制-跳转关键字(break、continue),小案例(随机数、猜数字)

目录 跳转关键字 小案例&#xff08;随机数&#xff09; Random 猜数字 跳转关键字 break&#xff1a;跳出并结束当前所在循环的执行。continue&#xff1a;用于跳出当前循环的当次执行&#xff0c;直接进入循环的下一次执行。 注意事项&#xff1a; break&#xff1a;只能…...

Java HashSet 重写 equals() 和 hashCode() 对象去重

Ailt Insert 选择 equals() 和 hashCode() package com.zhong.collection.set;import java.util.HashSet; import java.util.Objects;public class HashSetDeduplication {public static void main(String[] args) {// HashSet 对象去重HashSet<Student> students new …...

Mac电脑到手后的配置

一、Homebrew 1、Homebrew安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 桌面的Old_Homebrew文件夹&#xff0c;没有你需要的可以删除。 2、Homebrew卸载 /bin/zsh -c "$(curl -fsSL https://gitee.com/c…...

Python中的while循环,知其然知其所以然

文章目录 while循环结构1.用循环打印1 ~ 100步骤解析2. 1 ~ 100的累加和3.死循环1. 用死循环的方法实现 1 ~ 100累加和 4. 单向循环(1)打印 一行十个小星星*(2)通过打印一个变量的形式,展现一行十个小星星(3)一行十个换色的星星 ★☆★☆★☆★☆★☆(4)用一个循环,打印十行十列…...

云瞻无代码开发:连接并集成电商平台、营销系统和CRM

无缝集成优势 云瞻信息已在电商领域取得杰出成就&#xff0c;其亮点在于其高效的社群运营和传统导购业务。云瞻的SAAS开放平台&#xff0c;一个连接和集成各种应用的工具&#xff0c;简化了传统的API开发流程。这赋能商家&#xff0c;即使没有专业的技术知识&#xff0c;也能够…...

LeetCode-第2469题=温度转换

1.题目描述 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数组 ans …...

docer compose部署simple-docker

简介 一个看似简陋但是功能足够用的docker管理工具 安装 创建目录 mkdir -p /opt/simple-docker cd /opt/simple-docker 创建并启动容器 编写docker-compose.yml文件,内容如下 version: 3 services: redis: image: redis:latest restart: always web: image: registry.cn-…...

Android Studio中打开文件管理器

文章目录 一、前言二、操作步骤 一、前言 在Android Studio中有时候需要查看手机的文件目录或者复制文件&#xff0c;但是有时候文件管理器找不到在哪&#xff0c;这里记录该操作流程 二、操作步骤 第一步: 第二步: 第三步:...

算法42:天际线问题(力扣218题)---线段树

218. 天际线问题 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示&#xff0c;其中三元组 buildings[i] [lefti, righti, heig…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...