日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

springboot日志配输出路径配置_SpringBoot日志配置详解

發(fā)布時間:2025/3/15 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot日志配输出路径配置_SpringBoot日志配置详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

?記錄應(yīng)用系統(tǒng)曰志主要有三個原因 記錄操作軌跡、監(jiān)控系統(tǒng)運行狀況、回溯系統(tǒng)故障。記錄操作行為及操作軌跡數(shù)據(jù),可以數(shù)據(jù)化地分析用戶偏好,有助于優(yōu)化業(yè)務(wù)邏輯,為用戶提供個性化的服務(wù)。例如,通過 access.log 記錄用戶的操作頻度和跳轉(zhuǎn)鏈接,有助于分析用戶的后續(xù)行為。

?全面有效的日志系統(tǒng)有助于建立完善的應(yīng)用監(jiān)控體系,由此工程師可以實時監(jiān)控系統(tǒng)運行狀況,及時預(yù)警,避免故障發(fā)生。監(jiān)控系統(tǒng)運行狀況,是指對服務(wù)器使用狀態(tài),如內(nèi)存、 CPU 等使用情況,應(yīng)用運行情況 如響應(yīng)時間 QPS 等交互狀態(tài);應(yīng)用錯誤信息,如空指針、 SQL 異常等的監(jiān)控。例如,在 CPU 使用率大于 60%, 四核服務(wù)器中l(wèi)oad 大于4時發(fā)出報警,提醒工程師及時處理,避免發(fā)生故障。

?當(dāng)系統(tǒng)發(fā)生線上問題時,完整的現(xiàn)場日志有助于工程師快速定位問題。例如當(dāng)系統(tǒng)內(nèi)存溢出時,如果日志系統(tǒng)記錄了問題發(fā)生現(xiàn)場的堆信息,就可以通過這個曰志分析是什么對象在大量產(chǎn)生并且沒有釋放內(nèi)存,回溯系統(tǒng)故障,從而定位問題。

日志規(guī)范

推薦日志文件命名方式

推薦的日志文件命名方式為appName_logType_logName.log 其中 logType為日志類型,推薦分類有 stats monitor visit等, logName 為日志描述。這種命名的好處是通過文件名就可以知道曰志文件屬于什么應(yīng)用,什么類型 ,什么目的,也有利于歸類查找。例如, mppserver 應(yīng)用中單獨監(jiān)控時區(qū)轉(zhuǎn)換異常的日志文件名定義為mppserver__monitor_timeZoneConvert.log

推薦曰志文件保存時間

代碼規(guī)約推薦曰志文件至少保存15天,可以根據(jù)日志文件的重要程度、文件大小及磁盤空間再自行延長保存時間。

預(yù)先判斷曰志級別

對DEBUG 、INFO 級別的日志,必須使用條件輸出或者使用占位符的方式打印。該約定綜合考慮了程序的運行效率和日志打印需求。例如 在某個配置了打印日志級別為WARN 的應(yīng)用中,如果針對 DEBUG 級別的日志,僅僅在程序中寫出 logger.debug(”Processing trade with id:” + id + ” and symbol:"+ symbol);,那么該日志不會被打印但是會執(zhí)行字符串拼接操作,如果 symbol 是對象 還會執(zhí)行 toString() 方法

白白浪費了系統(tǒng)資源。如下示例代碼為正確的打印日志方式

//使明條件判斷形式

if (logger.isDebugEnabled()) {

logger.debug ("Processing trade with id:" + id + "and symlbol:" + symbol) ;

//使用占位符形式

logger.debug ("Processing trade with id: {} and symbol: {}",id, symbol);

避免無效日志打印

生產(chǎn)環(huán)境禁止輸出 DEBUG 曰志且有選擇地輸出 INFO日志。使用 INFO、WARN 級別來記錄業(yè)務(wù)行為信息時,一定要控制日志輸出量,以免磁盤空間不足。同時要為曰志文件設(shè)置合理的生命周期及時清理過期的日志。避免重復(fù)打印,務(wù)必在日志配置文件中設(shè)置 additivity=false

區(qū)別對待錯誤日志

WARN、ERROR 都是與錯誤有關(guān)的日志級別,但不要一發(fā)生錯誤就籠統(tǒng)地輸出ERROR 級別日志。 一些業(yè)務(wù)異常是可以通過引導(dǎo)重試就能恢復(fù)正常的,例如用戶輸入?yún)?shù)錯誤。在這種情況下,記錄日志是為了在用戶咨詢時可以還原現(xiàn)場,如果輸出ERROR 級別就表示一旦出現(xiàn)就需要人為介入,這顯然不合理。所以,ERROR只記錄系統(tǒng)邏輯錯誤、異常或者違反重要的業(yè)務(wù)規(guī)則,其他錯誤都可以歸為 WARN級別。

保證記錄內(nèi)容完整

曰志記錄的內(nèi)容包括現(xiàn)場上下文信息與異常堆棧信息,所以打印時需要注意以下兩點:

記錄異常時一定要輸出異常堆棧,例如 logger.error("xxx" +e.getMessage(),e)

曰志中如果輸出對象實例,要確保實例類重寫了 toString()方法,否則只會輸出對象的 hashCode 沒有實際意義。

日志框架分類與選擇

日志門面(日志的抽象層)

日志實現(xiàn)

JCL(Jakarta Commons Logging)(2014年后不再維護(hù))

jboss-logging (不適合企業(yè)項目開發(fā)使用)

SLF4J(Simple Logging Facade for java)

Log4j

JUL(java.util.logging)(java.util.logging)(擔(dān)心被搶市場,推出的)

Log4j2( apache開發(fā)的很強大,借了log4j的名,但很多框架未適配上)

Logback(Log4j同一個人開發(fā)的新框架,做了重大升級)

日志門面

?門面設(shè)計模式是面向?qū)ο笤O(shè)計模式中的一種,日志框架采用的就是這種模式,類似JDBC 的設(shè)計理念。它只提供一套接口規(guī)范,自身不負(fù)責(zé)日志功能的實現(xiàn)。目的是讓使用者不需要關(guān)注底層具體是哪個日志庫來負(fù)責(zé)日志打印及具體的使用細(xì)節(jié)等。目前用得最為廣泛的曰志門面有兩種 slf4j和commons -logging

日志庫

?負(fù)責(zé)實現(xiàn)日志相關(guān)功能,主流日志庫有三個,分別為:log4j、log-jdk(java.util.logging.Logger)、logback。logback是最晚出現(xiàn)的,與log4j同一個作者,是log4j的升級版且本身實現(xiàn)了slf4j的接口。

日志適配器

?分為:日志門面適配器(日志庫適配slf4j),日志庫適配器(slf4j適配日志庫)。

日志門面適配器

老工程用的日志庫沒有實現(xiàn)slf4j接口,如log4j;這時候工程里想使用slf4j+log4j的模式,就額外需要一個適配器(slf4j+log4j12)來解決接口不兼容問題

日志庫適配器

老工程直接使用日志庫API完成日志打印,要改成業(yè)界標(biāo)準(zhǔn)的門面模式(如slf4j+logback),但是老工程代碼打印日志地方太多難以改動,這是就需要一個適配器來完成從舊日志庫的API到slf4j的路由,這樣在不改動原有代碼的情況下也能使用slf4j來統(tǒng)一管理日志(如:log4j-over-slf4j),后續(xù)自由替換具體日志庫也不成問題。

Spring Boot 采用了 slf4j+logback 的組合形式,Spring Boot也提供對JUL、log4j2、Logback提供了默認(rèn)配置

SpringBoot默認(rèn)日志配置

新建springboot項目,引入web啟動項,其他默認(rèn)即可

package com.lzy.logdemo.controller;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* @Author: Luzy

* @Date: 2020-07-17 10:16

* @Description:

*/

@RequestMapping

@RestController

public class LogController {

private static final Logger logger = LoggerFactory.getLogger(LogController.class);

@GetMapping("/log")

public String logTest1(String name) {

// 由低到高:trace < debug < info < warn < error

//2. Spring Boot默認(rèn)設(shè)定的是 info 級別日志,(日志默認(rèn)級別也稱為root級別)。可修改默認(rèn)級別日志:logging.level.root=級別名

//3. 可以進(jìn)行調(diào)整日志級別,設(shè)定某個級別后,就只打印設(shè)定的這個級別及后面高級別的日志信息。沒有指定級別的就用SpringBoot默認(rèn)規(guī)定的級別:root級別

//4. 可修改指定包的日志級別:指定某個包下面的所有日志級別:logging.level.包名=級別名

logger.info("------------info--------------{}",name);

logger.error("------------error--------------{}",name);

logger.debug("------------debug--------------{}",name);

logger.trace("------------trace--------------{}",name);

logger.warn("------------warn--------------{}",name);

return "log test..."+name;

}

}

url輸入http://localhost:8080/log?name=lzy,控制臺輸出

修改日志默認(rèn)配置

修改日志文件生成路徑

logging.file.name

logging.file.path

示例

說明

(none)

(none)

只在控制臺輸出

指定文件名

(none)

demo.log

輸出到當(dāng)前項目根路徑下的 demo.log 文件中

(none)

指定目錄

logs/log_lzy

輸出到當(dāng)前項目所在磁盤根路徑下的/logs/log_lzy目錄中的 spring.log 文件中

指定文件名

指定目錄

當(dāng)兩個同時指定時,采用的是logging.file.name 指定。推薦使用logging.file.name 設(shè)置即可,因為它可自定義文件名

logging:

file:

name: demo.log

# path: logs/log_lzy

修改日志輸出格式

logging:

file:

name: demo.log

pattern:

console: '%clr(%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n)'

file: '%d{yyyy-MM-dd HH:mm:ss.SSS} >>> [%thread] >>> %-5level >>> %logger{50} >>> %msg%n'

# path: logs/log_lzy

注意:如上,yml文件中首尾加上單引號可解決識別不了%的問題,properties不需要加

分析日志底層實現(xiàn)

org.springframework.boot

spring-boot-starter-web

spring-boot-starter-web 中引入了 spring-boot-starter 啟動器

org.springframework.boot

spring-boot-starter

2.3.1.RELEASE

compile

spring-boot-starter 中引入了 spring-boot-starter-logging 日志啟動器

org.springframework.boot

spring-boot-starter-logging

2.3.1.RELEASE

compile

spring-boot-starter-logging 日志啟動器 采用的是 logback 日志框架

ch.qos.logback

logback-classic

compile

總結(jié):SpringBoot中默認(rèn)日志啟動器為 spring-boot-starter-logging ,默認(rèn)采用的是 logback 日志框架

在 spring-boot-2.3.1.RELEASE.jar! \org\springframework\boot\logging\logback\base.xml 做了日志的默認(rèn)配置

日志文件采用方式為:滾動文件追加器

在下面類中會讀取上面xml中配置的信息

如果spring boot的日志功能無法滿足我們的需求(比如異步日志記錄等),我們可以自已定義的日志配置文件

自定義日志配置

自定義Logback日志配置

在類路徑下,存放對應(yīng)日志框架的自定義配置文件即可;SpringBoot就不會使用它默認(rèn)的日志配置文件了

Logging System

Customization

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

logback.xml

%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n

${LOG_HOME}/${appName}.log

${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log

30

10MB

%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n

關(guān)于logback.xml與logback-spring.xml的說明

logback.xml :是直接就被日志框架加載了。

logback-spring.xml:配置項不會被日志框架直接加載,而是由 SpringBoot 解析日志配置文件

logback.xml加載早于application.properties,所以如果你在logback.xml使用了變量時,而恰好這個變量是寫在application.properties時,那么就會獲取不到,只要改成logback-spring.xml就可以解決。

官網(wǎng)上說明如下:

因為logback-spring.xml是由 SpringBoot 解析日志配置文件,故可以使用SpringBoot 的 Profifile 特殊配置

logback-spring.xml 使用 Profile 特殊配置

指定運行環(huán)境: --spring.profifiles.active=dev

注意

若使用 logback.xml 作為日志配置文件,還指定 Profifile 特殊配置,則會有以下錯誤,便也證明前面所說logback.xml是直接就被日志框架加載。

更換為log4j2日志實現(xiàn)

修改pom依賴

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-logging

org.springframework.boot

spring-boot-starter-log4j2

配置文件

運行結(jié)果如下

補充

若日志配置文件名字隨意取得,需要在springboot配置文件yml中指明:

logging:

file:

name: demo.log

pattern:

console: '%clr(%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n)'

file: '%d{yyyy-MM-dd HH:mm:ss.SSS} >>> [%thread] >>> %-5level >>> %logger{50} >>> %msg%n'

# path: logs/log_lzy

config: classpath:logconfig.xml

至此,SpringBoot整合日志已總結(jié)完畢,后續(xù)若有補充再更新。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的springboot日志配输出路径配置_SpringBoot日志配置详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。