Spring Boot 日志 配置 SLF4J 和 Logback

文章目錄

  • 一、前言
  • 二、案例一:初識日志
  • 三、案例二:使用Lombok輸出日志
  • 四、案例三:配置Logback

一、前言

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

日志的重要性

  1. 快速定位問題:通過分析日志,開發者可以迅速定位應用程序中的錯誤或性能問題。
  2. 確保合規性:許多行業要求應用程序符合特定標準,日志記錄了應用程序的運行狀態,便于審計和合規性檢查。
  3. 提高開發效率:日志記錄了應用程序的歷史行為,有助于快速復現問題并優化代碼。

日志框架介紹

在這里插入圖片描述

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

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

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

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

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

在這里插入圖片描述

日志級別分類

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

2.Debug
詳細調試信息,常用于調試過程中使用的調試信息

3.Info
一般信息或狀態更新,常用于提供程序運行的基本信息

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

5.ERROR
錯誤信息, 級別較高的錯誤日志信息, 但仍然不影響系統的繼續運行。

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

在這里插入圖片描述

二、案例一:初識日志

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

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

application.yml

logging:level:root: INFOcom.example.yourpackage: DEBUG  # 你的項目包路徑file:name: application.logpattern: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級別。同時,設置了日志文件的名稱和日志輸出的格式。

  1. 日志的打印

創建控制層類 LoggerController.java

注意創建的日志對象,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

在這里插入圖片描述

  1. 日志持久化

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

日志持久化有兩種方式:

  1. 配置日志文件名
  2. 配置日志的存儲目錄

配置日志文件名:

yml配置

logging:file:# 在源目錄下創建日志文件name: log/log.log

在這里插入圖片描述

配置日志的保存路徑
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"><!-- 日志文件的滾動策略 --><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、環境區分配置

在實際項目中,不同環境(如開發環境、測試環境、生產環境)的日志配置需求可能會有所不同。Spring Boot 支持多配置文件來區分不同環境。你可以在src/main/resources目錄下創建多個配置文件,例如:

  • application-dev.yml:開發環境配置
  • application-test.yml:測試環境配置
  • application-prod.yml:生產環境配置

application-dev.yml

spring:config:activate:on-profile: devlogging:level:root: DEBUGcom.example.yourpackage: DEBUGfile:name: application-dev.logpattern: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: testlogging:level:root: INFOcom.example.yourpackage: INFOfile:name: application-test.logpattern: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: prodlogging:level:root: WARNcom.example.yourpackage: INFOfile:path: /var/log/yourappname: application-prod.logpattern: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 {@Overridepublic 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");}}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic 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 {@Beanpublic 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;}@Beanpublic 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();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900346.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS API 事件監聽

焦點事件案例&#xff1a;搜索框激活下拉菜單 事件對象 事件對象存儲事件觸發時的相關信息 可以判斷用戶按鍵&#xff0c;點擊元素等內容 如何獲取 事件綁定的回調函數中的第一個形參就是事件對象 一般命名為e,event 事件對象常用屬性 type類型 click mouseenter client…

DDD與MVC擴展能力對比

一、架構設計理念的差異二、擴展性差異的具體表現三、DDD擴展性優勢的深層原因四、MVC擴展性不足的典型場景五、總結&#xff1a;架構的本質與選擇六、例子1&#xff09;場景描述2&#xff09;MVC實現示例&#xff08;三層架構&#xff09;3&#xff09;DDD實現示例&#xff08…

針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結

以下是針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結&#xff1a; 問題 1&#xff1a;IN 的候選值過多&#xff08;如超過 1000 個&#xff09; 問題描述 當 IN 列表中的值過多時&#xff0c;SQL 會逐個比較每個值…

手部穴位檢測技術:基于OpenCV和MediaPipe的實現

手部穴位檢測是醫學和健康管理領域的重要技術之一。通過準確識別手部的關鍵穴位,可以為中醫診斷、康復治療以及健康監測提供支持。本文將介紹一種基于OpenCV和MediaPipe的手部穴位檢測方法,展示如何利用計算機視覺技術實現手部關鍵點的檢測,并進一步標注手部的穴位位置。 技…

Day20 -自動化信息收集工具--ARL燈塔的部署

準備&#xff1a; 純凈的Docker環境 ARL的包 一、Docker的部署 00x1 更新系統包 sudo apt update 00x2 安裝必要的依賴包 sudo apt install -y apt-transport-https ca-certificates curl software-properties-common 00x3 下載docker和docker-compose apt-get install do…

sqlalchemy查詢json

第一種&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

搭建K8S-1.23

0、簡介 這里只用3臺服務器來做一個簡單的集群 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、關閉三個服務 &#xff08;1&#xff09;防火墻 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…

初階數據結構--樹

1. 樹的概念與結構 樹是?種?線性的數據結構&#xff0c;它是由 n&#xff08;n>0&#xff09; 個有限結點組成?個具有層次關系的集合。把它叫做 樹是因為它看起來像?棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;?葉朝下的。 有?個特殊的結點&#xff0c;稱…

硬件工程師面試問題(五):藍牙面試問題與詳解

藍牙技術作為物聯網與智能設備的核心無線協議&#xff0c;其硬件設計能力直接影響產品連接穩定性、功耗及兼容性。面試是評估候選人射頻電路設計、天線優化、協議棧調試等綜合技能的關鍵環節&#xff0c;尤其在BLE低功耗設計、共存抗干擾等場景中&#xff0c;硬件工程師的實踐經…

Redis-基本數據類型

Redis支持的基本數據類型&#xff1a;String、hash、list、Set、Zset 一、String 特點 可以存儲三種類型 int、float、string 運用場景 緩存&#xff1a;存儲HTML片段、用戶會話&#xff08;Session&#xff09;計數器&#xff1a;網站訪問量、點贊數&#xff08;incr方法&am…

Tomcat的部署

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和 并發訪問用戶不是很多的場合下被普遍使用&#xff0c;Tomcat 具有處理HTML頁面的功能&#xff0c;它還是一個Servlet和 JSP容器 官網:Apache Tomcat - Welco…

Linux的TCP連接數到達2萬,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出現什么問題

當 Linux 系統的 TCP 連接數達到 2 萬,且 /proc/net/sockstat 中的 tcp_tw(TIME_WAIT 連接)、tcp_alloc(已分配但未完全建立的連接)和 tcp_inuse(正在使用的連接)均處于高位時,可能會引發以下問題: 一、關鍵指標分析 通過 /proc/net/sockstat 可以查看 TCP 連接狀態:…

服務器數據恢復—Raid6陣列硬盤故障掉線,上層虛擬機數據如何恢復?

服務器數據恢復環境&故障&#xff1a; 一臺由16塊硬盤組成的raid6磁盤陣列。磁盤陣列中有一塊硬盤因為物理故障掉線&#xff0c;導致服務器上層虛擬機無法正常使用&#xff0c;部分分區丟失&#xff0c;重啟物理服務器后發現數據丟失。 服務器數據恢復過程&#xff1a; 1、…

Unhandled exception: org.apache.poi.openxml4j.exceptions.InvalidFormatException

代碼在main方法里面沒有報錯&#xff0c;在Controller里面就報錯了。 原來Controller類里面少了行代碼 import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 加上去就解決了。

RISC-V debug專欄2 --- Debug Module(DM)

Debug Module&#xff08;DM&#xff09;的核心功能 DM 就像一個翻譯官&#xff0c;負責把調試器的抽象指令&#xff08;比如 “暫停處理器”&#xff09;轉換成硬件能聽懂的具體操作。它必須實現以下基本功能&#xff1a; 必要功能&#xff08;必須實現&#xff09;&#xff…

infinityfree最新免費建站詳細教程_無需備案_5G空間_無限流量_免費域名_免費SSL

一、明確目標—是否要使用 1.為什么選擇InfinityFree&#xff1f; 對于初學者、學生或只是想嘗試網站搭建的個人用戶來說&#xff0c;InfinityFree提供了一個絕佳的免費解決方案。這個國外免費的虛擬主機服務提供&#xff1a; 5GB存儲空間 - 足以存放個人博客、作品集或小型…

我與數學建模之終章

自美賽失利之后&#xff0c;就開始忙活別的了&#xff0c;因為數學競賽國賽當時還沒收到通知&#xff0c;所以就在準備寫論文&#xff0c;最后論文拿去交挑戰杯競賽了&#xff0c;拿了個校一省一國三。 在寫論文過程中&#xff0c;通知去上海參加數學競賽&#xff0c;其實當時…

大學生機器人比賽實戰(三)經驗篇

大學生機器人比賽一等獎實戰指南&#xff1a;從組隊到奪冠的全流程策略 參加大學生機器人比賽并斬獲一等獎是許多理工科學子的夢想&#xff0c;這不僅是對技術能力的認可&#xff0c;更是未來深造和就業的重要加分項。本文將從團隊組建、技術攻關、項目管理、比賽策略和心理建…

關于UDP端口掃描概述

盡管互聯網上大多數流行服務都基于 TCP 協議運行&#xff0c;但 UDP 服務也廣泛部署。DNS、SNMP 和 DHCP&#xff08;注冊端口 53、161/162 和 67/68&#xff09;是最常見的服務之一。 由于 UDP 掃描通常比 TCP 掃描更慢、更困難&#xff0c;一些安全審計人員可能會忽略這些端…

美團滑塊 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向過程 距離識別不準簡單學習一下&…