日积月累之SLF4J框架

it2025-06-26  5

SLF4J 引入

特点:

使用SLF4J框架,可以在部署时迁移到所需的日志记录框架。SLF4J提供了对所有流行的日志框架的绑定,例如log4j,JUL,Simple logging和NOP。因此可以 在部署时切换到任何这些流行的框架。无论使用哪种绑定,SLF4J都支持参数化日志记录消息。由于SLF4J将应用程序和日志记录框架分离, 因此可以轻松编写独立于日志记录框架的应用程序。而无需担心用于编写应用程序的日志记录框架。SLF4J提供了一个简单的Java工具,称为迁移器。使用此工具,可以迁移现有项目,这些项目使用日志 框架(如Jakarta Commons Logging(JCL)或log4j或Java.util.logging(JUL))到SLF4J。

一、简单的实现方式

1.引入maven依赖
<!--slf4j core 使用slf4j必須添加--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.27</version> </dependency> <!--slf4j 自带的简单日志实现 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency>
2.代码示例:
public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class); // 快速入门 @Test public void Slf4jDemo()throws Exception{ // 日志输出 LOGGER.error("error"); LOGGER.warn("wring"); LOGGER.info("info"); // 默认级别 LOGGER.debug("debug"); LOGGER.trace("trace"); String name = "半杯态"; Integer age = 14; LOGGER.info("用户:{},{}",name,age); }

二、引入其他的日志框架

使用slf4j的日志绑定流程:

添加slf4j-api的依赖

使用slf4j的API在项目中进行统一的日志记录

绑定具体的日志实现框架

绑定已经实现了slf4j的日志框架,直接添加对应依赖

绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖

slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)

2.1 使用logback日志框架

1.引入maven依赖
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.27</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>

使用示例不变

2.2 使用slf4j-log4j12日志框架

1.引入maven依赖

<!--绑定 log4j 日志实现,需要导入适配器--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.27</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.27</version> </dependency>

2.添加properties

# 日志打印到控制台 log4j.rootLogger = debug,console # 自定义log # log4j.logger.com.banbeitai = info,file #log4j.logger.org.apache = debug,console # 指定控制台日志输出的 appender log4j.appender.console = org.apache.log4j.ConsoleAppender # 指定消息格式 layout log4j.appender.console.layout = org.apache.log4j.PatternLayout # 指定消息格式的内容 log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n # 日志打印到文件 log4j.appender.file = org.apache.log4j.FileAppender # 指定消息格式 layout log4j.appender.file.layout = org.apache.log4j.PatternLayout # 指定消息格式的内容 log4j.appender.file.layout.conversionPattern= %d{yyyy-MM-dd HH:mm:ss} [%p] %l %m%n # 指定日志文件保存路径 log4j.appender.file.fileName=%d{yyyy-MM-dd HH:mm:ss} log4j.appender.file.file= G:/logs/log4j.log # 指定日志文件的字符集 log4j.appender.file.encoding = UTF-8 # 按文件的大小保存日志 log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender # 指定日志打印的格式 log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout # 指定消息格式的内容 log4j.appender.rollingFile.layout.conversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %l %m%n # 指定日志文件保存路径 log4j.appender.rollingFile.file= G:/logs/log4j.log # 指定日志文件的字符集 log4j.appender.rollingFile.encoding = UTF-8 # 指定日志文件内容的大小 log4j.appender.rollingFile.maxFileSize= 1MB # 指定日志文件的数量 log4j.appender.rollingFile.maxBackupIndex = 10 # 按照时间规则拆分的 appender 对象 log4j.appender.dateFile=org.apache.log4j.DailyRollingFileAppender # 指定消息格式 layout log4j.appender.dateFile.layout = org.apache.log4j.PatternLayout # 指定消息格式的内容 log4j.appender.dateFile.layout.conversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %l %m%n # 指定日志文件保存路径 log4j.appender.dateFile.file= G:/logs/log4j # 指定日志文件的字符集 log4j.appender.dateFile.encoding = UTF-8 # 指定日期拆分规则 log4j.appender.dateFile.datePattern = '-'yyyy-MM-dd-HH-mm-ss'.log' #mysql log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender log4j.appender.logDB.layout=org.apache.log4j.PatternLayout log4j.appender.logDB.Driver=com.mysql.jdbc.Driver log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/exam log4j.appender.logDB.User=root log4j.appender.logDB.Password=root log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) values('banbeitai','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

2.3 没有slf4j引入jul

1.引入依赖

<!--绑定 jul 日志实现,需要导入适配器--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.7.25</version> </dependency>

二、桥接旧的日志框架

桥接解决的是项目中日志的遗留问题,当系统中存在之前的日志API,可以通过桥接转换到slf4j的实现

先去除之前老的日志框架的依赖添加SLF4J提供的桥接组件为项目添加SLF4J的具体实现 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependency> <!--配置 log4j 的桥接器--> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.25</version> </dependency>

示例:

import org.apache.log4j.Logger; import org.junit.Test; public class Logback { public static final Logger logger = Logger.getLogger(Logback.class); @Test public void testQuick()throws Exception{ // 日志输出 logger.error("error"); logger.warn("wring"); logger.info("info"); // 默认级别 logger.debug("debug"); logger.trace("trace"); /* String name = "半杯态"; Integer age = 14; logger.info("用户:{},{}",name,age);*/ } }

通过上述代码可知,对日志框架升级,可以兼容老版本log4j日志框架。

注意问题:

jcl-over-slf4j.jar和 slf4j-jcl.jar不能同时部署。前一个jar文件将导致JCL将日志系统的选择委托给 SLF4J,后一个jar文件将导致SLF4J将日志系统的选择委托给JCL,从而导致无限循环 。log4j-over-slf4j.jar和slf4j-log4j12.jar不能同时出现所有的桥接都只对Logger日志记录器对象有效,如果程序中调用了内部的配置类或者是
最新回复(0)