" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)

 更新時間:2025年04月01日 08:33:33   作者:wisdom_zhe  
日志記錄是不可或缺的一部分,本文主要介紹了SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

在開發(fā) Java 應(yīng)用時,日志記錄是不可或缺的一部分。日志可以記錄應(yīng)用的運(yùn)行狀態(tài)、錯誤信息和調(diào)試信息,幫助開發(fā)者快速定位和解決問題。Spring Boot 項(xiàng)目默認(rèn)集成了 SLF4J 和 Logback,使得日志配置變得簡單而靈活。本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中配置 SLF4J 和 Logback,包括基本的日志配置、日志文件的輸出路徑、日志級別、日志格式和環(huán)境區(qū)分配置。

日志的重要性

  • 快速定位問題:通過分析日志,開發(fā)者可以迅速定位應(yīng)用程序中的錯誤或性能問題。
  • 確保合規(guī)性:許多行業(yè)要求應(yīng)用程序符合特定標(biāo)準(zhǔn),日志記錄了應(yīng)用程序的運(yùn)行狀態(tài),便于審計(jì)和合規(guī)性檢查。
  • 提高開發(fā)效率:日志記錄了應(yīng)用程序的歷史行為,有助于快速復(fù)現(xiàn)問題并優(yōu)化代碼。

日志框架介紹

在這里插入圖片描述

門面模式(Facade Pattern)又稱為外觀模式

門面模式(Facade Pattern)又稱為外觀模式, 提供了一個統(tǒng)?的接口, ?來訪問?系統(tǒng)中的?群接口.
其主要特征是定義了?個高層接口, 讓子系統(tǒng)更容易使用。

門面模式主要包含2種角色:

  • 外觀角色(Facade): 也稱門面角色,系統(tǒng)對外的統(tǒng)?接口.
  • 子系統(tǒng)角色(SubSystem): 可以同時有?個或多個 SubSystem. 每個 SubSytem 都不是?個單獨(dú)的類,而是?個類的集合. SubSystem 并不知道 Facade 的存在, 對于 SubSystem 而言, Facade 只是另?個客戶端而已(即 Facade 對 SubSystem 透明)

比如去醫(yī)院看病,可能要去掛號, 門診, 化驗(yàn), 取藥, 讓患者或患者家屬覺得很復(fù)雜, 如果有提供接待人員, 只讓接待?員來處理, 就很方便。

在這里插入圖片描述

日志級別分類

1.Trace:最低級別的日志,追蹤, 指明程序運(yùn)行軌跡,比DEBUG更細(xì)粒度的信息事件(除非有特殊用意,否則請使用DEBUG級別替代)

2.Debug詳細(xì)調(diào)試信息,常用于調(diào)試過程中使用的調(diào)試信息

3.Info一般信息或狀態(tài)更新,常用于提供程序運(yùn)行的基本信息

4.Warning警告性信息,常用于提醒可能的問題或性能優(yōu)化建議

5.ERROR錯誤信息, 級別較高的錯誤日志信息, 但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。

6.FATAL致命信息,表示需要立即被處理的系統(tǒng)級錯誤。

在這里插入圖片描述

二、案例一:初識日志

  • 引入依賴Spring Boot 項(xiàng)目默認(rèn)已經(jīng)包含了 SLF4J 和 Logback 的依賴,如果你使用的是 Spring Initializr 初始化的項(xiàng)目,通常不需要額外添加依賴。如果你的項(xiàng)目中沒有這些依賴,可以在pom.xml中添加如下依賴:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
  • 基本日志配置

Spring Boot 允許通過application.ymlapplication.properties文件進(jìn)行簡單的日志配置。以下是一個基本的配置示例:

application.yml

logging:
  level:
    root: INFO
    com.example.yourpackage: DEBUG  # 你的項(xiàng)目包路徑
  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  # 你的項(xiàng)目包路徑
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

以上配置將日志級別設(shè)置為INFO,并為你的項(xiàng)目包設(shè)置為DEBUG級別。同時,設(shè)置了日志文件的名稱和日志輸出的格式。

  • 日志的打印

LoggerController

注意創(chuàng)建的日志對象,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類中  
	// 創(chuàng)建日志對象
	private Logger logger= LoggerFactory.getLogger(LoggerController.class);
	//打印不同級別的日志
  
	@RequestMapping("/log")
	public String log(){
		logger.info("====日志內(nèi)容=====");
		logger.trace("====日志內(nèi)容=====");
		logger.debug("====日志內(nèi)容=====");
		logger.error("====日志內(nèi)容=====");
		logger.warn("====日志內(nèi)容=====");
		return "打印日志";
	}
}

代碼運(yùn)行結(jié)果:

因本項(xiàng)目端口為9000

故訪問路徑:http://localhost:9000/logger/log

在這里插入圖片描述

  • 日志持久化

以上的日志都是輸出在控制臺上的, 然而在線上環(huán)境中, 我們需要把日志保存下來, 以便出現(xiàn)問題之后追溯問題. 把日志保存下來就叫持久化。

日志持久化有兩種方式:

  • 配置日志文件名
  • 配置日志的存儲目錄

配置日志文件名:

yml配置

logging:
  file:
  # 在源目錄下創(chuàng)建日志文件
    name: log/log.log

在這里插入圖片描述

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

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

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

上面創(chuàng)建日志對象的方式還是比較麻煩的,如果程序中的類比較多的話,每個類都需要創(chuàng)建一個日志對象,就很繁瑣,此時我們可以借助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("====日志內(nèi)容=====");
		log.trace("====日志內(nèi)容=====");
		log.debug("====日志內(nèi)容=====");
		log.error("====日志內(nèi)容=====");
		log.warn("====日志內(nèi)容=====");
		return "打印日志";
	}
}

四、案例三:配置Logback

Logback 是 SLF4J 的一個實(shí)現(xiàn),提供了更強(qiáng)大的日志配置功能。你可以通過logback-spring.xml文件進(jìn)行更詳細(xì)的日志配置。以下是一個示例配置文件:

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">
            <!-- 日志文件的滾動策略 -->
            <fileNamePattern>${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、環(huán)境區(qū)分配置

在實(shí)際項(xiàng)目中,不同環(huán)境(如開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境)的日志配置需求可能會有所不同。Spring Boot 支持多配置文件來區(qū)分不同環(huán)境。你可以在src/main/resources目錄下創(chuàng)建多個配置文件,例如:

  • application-dev.yml:開發(fā)環(huán)境配置
  • application-test.yml:測試環(huán)境配置
  • application-prod.yml:生產(chǎn)環(huán)境配置

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"

啟動應(yīng)用時,可以通過命令行參數(shù)指定使用哪個配置文件:

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

3、日志文件路徑權(quán)限

確保 Spring Boot 應(yīng)用在服務(wù)器上有寫日志文件的權(quán)限。你可以通過以下命令檢查和修改目錄權(quán)限:

# 檢查目錄權(quán)限
ls -ld /var/log/yourapp

# 修改目錄權(quán)限
sudo chown -R youruser:yourgroup /var/log/yourapp
sudo chmod -R 755 /var/log/yourapp

4、日志文件查看

啟動應(yīng)用后,檢查日志文件是否正確生成并記錄了日志。你可以在服務(wù)器上使用以下命令查看日志文件:

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

5、使用自定義攔截器

如果你需要在日志中記錄特定的信息,例如 SQL 執(zhí)行時間,可以使用自定義攔截器。以下是一個示例攔截器:

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("執(zhí)行時間: " + timeTaken + " ms");
        }
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 可以設(shè)置一些自定義屬性
    }
}

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"); // 根據(jù)需要設(shè)置攔截器屬性
        sqlTimingInterceptor.setProperties(properties);
        factoryBean.setPlugins(new Interceptor[]{sqlTimingInterceptor});

        return factoryBean.getObject();
    }
}

到此這篇關(guān)于Spring Boot 日志 配置 SLF4J 和 Logback的文章就介紹到這了,更多相關(guān)Spring Boot 日志 配置 SLF4J 和 Logback內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java實(shí)現(xiàn)KMZ和KML數(shù)據(jù)的直接解析

    使用Java實(shí)現(xiàn)KMZ和KML數(shù)據(jù)的直接解析

    本文主要講解如何用JAVA語言,直接解析KMZ數(shù)據(jù),文章首先介紹google地圖中的KMZ和KML數(shù)據(jù),然后使用代碼的方式實(shí)現(xiàn)數(shù)據(jù)的解析,最后展示解析成果以及如何將數(shù)據(jù)轉(zhuǎn)換成空間WKT數(shù)據(jù),需要的朋友可以參考下
    2024-06-06
  • 實(shí)例講解java定時任務(wù)

    實(shí)例講解java定時任務(wù)

    這篇文章主要介紹了實(shí)例講解java定時任務(wù),感興趣的的朋友可以參考下
    2015-08-08
  • Java信號量Semaphore原理及代碼實(shí)例

    Java信號量Semaphore原理及代碼實(shí)例

    這篇文章主要介紹了Java信號量Semaphore原理及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • JMeter自定義日志與日志分析的實(shí)現(xiàn)

    JMeter自定義日志與日志分析的實(shí)現(xiàn)

    JMeter與Java程序一樣,會記錄事件日志,本文就介紹一下JMeter自定義日志與日志分析的實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java的函數(shù)式編程詳解

    Java的函數(shù)式編程詳解

    用了這么久的Java8,我尋思這種話也好意思說出來嗎,難道自己是PythonBoy出身就是看不懂Java的理由嗎,身為一個合格的后端Boy不會還有人看不明白Java的函數(shù)式編程吧,接下來小編和大家淺聊一下Java的函數(shù)式編程,需要的朋友可以參考下
    2023-10-10
  • JAVA設(shè)計(jì)模式---原型模式你了解嗎

    JAVA設(shè)計(jì)模式---原型模式你了解嗎

    這篇文章主要介紹了JAVA 原型模式的的相關(guān)資料,文中講解非常細(xì)致,實(shí)例幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • Springboot引用外部配置文件的方法步驟

    Springboot引用外部配置文件的方法步驟

    這篇文章主要介紹了Springboot引用外部配置文件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺談Java中SimpleDateFormat 多線程不安全原因

    淺談Java中SimpleDateFormat 多線程不安全原因

    SimpleDateFormat是Java中用于日期時間格式化的一個類,本文主要介紹了淺談Java中SimpleDateFormat 多線程不安全原因,感興趣的可以了解一下
    2024-01-01
  • Java游戲服務(wù)器系列之Netty相關(guān)知識總結(jié)

    Java游戲服務(wù)器系列之Netty相關(guān)知識總結(jié)

    今天帶大家來學(xué)習(xí)Java游戲服務(wù)器的相關(guān)知識,文中對Netty作了非常詳細(xì)的介紹,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Spring Boot設(shè)置支持跨域請求過程詳解

    Spring Boot設(shè)置支持跨域請求過程詳解

    這篇文章主要介紹了Spring Boot設(shè)置支持跨域請求過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論