javascript
springboot日志配输出路径配置_SpringBoot日志配置详解
前言
?記錄應(yīng)用系統(tǒng)曰志主要有三個(gè)原因 記錄操作軌跡、監(jiān)控系統(tǒng)運(yùn)行狀況、回溯系統(tǒng)故障。記錄操作行為及操作軌跡數(shù)據(jù),可以數(shù)據(jù)化地分析用戶偏好,有助于優(yōu)化業(yè)務(wù)邏輯,為用戶提供個(gè)性化的服務(wù)。例如,通過 access.log 記錄用戶的操作頻度和跳轉(zhuǎn)鏈接,有助于分析用戶的后續(xù)行為。
?全面有效的日志系統(tǒng)有助于建立完善的應(yīng)用監(jiān)控體系,由此工程師可以實(shí)時(shí)監(jiān)控系統(tǒng)運(yùn)行狀況,及時(shí)預(yù)警,避免故障發(fā)生。監(jiān)控系統(tǒng)運(yùn)行狀況,是指對(duì)服務(wù)器使用狀態(tài),如內(nèi)存、 CPU 等使用情況,應(yīng)用運(yùn)行情況 如響應(yīng)時(shí)間 QPS 等交互狀態(tài);應(yīng)用錯(cuò)誤信息,如空指針、 SQL 異常等的監(jiān)控。例如,在 CPU 使用率大于 60%, 四核服務(wù)器中l(wèi)oad 大于4時(shí)發(fā)出報(bào)警,提醒工程師及時(shí)處理,避免發(fā)生故障。
?當(dāng)系統(tǒng)發(fā)生線上問題時(shí),完整的現(xiàn)場(chǎng)日志有助于工程師快速定位問題。例如當(dāng)系統(tǒng)內(nèi)存溢出時(shí),如果日志系統(tǒng)記錄了問題發(fā)生現(xiàn)場(chǎng)的堆信息,就可以通過這個(gè)曰志分析是什么對(duì)象在大量產(chǎn)生并且沒有釋放內(nèi)存,回溯系統(tǒng)故障,從而定位問題。
日志規(guī)范
推薦日志文件命名方式
推薦的日志文件命名方式為appName_logType_logName.log 其中 logType為日志類型,推薦分類有 stats monitor visit等, logName 為日志描述。這種命名的好處是通過文件名就可以知道曰志文件屬于什么應(yīng)用,什么類型 ,什么目的,也有利于歸類查找。例如, mppserver 應(yīng)用中單獨(dú)監(jiān)控時(shí)區(qū)轉(zhuǎn)換異常的日志文件名定義為mppserver__monitor_timeZoneConvert.log
推薦曰志文件保存時(shí)間
代碼規(guī)約推薦曰志文件至少保存15天,可以根據(jù)日志文件的重要程度、文件大小及磁盤空間再自行延長(zhǎng)保存時(shí)間。
預(yù)先判斷曰志級(jí)別
對(duì)DEBUG 、INFO 級(jí)別的日志,必須使用條件輸出或者使用占位符的方式打印。該約定綜合考慮了程序的運(yùn)行效率和日志打印需求。例如 在某個(gè)配置了打印日志級(jí)別為WARN 的應(yīng)用中,如果針對(duì) DEBUG 級(jí)別的日志,僅僅在程序中寫出 logger.debug(”Processing trade with id:” + id + ” and symbol:"+ symbol);,那么該日志不會(huì)被打印但是會(huì)執(zhí)行字符串拼接操作,如果 symbol 是對(duì)象 還會(huì)執(zhí)行 toString() 方法
白白浪費(fèi)了系統(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 級(jí)別來記錄業(yè)務(wù)行為信息時(shí),一定要控制日志輸出量,以免磁盤空間不足。同時(shí)要為曰志文件設(shè)置合理的生命周期及時(shí)清理過期的日志。避免重復(fù)打印,務(wù)必在日志配置文件中設(shè)置 additivity=false
區(qū)別對(duì)待錯(cuò)誤日志
WARN、ERROR 都是與錯(cuò)誤有關(guān)的日志級(jí)別,但不要一發(fā)生錯(cuò)誤就籠統(tǒng)地輸出ERROR 級(jí)別日志。 一些業(yè)務(wù)異常是可以通過引導(dǎo)重試就能恢復(fù)正常的,例如用戶輸入?yún)?shù)錯(cuò)誤。在這種情況下,記錄日志是為了在用戶咨詢時(shí)可以還原現(xiàn)場(chǎng),如果輸出ERROR 級(jí)別就表示一旦出現(xiàn)就需要人為介入,這顯然不合理。所以,ERROR只記錄系統(tǒng)邏輯錯(cuò)誤、異常或者違反重要的業(yè)務(wù)規(guī)則,其他錯(cuò)誤都可以歸為 WARN級(jí)別。
保證記錄內(nèi)容完整
曰志記錄的內(nèi)容包括現(xiàn)場(chǎng)上下文信息與異常堆棧信息,所以打印時(shí)需要注意以下兩點(diǎn):
記錄異常時(shí)一定要輸出異常堆棧,例如 logger.error("xxx" +e.getMessage(),e)
曰志中如果輸出對(duì)象實(shí)例,要確保實(shí)例類重寫了 toString()方法,否則只會(huì)輸出對(duì)象的 hashCode 沒有實(shí)際意義。
日志框架分類與選擇
日志門面(日志的抽象層)
日志實(shí)現(xiàn)
JCL(Jakarta Commons Logging)(2014年后不再維護(hù))
jboss-logging (不適合企業(yè)項(xiàng)目開發(fā)使用)
SLF4J(Simple Logging Facade for java)
Log4j
JUL(java.util.logging)(java.util.logging)(擔(dān)心被搶市場(chǎng),推出的)
Log4j2( apache開發(fā)的很強(qiáng)大,借了log4j的名,但很多框架未適配上)
Logback(Log4j同一個(gè)人開發(fā)的新框架,做了重大升級(jí))
日志門面
?門面設(shè)計(jì)模式是面向?qū)ο笤O(shè)計(jì)模式中的一種,日志框架采用的就是這種模式,類似JDBC 的設(shè)計(jì)理念。它只提供一套接口規(guī)范,自身不負(fù)責(zé)日志功能的實(shí)現(xiàn)。目的是讓使用者不需要關(guān)注底層具體是哪個(gè)日志庫來負(fù)責(zé)日志打印及具體的使用細(xì)節(jié)等。目前用得最為廣泛的曰志門面有兩種 slf4j和commons -logging
日志庫
?負(fù)責(zé)實(shí)現(xiàn)日志相關(guān)功能,主流日志庫有三個(gè),分別為:log4j、log-jdk(java.util.logging.Logger)、logback。logback是最晚出現(xiàn)的,與log4j同一個(gè)作者,是log4j的升級(jí)版且本身實(shí)現(xiàn)了slf4j的接口。
日志適配器
?分為:日志門面適配器(日志庫適配slf4j),日志庫適配器(slf4j適配日志庫)。
日志門面適配器
老工程用的日志庫沒有實(shí)現(xiàn)slf4j接口,如log4j;這時(shí)候工程里想使用slf4j+log4j的模式,就額外需要一個(gè)適配器(slf4j+log4j12)來解決接口不兼容問題
日志庫適配器
老工程直接使用日志庫API完成日志打印,要改成業(yè)界標(biāo)準(zhǔn)的門面模式(如slf4j+logback),但是老工程代碼打印日志地方太多難以改動(dòng),這是就需要一個(gè)適配器來完成從舊日志庫的API到slf4j的路由,這樣在不改動(dòng)原有代碼的情況下也能使用slf4j來統(tǒng)一管理日志(如:log4j-over-slf4j),后續(xù)自由替換具體日志庫也不成問題。
Spring Boot 采用了 slf4j+logback 的組合形式,Spring Boot也提供對(duì)JUL、log4j2、Logback提供了默認(rèn)配置
SpringBoot默認(rèn)日志配置
新建springboot項(xiàng)目,引入web啟動(dòng)項(xiàng),其他默認(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 級(jí)別日志,(日志默認(rèn)級(jí)別也稱為root級(jí)別)。可修改默認(rèn)級(jí)別日志:logging.level.root=級(jí)別名
//3. 可以進(jìn)行調(diào)整日志級(jí)別,設(shè)定某個(gè)級(jí)別后,就只打印設(shè)定的這個(gè)級(jí)別及后面高級(jí)別的日志信息。沒有指定級(jí)別的就用SpringBoot默認(rèn)規(guī)定的級(jí)別:root級(jí)別
//4. 可修改指定包的日志級(jí)別:指定某個(gè)包下面的所有日志級(jí)別:logging.level.包名=級(jí)別名
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,控制臺(tái)輸出
修改日志默認(rèn)配置
修改日志文件生成路徑
logging.file.name
logging.file.path
示例
說明
(none)
(none)
只在控制臺(tái)輸出
指定文件名
(none)
demo.log
輸出到當(dāng)前項(xiàng)目根路徑下的 demo.log 文件中
(none)
指定目錄
logs/log_lzy
輸出到當(dāng)前項(xiàng)目所在磁盤根路徑下的/logs/log_lzy目錄中的 spring.log 文件中
指定文件名
指定目錄
當(dāng)兩個(gè)同時(shí)指定時(shí),采用的是logging.file.name 指定。推薦使用logging.file.name 設(shè)置即可,因?yàn)樗勺远x文件名
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文件中首尾加上單引號(hào)可解決識(shí)別不了%的問題,properties不需要加
分析日志底層實(shí)現(xiàn)
org.springframework.boot
spring-boot-starter-web
spring-boot-starter-web 中引入了 spring-boot-starter 啟動(dòng)器
org.springframework.boot
spring-boot-starter
2.3.1.RELEASE
compile
spring-boot-starter 中引入了 spring-boot-starter-logging 日志啟動(dòng)器
org.springframework.boot
spring-boot-starter-logging
2.3.1.RELEASE
compile
spring-boot-starter-logging 日志啟動(dòng)器 采用的是 logback 日志框架
ch.qos.logback
logback-classic
compile
總結(jié):SpringBoot中默認(rèn)日志啟動(dòng)器為 spring-boot-starter-logging ,默認(rèn)采用的是 logback 日志框架
在 spring-boot-2.3.1.RELEASE.jar! \org\springframework\boot\logging\logback\base.xml 做了日志的默認(rèn)配置
日志文件采用方式為:滾動(dòng)文件追加器
在下面類中會(huì)讀取上面xml中配置的信息
如果spring boot的日志功能無法滿足我們的需求(比如異步日志記錄等),我們可以自已定義的日志配置文件
自定義日志配置
自定義Logback日志配置
在類路徑下,存放對(duì)應(yīng)日志框架的自定義配置文件即可;SpringBoot就不會(huì)使用它默認(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:配置項(xiàng)不會(huì)被日志框架直接加載,而是由 SpringBoot 解析日志配置文件
logback.xml加載早于application.properties,所以如果你在logback.xml使用了變量時(shí),而恰好這個(gè)變量是寫在application.properties時(shí),那么就會(huì)獲取不到,只要改成logback-spring.xml就可以解決。
官網(wǎng)上說明如下:
因?yàn)閘ogback-spring.xml是由 SpringBoot 解析日志配置文件,故可以使用SpringBoot 的 Profifile 特殊配置
logback-spring.xml 使用 Profile 特殊配置
指定運(yùn)行環(huán)境: --spring.profifiles.active=dev
注意
若使用 logback.xml 作為日志配置文件,還指定 Profifile 特殊配置,則會(huì)有以下錯(cuò)誤,便也證明前面所說logback.xml是直接就被日志框架加載。
更換為log4j2日志實(shí)現(xiàn)
修改pom依賴
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
配置文件
運(yùn)行結(jié)果如下
補(bǔ)充
若日志配置文件名字隨意取得,需要在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ù)若有補(bǔ)充再更新。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的springboot日志配输出路径配置_SpringBoot日志配置详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php运行速度检测软件,PHP执行慢分析
- 下一篇: yii2 redis封装类 php,yi