slf4j日志框架和logback详解

slf4j作用及其实现原理

SLF4J(Simple Logging Facade for Java)是一种日志框架的抽象层,它并不是一个具体的日志实现,而是一个接口或门面(Facade),旨在为各种不同的日志框架提供一个统一的API。以下是SLF4J的作用及其实现原理的详细说明:

SLF4J的作用

统一的日志API:

SLF4J提供了一套通用的API,允许开发人员在代码中使用相同的日志记录方法,无论底层的日志实现是什么。

这样做可以提高代码的可移植性和可维护性,因为更换日志框架只需要改变依赖关系,而不需要修改代码中的日志调用。

避免绑定特定日志框架:

开发人员不必在代码中直接引用特定的日志框架(如Log4j, Logback等),而是通过SLF4J的接口进行日志操作。

这种解耦使得在项目中切换日志框架变得更加容易,减少了依赖锁定的问题。

性能优化:

SLF4J设计时考虑到了性能因素,例如,它提供了条件日志记录功能,只有当日志级别被启用时,才会执行字符串拼接等昂贵的操作。

实现原理

桥接机制:

SLF4J使用桥接器(Bridge)机制将日志调用转发给具体的日志框架实现。

当你引入SLF4J后,还需要添加一个桥接器库,例如slf4j-log4j12或slf4j-logback,这取决于你想要使用的具体日志框架。

静态绑定:

SLF4J通过静态绑定(Static Binding)来决定使用哪个具体的日志框架实现。这意味着在编译时,SLF4J会检查类路径上的可用实现,并选择其中一个。

如果没有找到任何实现,SLF4J会退回到一个简单的实现slf4j-simple,这通常只用于开发和测试环境。

动态绑定:

尽管SLF4J主要使用静态绑定,但在某些情况下,它也支持动态绑定,即在运行时更改日志框架的实现。不过,这通常不推荐,因为它可能会导致不可预测的行为。

日志级别:

SLF4J支持多种日志级别,包括TRACE, DEBUG, INFO, WARN, ERROR,并且可以通过配置文件或编程方式设置每个类或包的日志级别。

通过上述机制,SLF4J能够作为一个轻量级的门面,为Java应用程序提供灵活、高效和统一的日志记录功能。

参考:

https://www.cnblogs.com/xrq730/p/8619156.html

logback详解

Logback 是一个高性能的日志框架,专为 Java 平台设计,由 Ceki Gülcü 创建,他是 Log4j 的作者之一。**Logback 作为 Log4j 的继承者,不仅在性能上有所提升,还提供了更强大的配置能力和更好的模块化设计。**下面是 Logback 的详细解析:

Logback 的组成部分

Logback 被分为三个模块:

**logback-core:**这是 Logback 的核心模块,包含了所有基本的日志处理逻辑,如日志事件、日志上下文和日志状态。

**logback-classic:**构建在 logback-core 上,实现了 SLF4J 的 API,因此可以作为 SLF4J 的后端。同时,它也兼容 Log4j 的 API,为从 Log4j 迁移的应用提供了便利。

**logback-access:**这是一个可选模块,用于集成 Servlet 容器,可以捕获 HTTP 请求和响应信息,并将其记录到日志中。

Logback 的组件:

Logback 的配置文件(通常是 XML 格式)由以下几种主要组件构成:

**Appender:**日志消息的目标,可以是控制台、文件、数据库、网络等。常见的 Appender 包括 ConsoleAppender、FileAppender、RollingFileAppender 等。

**Layout:**定义日志消息的格式。Logback 提供了多种 Layout,如 PatternLayout、XMLLayout 等。

**Encoder:**在 Logback 1.1 版本之后,Layout 被 Encoder 替代,用于控制日志消息的格式化。PatternLayoutEncoder 是最常用的 Encoder。

**Logger:**代表一个日志类别,通常与类名或包名对应。每个 Logger 都有一个日志级别,如 TRACE、DEBUG、INFO、WARN、ERROR 等。

**Root Logger:**是所有 Logger 的父类,如果没有为特定的 Logger 设置日志级别,则会继承 Root Logger 的日志级别。

**Filter:**用于控制哪些日志事件应该被处理。Filter 可以基于日志级别、日志消息内容等条件过滤日志。

配置示例

见下文配置

性能优化

Logback 在设计时特别关注性能,通过优化日志事件的处理流程和减少对象创建等方式,提高了日志记录的速度。此外,Logback 还支持异步日志记录,进一步提升了高并发场景下的性能表现。

参考:Java日志框架:logback详解 - 五月的仓颉 - 博客园 (cnblogs.com)

SpringBoot配置SLF4J日志全过程

在 Spring Boot 中配置 SLF4J (Simple Logging Facade for Java) 日志的过程通常包括以下几个步骤:

1. 添加依赖

确保你的项目中有 SLF4J 和 Logback 的依赖。Spring Boot 默认会包含这些依赖,但如果你使用的是自定义的配置或者老版本的 Spring Boot,你可能需要在 Maven 或 Gradle 的构建文件中手动添加它们。

Maven 示例:

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

2. 配置日志级别和输出

Spring Boot 使用 Logback 作为 SLF4J 的默认实现,并且会在类路径下查找 logback.xml 或者 application.properties 文件来配置日志。

使用 logback.xml

创建一个名为 logback.xml 的文件在 src/main/resources 目录下,然后在其中配置日志输出和日志级别。

示例配置:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
	<property name="log.path" value="/Logger/logs" />
    <!-- 日志输出格式 -->
	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

	<!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>

	<!-- 系统日志输出 -->
	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
	</appender>

    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-debug.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>DEBUG</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
			<!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
			<!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

	<!-- 用户访问日志输出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

	<!-- 系统模块日志级别控制  -->
	<logger name="com.hm" level="info" />
	<!-- Spring日志级别控制  -->
	<logger name="org.springframework" level="warn" />

	<root level="info">
		<appender-ref ref="console" />
	</root>

	<!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
        <appender-ref ref="file_debug" />
    </root>

	<!--系统用户操作日志-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
</configuration>

3. 使用 SLF4J API 记录日志

在你的 Java 类中,使用 SLF4J 的 Logger API 来记录日志。

示例代码:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExampleService {
    private static final Logger logger = LoggerFactory.getLogger(ExampleService.class);

    public void doSomething() {
        logger.info("Doing something...");
    }
}

4. 测试日志输出

运行你的应用程序并检查控制台输出和日志文件,确认日志是否按照预期被记录。

以上就是 Spring Boot 中配置 SLF4J 日志的全过程。你可以根据实际需求调整日志级别、输出格式和目标位置。

检查项目所在盘的/Logger/logs目录是否有日志文件即可。

参考:

SpringBoot配置SLF4J日志全过程_java_脚本之家

相关推荐
EumenidesJ24 天前
Java常用日志框架介绍
java·log4j·logback·slf4j
躲在没风的地方1 个月前
logback日志控制服务器日志输出
java·服务器·logback
ta叫我小白1 个月前
Spring Boot 设置滚动日志logback
java·spring boot·spring·logback
代码的余温1 个月前
Spring Boot集成Logback日志全攻略
xml·spring boot·logback
代码的余温1 个月前
Logback.xml配置详解与实战指南
xml·logback
清风92001 个月前
Logback——日志技术(基础)
java·前端·logback
代码的余温1 个月前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
秋千码途1 个月前
小架构step系列08:logback.xml的配置
xml·java·logback
枣伊吕波2 个月前
第十五节:第六部分:日志技术:logback的核心配置文件详解、日志级别
logback
再见晴天*_*2 个月前
logback 日志不打印
java·服务器·logback