SpringBoot日志配置SLF4J和Logback的方法实现

2025-04-01 15:50

本文主要是介绍SpringBoot日志配置SLF4J和Logback的方法实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非...

一、前言

在开发 Java 应用时,日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息,帮助开发者快速定位和解决问题。Spring Boot 项目默认集成了 SLF4J 和 Logback,使得日志配置变得简单而灵活。本文将详细介绍如何在 Spring Boot 项目中配置 SLF4J 和 LogbacChina编程k,包括基本的日志配置、日志文件的输出路径、日志级别、日志格式和环境区分配置。

编程China编程

日志的重要性

  • 快速定位问题:通过分析日志,开发者可以迅速定位应用程序中的错误或性能问题。
  • 确保合规性:许多行业要求应用程序符合特定标准,日志记录了应用程序的运行状态,便于审计和合规性检查。
  • 提高开发效率:日志记录了应用程序的历史行为,有助于快速复现问题并优化代码。

日志框架介绍

SpringBoot日志配置SLF4J和Logback的方法实现

门面模式(Facade Pattern)又称为外观模式

门面模式(Facade Pattern)又称为外观模式,js 提供了一个统⼀的接口, ⽤来访问⼦系统中的⼀群接口.
其主要特征是定义了⼀个高层接口, 让子系统更容易使用。

门面模式主要包含2种角色:

  • 外观角色(Facade): 也称门面角色,系统对外的统⼀接口.
  • 子系统角色(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类,而是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem 而言, Facade 只是另⼀个客户端而已(即 Facade 对 SubSystem 透明)

比如去医院看病,可能要去挂号, 门诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待人员, 只让接待⼈员来处理, 就很方便。

SpringBoot日志配置SLF4J和Logback的方法实现

日志级别分类

1.Trace:最低级别的日志,追踪, 指明程序运行轨迹,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)

2.Debug详细调试信息,常用于调试过程中使用的调试信息

3.Info一般信息或状态更新,常用于提供程序运行的基本信息

4.Warning警告性信息,常用于提醒可能的问题或性能优化建议

5.ERROR错误信息, 级别较高的错误日志信息, 但仍然不影响系统的继续运行。

6.FATAL致命信息,表示需要立即被处理的系统级错误。

SpringBoot日志配置SLF4J和Logback的方法实现

二、案例一:初识日志

  • 引入依赖Spring Boot 项目默认已经包含了 SLF4J 和 Logback 的依赖,如果你使用的是 Spring Initializr 初始化的项目,通常不需要额外添加依赖。如果你的项目中没有这些依赖,可以在pom.XML中添加如下依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
  • 基本日志配置

Spring Boot 允许通过application.ymlapplication.properties文件进行简单的日志配置。以下是一个基本的配置示例:

application.yml

logging:
  level:
    root: INFO
    com.example.yourpackage: DEBUG  # 你的项目包路径
  file:
    name: application.log
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"

application.properties

logging.level.root=INFO
logging.level.com.example.yourpackage=DEBUG  # 你的项目包路径
logging.file.name=application.log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n

以上配置将日志级别设置为INFO,并为你的项目包设置为DEBUG级别。同时,设置了日志文件的名称和日志输出的格式。

  • 日志的打印

LoggerController

注意创建的日志对象,Logger和LoggerFactory类都是来自于Slf4j包底下的类。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/logger")
public class LoggerController {
	// 要想打印日志的前提是要有一个日志对象,日志对象来自于LoggerFactory类中  
	// 创建日志对象
	private Logger logger= LoggerFactory.getLogger(LoggerController.class);
	//打印不同级别的日志
  
	@RequestMapping("/log")
	public String log(){
		logger.info("====日志内容=====");
		logger.trace("====日志内容=====");
		logger.debug("====日志内容=====");
		logger.error("====日志内容=====");
		logger.warn("====日志内容=====");
		return "打印日志";
	}
}

代码运行结果:

因本项目端口为9000

故访问路径:http://localhost:9000/logger/log

SpringBoot日志配置SLF4J和Logback的方法实现

  • 日志持久化

以上的日志都是输出在控制台上的, 然而在线上环境中, 我们需要把日志保存下来, 以便出现问题之后追溯问题. 把日志保存下来就叫持久化。

日志持久化有两种方式:

  • 配置日志文件名
  • 配置日志的存储目录

配置日志文件名:

yml配置

logging:
  file:
 python # 在源目录下创建日志文件
    name: log/log.log

SpringBoot日志配置SLF4J和Logback的方法实现

配置日志的保存路径yml文件配置

logging:
  file:
  #  日志在指定路径下面
    path: d/loggeController

三、案例二:使用Lombok输出日志

上面创建日志对象的方式还是比较麻烦的,如果程序中的类比较多的话,每个类都需要创建一个日志对象,就很繁琐,此时我们可以借助lombok中的**@Slf4j**注解来更简单的输出日志。

@RestController
@RequestMapping("/logger")
@Slf4j
public class LoggerController {
	// @Slf4j 等同于
	//	private Logger log= LoggerFactory.getLogger(LoggerController.class);

	@RequestMapping("/log")
	public String log(){
		// 添加@Slf4j注解后,类会自动生成一个log对象
		log.info("====日志内容=====");
		log.trace("====日志内容=====");
		log.debug("====日志内容=====");
		log.error("====日志内容=====");
		log.warn("====日志内容=====");
		return "打印日志";
	}
}

四、案例三:配置Logback

Logback 是 SLF4J 的一个实现,提供了更强大的日志配置功能。你可以通过logback-spring.xml文件进行更详细的日志配置。以下是一个示例配置文件:

1、logback-spring.xml

<configuration>
    <!-- 定义日志文件的路径和名称 -->
    <property name="LOG_PATH" value="/var/log/yourapp" />
    <property name="LOG_FILE" value="${LOG_PATH}/application.log" />

    <!-- 控制台日志输出配置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件日志输出配置 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件的滚动策略 -->
            <fileNamePatteandroidrn>${LOG_PATH}/application-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>  <!-- 保留30天的日志文件 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 指定日志级别 -->
    <logger name="org.apache.iBATis" level="DEBUG">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </logger>

    <logger name="com.example.yourpackage" level="DEBUG">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </logger>

    <!-- 根日志级别 -->
    <root level="INFO">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

2、环境区分配置

在实际项目中,不同环境(如开发环境、测试环境、生产环境)的日志配置需求可能会有所不同。Spring Boot 支持多配置文件来区分不同环境。你可以在src/main/resources目录下创建多个配置文件,例如:

  • application-dev.yml:开发环境配置
  • application-test.yml:测试环境配置
  • application-prod.yml:生产环境配置

application-dev.yml

spring:
  config:
    activate:
      on-profile: dev

logging:
  level:
    root: DEBUG
    com.example.yourpackage: DEBUG
  file:
    name: application-dev.log
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"

application-test.yml

spring:
  config:
    activate:
      on-profile: test

logging:
  level:
    root: INFO
    com.example.yourpackage: INFO
  file:
    name: application-test.log
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"

application-prod.yml

spring:
  config:
    activate:
      on-profile: prod

logging:
  level:
    root: WARN
    com.example.yourpackage: INFO
  file:
    path: /var/log/yourapp
    name: application-prod.log
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} %thread %-5level %logger{36} - %msg%n"

启动应用时,可以通过命令行参数指定使用哪个配置文件:

java -jar -Dspring.profiles.active=prod yourapp.jar

3、日志文件路径权限

确保 Spring Boot 应用在服务器上有写日志文件的权限。你可以通过以下命令检查和修改目录权限:

# 检查目录权限
ls -ld /var/log/yourapp

# 修改目录权限
sudo chown -R youruser:yourgroup /var/log/yourapp
sudo chmod -R 755 /var/log/yourapp

4、日志文件查看

启动应用后,检查日志文件是否正确生成并记录了日志。你可以在服务器上使用以下命令查看日志文件:

# 查看日志文件
tail -f /var/log/yourapp/application-prod.log

5、使用自定义拦截器

如果你需要在日志中记录特定的信息,例如 SQL 执行时间,可以使用自定义拦截器。以下是一个示例拦截器:

SqlTimingInterceptor.java

package com.example.yourpackage.interceptor;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

@Intercepts(@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}))
public class SqlTimingInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        long start = System.currentTimeMillis();
        try {
            return invocation.proceed();
        } finally {
            long end = System.currentTimeMillis();
            long timeTaken = end - start;

            StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
            String sql = (String) SystemMetaObject.forObject(statementHandler).getValue("delegate.boundSql.sql");

            Log log = Slf4jImpl.create(this.getClass());
            log.debug("SQL: " + sql);
            log.debug("执行时间: " + timeTaken + " ms");
        }
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 可以设置一些自定义属性
    }
}

MyBatisConfig.java

package com.example.yourpackage.config;

import com.example.yourpackage.interceptor.SqlTimingInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@MapperScan("com.example.yourpackage.mapper")
public class MyBatisConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.PostgreSQL.Driver");
        dataSource.setUrl("jdbc:postgresql://localhost:5432/yourdb");
        dataSource.setUsername("yourusername");
        dataSource.setPassword("yourpassword");
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setMapperlocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));

        // 注册拦截器
        SqlTimingInterceptor sqlTimingInterceptor = new SqlTimingInterceptor();
        Properties properties = new Properties();
        properties.setProperty("someProperty", "someValue"); // 根据需要设置拦截器属性
        sqlTimingInterceptor.setProperties(properties);
        factoryBean.setPlugins(new Interceptor[]{sqlTimingInterceptor});

        return factoryBean.getObject();
    }
}

到此这篇关于Spring Boot 日志 配置 SLF4J 和 Logback的文章就介绍到这了,更多相关Spring Boot 日志 配置 SLF4J 和 Logback内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于SpringBoot日志配置SLF4J和Logback的方法实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154040

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.