关系简介

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依赖包。

原文地址