slf4j和log4j的区别与使用

server/2025/3/11 5:33:29/

slf4j和log4j的区别与使用

文章目录
    • 1.简介
    • 2.使用教程
    • 3.常见报错解决(持续更新)

1.简介

官网:https://www.slf4j.org/manual.html
(1)简单日记门面(simple logging Facade for Java)SLF4J是为各种loging APIs提供一个简单统一的接口。

(2)slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade。

(3)在部署时,选择不同的日志系统包,即可自动转换到不同的日志系统上。
如:选择JDK自带的日志系统,则只需要将slf4j-api-XXX.jar和slf4j-jdkXXX.jar放置到classpath中即可,若想换成log4j的日志系统,仅需要用slf4j-log4jXXx.jar替换slf4j-jdkXXX.jar即可

(4)slf4j和log4j比较:
log4j看成是一个完整的日志库;而slf4j是一个日志库的规范接口,可以根据不同的日志包使用不同的日志库。
②日志中需要传入参数时,log4j一般是使用字符串进行拼接的方式;
slf4j使用占位符,比字符串拼接更加高效。如logger.error("sql为 {} ",sql)。

(5)slf4j日志级别
Slf4j日志级别,级别由低到高,设置的级别约低,打印的日志越多
①trace: 一般不会使用,在日志里边也不会打印出来,最低的一个日志级别。
②debug: 一般放于程序的某个关键点的地方,用于打印一个变量值或者一个方法返回的信息之类的信息
③info 一般处理业务逻辑的时候使用,就跟 system.err打印一样,用于说明此处是干什么的。
④warn:警告,不会影响程序的运行,但是值得注意。
⑤error: 用户程序报错,必须解决的时候使用此级别打印日志。

2.使用教程

官网上最新稳定版是1.7.32,前阵子log4j出重大漏洞了,这里我们配合logback(log4j的改良版,性能更好)使用。
(1)在pom.xml引入依赖

  <!--slf4j依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version></dependency><!-- logback 依赖 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency>

(2)在springBoot项目中添加一段controller代码

package com.example.springb_web.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class VisualController {private Logger logger = LoggerFactory.getLogger(VisualController.class);@RequestMapping(value="/test")@ResponseBodypublic String test(){String msg = "fucking good";logger.info("slf4j print info msg:{}",msg);logger.debug("slf4j print debug msg:{}",msg);return msg;}}

这里通过http://localhost:8080/test访问可以看到控制台输出如下,可以看到info的输出了,debug没有,因为springboot内部集成了slf4j,默认是info级别:
在这里插入图片描述

(3)只在控制台打印,application.yml文件配置如下:

# slf4j日志配置
logging:# 配置级别level:root: info#分包配置级别,即不同的目录下可以使用不同的级别com.example.springb_web.controller: debug

改完之后发现输出如下:
在这里插入图片描述
(4)把日志输出到文件,application.yml配置:

# slf4j日志配置
logging:config: classpath:logback.xml

在resource下新建logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--info日志文件--><appender name="INFO_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><!--日志文件相对路径和名称--><file>./apilogs/info/xxxx_-${HOSTNAME}.log</file><append>true</append><!--根据日志文件的大小来滚动(即创建新的)日志文件--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>./apilogs/info/archive/xxxx_-${HOSTNAME}-%d.%i.log</fileNamePattern><!--只保留最近30天的日志--><maxHistory>30</maxHistory><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--超过10MB便会滚动日志文件--><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 配置日志的输出格式 --><encoder><pattern>%date %level [%thread] %logger{10} %msg%n</pattern><charset>UTF-8</charset></encoder></appender><!--异步处理--><appender name="ASYNC_INFO_FILE" class="ch.qos.logback.classic.AsyncAppender"><queueSize>512</queueSize><appender-ref ref="INFO_FILE" /></appender><!--debug日志文件--><appender name="DEBUG_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><!--日志文件相对路径和名称--><file>./apilogs/debug/xxxx_-${HOSTNAME}.log</file><append>true</append><!--根据日志文件的大小来滚动(即创建新的)日志文件--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>./apilogs/debug/archive/xxxx_-${HOSTNAME}-%d.%i.log</fileNamePattern><!--只保留最近30天的日志--><maxHistory>30</maxHistory><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--超过10MB便会滚动日志文件--><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!-- 配置日志的输出格式 --><encoder><pattern>%date %level [%thread] %logger{10} %msg%n</pattern><charset>UTF-8</charset></encoder></appender><!--异步处理--><appender name="ASYNC_DEBUG_FILE" class="ch.qos.logback.classic.AsyncAppender"><queueSize>512</queueSize><appender-ref ref="DEBUG_FILE" /></appender><!--控制台输出--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><!--输出格式--><pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern><charset>UTF-8</charset></encoder></appender><!--异步处理--><appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender"><queueSize>512</queueSize><appender-ref ref="STDOUT" /></appender><!--在info级别下,将包名所在org.springframework的日志全部打印到控制台--><!--additivity被设置为'false',这意味着日志事件不会传递给父级记录器--><logger name="org.springframework" level="info" additivity="false"><appender-ref ref="ASYNC-STDOUT" /></logger><!--在debug级别下,会打印记录sql的相关日志,将包名为org.apache.ibatis下的日志输出到debug日志文件--><logger name="org.apache.ibatis" level="debug" additivity="false"><appender-ref ref="ASYNC_DEBUG_FILE" /></logger><!--所有业务相关的info日志,打印到控制台,并输出到info日志文件--><root level="info"><appender-ref ref="ASYNC-STDOUT" /><appender-ref ref="ASYNC_INFO_FILE" /></root>
</configuration>

可以看到控制台和日志文件都成功输出了:

在这里插入图片描述

3.常见报错解决(持续更新)

(1)yml配置报错如:
“Failed to bind properties under ‘logging.level’”
可能跟版本有关,参考yml配置上面的使用教程的第(3)步

(2)启动时报错:
“class path contains multiple slf4j bindings
found binding in …”
不要忽视这种警告,若有多个jar包类冲突,需要把加载jar包顺序调整,正确的那个,比如slf4j-log4j12jar包放在最上面。


http://www.ppmy.cn/server/174106.html

相关文章

repo访问gerrit.googlesource失败

编译openharmony的时候&#xff0c;repo阶段碰到一个问题&#xff0c;建议不要通过 apt install安装&#xff0c;里面的源来自google curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/repo chmod 755 ~/repo 执行类似这样的操作 repo init -u gitgitee.com:…

【清华大学】实用DeepSeek赋能家庭教育 56页PDF文档完整版

清华大学-56页&#xff1a;实用DeepSeek赋能家庭教育.pdf https://pan.baidu.com/s/1BUweVDeG2M8-t0QaIs3LHQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/8a9473493bb0 《实用DeepSeek赋能家庭教育》基于清华大学研究成果&#xff0c;系统阐述了DeepSeek人工智能技…

第八章:未来展望 - 第一节 - Tailwind CSS 新特性解析

本节将详细介绍 Tailwind CSS 的最新特性及其实际应用&#xff0c;帮助开发者更好地利用这些新功能。 容器查询&#xff08;Container Queries&#xff09; 基础配置 // tailwind.config.js module.exports {theme: {extend: {containers: {sm: 320px,md: 768px,lg: 1024px…

使用 Java 执行 SQL 语句和存储过程

使用 Java 执行 SQL 语句和存储过程&#xff0c;通常有两种主要的方式&#xff1a;使用 JDBC&#xff08;Java Database Connectivity&#xff09;或者通过框架如 Spring Data JPA、MyBatis 等。 1. 使用 JDBC 执行 SQL 语句 JDBC 是 Java 操作数据库的标准 API。以下是通过 …

雷池WAF的为什么选择基于Docker

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点&#xff1a; 容器&#xff1a;Docker 使用容器来封装应用程序及其依赖项&#xff0c;使其能够在任何环境中都能…

clickhouse修改和删除数据

标题&#xff1a;ClickHouse中修改和删除数据的简易指南 在大数据时代&#xff0c;数据库技术的发展日新月异。作为一款专为实时分析设计的列式数据库管理系统&#xff0c;ClickHouse因其高效的查询性能而受到欢迎。照这么推测的话&#xff0c;对于那些习惯于传统SQL操作&…

Collections.addAll与List实例对象addAll方法的比较

Collections.addAll() 和 List.addAll() 都是用于将多个元素添加到集合中的方法&#xff0c;但它们在实现和使用上有一些区别。以下是它们的详细对比&#xff1a; 1. Collections.addAll() Collections.addAll() 是 java.util.Collections 类中的一个静态方法&#xff0c;用于…

【GPT入门】第9课 思维树概念与原理

【GPT入门】第9课 思维树概念与原理 1.思维树概念与原理2. 算24游戏的方法 1.思维树概念与原理 思维树&#xff08;Tree of Thought&#xff0c;ToT &#xff09;是一种大模型推理框架&#xff0c;旨在解决更加复杂的多步骤推理任务&#xff0c;让大模型能够探索多种可能的解决…