关系简介
1.slf4j:
slf4j是一个日志接口(或称为门面/抽象层),它本身并不实现日志功能,而是为各种日志框架(如log4j、logback等)提供了一套统一的接口。
使用slf4j的好处是,开发者可以在代码中只使用slf4j的接口,然后在运行时或部署时根据实际需要选择具体的日志实现框架。这增加了代码的灵活性和可移植性。
slf4j与具体的日志实现框架(如log4j、logback)之间通过桥接器(binding)进行连接。
2.log4j:
log4j是Apache的一个早期日志框架,它允许开发者通过配置文件灵活地控制日志的输出目标、记录级别、输出格式等。
随着时间的推移,log4j已经逐渐被其后续版本log4j2所取代。
3.logback:
logback是log4j的创始人Ceki Gülcü开发的一个新的日志框架,它被视为log4j的继任者。
logback在性能、内存使用和灵活性方面都优于log4j,并且它直接实现了slf4j的接口,因此可以作为slf4j的一个具体实现。
logback本身包含了一套完整的日志解决方案,无需依赖其他库。
4.log4j2:
log4j2是log4j的后续版本,它在性能、功能、灵活性和易用性方面都有了很大的提升。
log4j2支持异步日志记录,可以极大地提高多线程环境下的日志性能。
log4j2也支持通过配置文件进行灵活的配置,包括日志的输出目标、记录级别、输出格式等。
log4j2也提供了对slf4j的桥接支持,因此可以作为slf4j的一个具体实现。
总结:
①.slf4j是一个日志接口,它定义了日志记录的规范,但不具体实现日志功能。
②.log4j是一个早期的日志框架,但已经逐渐被其后续版本log4j2所取代。
③.logback是一个新的日志框架,它直接实现了slf4j的接口,并提供了高性能、灵活的日志记录功能。
④.log4j2是log4j的后续版本,它在性能、功能和易用性方面都有很大的提升,并支持作为slf4j的一个具体实现。
依赖关系:
1.slf4j + log4j:
需要使用slf4j和log4j来进行日志输出的话,我们需要引入下面的jar包
slf4j-api.jar:slf4j核心jar包
log4j.jar:log4j核心jar包
slf4j-log412.jar:slf4j与log4j的桥接包
2.slf4j + logback:
需要使用slf4j和logback来进行日志输出的话,我们需要引入下面的 jar包
slf4j-api.jar: slf4j核心jar包
logback-core.jar:logback直接实现了 slf4j-api 逻辑,不再需要桥接包
logback-classic.jar(集成包)
3.slf4j + jul:
需要使用slf4j和jul来进行日志输出的话,我们需要引入下面的 jar 包
slf4j-api.jar: slf4j核心jar包
slf4j-jdk14.jar:桥接包
4.也可以只用slf4j无日志实现:
slf4j-api.jar + slf4j-nop.jar
官方图中没有log4j2依赖jar的关系
5.slf4j + log4j2:
需要使用 slf4j 和 log4j2 来进行日志输出的话,我们需要引入下面的 jar 包:
log4j2核心jar包:log4j-api.jar 和 log4j-core.jar
slf4j核心jar包:slf4j-api.jar
slf4j与log4j2的桥接包:log4j-slf4j-impl-2.8.2.jar
代码实战
项目中应用springboot集成log4j2
SpringBoot默认使用的日志系统为:SLF4j + Logback。
现在需要替换成SLF4j + Log4j2
1.去除SpringBoot中默认的Logback包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
添加需要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
配置文件中增加需要的配置
logging:
config: classpath:log4j2-spring.xml
新增log4j2-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别以及优先级排序:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- Configuration的status属性用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出 -->
<!-- Configuration的monitorInterval属性用于设置log4j2自动检测配置文件的执行间隔,当检测到有更新时会重新加载配置,单位为秒 -->
<Configuration status="debug" monitorInterval="60">
<Appenders>
<!-- 这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 输出日志的格式 -->
<PatternLayout pattern="[%d] %-5p (%F:%L#%M) : %m%n"/>
</Console>
<!-- 输出所有的debug及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileDebug" fileName="${sys:user.home}/logs/netmeeting-debug.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/netmeeting-debug-%d{yyyy-MM-dd}-%i.log">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] [%l] - %m%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了5 -->
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<!-- 输出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileSystem" fileName="${sys:user.home}/logs/netmeeting-system.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/netmeeting-system-%d{yyyy-MM-dd}-%i.log">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] [%l] - %m%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了5 -->
<DefaultRolloverStrategy max="5"/>
</RollingFile>
</Appenders>
<Loggers>
<!--添加打印sql和结果集的log-->
<Logger name="druid.sql.Statement" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFileDebug"/>
<AppenderRef ref="RollingFileSystem"/>
</Logger>
<Logger name="com.avicnet.dynamic.datasource" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFileDebug"/>
<AppenderRef ref="RollingFileSystem"/>
</Logger>
<Logger name="com.avicnet.meeting" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFileDebug"/>
<AppenderRef ref="RollingFileSystem"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFileDebug"/>
<AppenderRef ref="RollingFileSystem"/>
</Root>
</Loggers>
</Configuration>
在类中打印日志
private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class);
LOGGER.info("参数={}", JSONUtil.toJsonStr(resp))
当然也可以使用@Slf4j和@Log4j2注解形式,但是需要引入lombok依赖包。