1.spring boot日志概述
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),合山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:合山等地區(qū)。合山做網(wǎng)站價(jià)格咨詢:028-86922220
spring boot使用Commons Logging作為內(nèi)部的日志系統(tǒng),并且給Java Util Logging,Log4J2以及Logback都提供了默認(rèn)的配置。
如果使用了spring boot的Starters,那么默認(rèn)會使用Logback用于記錄日志。
2.spring boot日志默認(rèn)配置
我們啟動一個(gè)空的spring-boot項(xiàng)目看一下控制臺的日志
控制臺的默認(rèn)配置
logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
其中%clr為配置不同的顏色輸出,支持的顏色有以下幾種:
blue
cyan
faint
green
magenta
red
yellow
輸出順序分析:
1、日期和時(shí)間--精確到毫秒,并按照時(shí)間進(jìn)行簡單的排序,格式為:
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
2、日志級別--ERROR,WARN,INFO,DEBUG,TRACE
%clr(${LOG_LEVEL_PATTERN:-%5p})
3、進(jìn)程ID號
%clr(${PID:- })
4、日志內(nèi)容,用"---"分隔符分開
%clr(---){faint}
5、線程名字--括在方括號中
%clr([%15.15t]){faint}
6、日志的名字--通常對應(yīng)的是類名
%clr(%-40.40logger{39}){cyan}
注意:Logback沒有FATAL級別(映射到ERROR)
不同日志級別對應(yīng)的顏色如下
3.spring boot日志配置
可以通過application.properties或者application.yml查看所有配置
每個(gè)配置后面都有說明,就不一一贅述了。
4.spring boot日志實(shí)現(xiàn)原理
點(diǎn)擊配置屬性,可以進(jìn)入LoggingApplicationListener這個(gè)類,
`/**
它實(shí)現(xiàn)了GenericApplicationListener接口,它默認(rèn)定義了日志組DEFAULT_GROUP_LOGGERS和日志級別LOG_LEVEL_LOGGERS
private static final Map<String, List<String>> DEFAULT_GROUP_LOGGERS;
static {
MultiValueMap<String, String> loggers = new LinkedMultiValueMap<>();
loggers.add("web", "org.springframework.core.codec");
loggers.add("web", "org.springframework.http");
loggers.add("web", "org.springframework.web");
loggers.add("web", "org.springframework.boot.actuate.endpoint.web");
loggers.add("web",
"org.springframework.boot.web.servlet.ServletContextInitializerBeans");
loggers.add("sql", "org.springframework.jdbc.core");
loggers.add("sql", "org.hibernate.SQL");
DEFAULT_GROUP_LOGGERS = Collections.unmodifiableMap(loggers);
}
private static final Map<LogLevel, List<String>> LOG_LEVEL_LOGGERS;
static {
MultiValueMap<LogLevel, String> loggers = new LinkedMultiValueMap<>();
loggers.add(LogLevel.DEBUG, "sql");
loggers.add(LogLevel.DEBUG, "web");
loggers.add(LogLevel.DEBUG, "org.springframework.boot");
loggers.add(LogLevel.TRACE, "org.springframework");
loggers.add(LogLevel.TRACE, "org.apache.tomcat");
loggers.add(LogLevel.TRACE, "org.apache.catalina");
loggers.add(LogLevel.TRACE, "org.eclipse.jetty");
loggers.add(LogLevel.TRACE, "org.hibernate.tool.hbm2ddl");
LOG_LEVEL_LOGGERS = Collections.unmodifiableMap(loggers);
}
你也可以自定義logging.level和logging.group,它們都是map結(jié)構(gòu)。LoggingApplicationListener重寫了onApplicationEvent方法,實(shí)現(xiàn)日志的打印
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationStartingEvent) {
onApplicationStartingEvent((ApplicationStartingEvent) event); //1
}
else if (event instanceof ApplicationEnvironmentPreparedEvent) {
onApplicationEnvironmentPreparedEvent(
(ApplicationEnvironmentPreparedEvent) event); //2
}
else if (event instanceof ApplicationPreparedEvent) {
onApplicationPreparedEvent((ApplicationPreparedEvent) event); //3
}
else if (event instanceof ContextClosedEvent && ((ContextClosedEvent) event)
.getApplicationContext().getParent() == null) {
onContextClosedEvent(); //4
}
else if (event instanceof ApplicationFailedEvent) {
onApplicationFailedEvent(); //5
}
}
第一步:根據(jù)classloader里加載的依賴決定使用哪個(gè)日志系統(tǒng)?
主要實(shí)現(xiàn)有JavaLoggingSystem,Log4J2LoggingSystem,LogbackLoggingSystem
private void onApplicationStartingEvent(ApplicationStartingEvent event) {
this.loggingSystem = LoggingSystem
.get(event.getSpringApplication().getClassLoader());
this.loggingSystem.beforeInitialize();
}
第二步:通過classpath,enviroment等獲取參數(shù)初始化日志系統(tǒng)
/**
* Initialize the logging system according to preferences expressed through the
* {@link Environment} and the classpath.
* @param environment the environment
* @param classLoader the classloader
*/
protected void initialize(ConfigurableEnvironment environment,
ClassLoader classLoader) {
new LoggingSystemProperties(environment).apply();
LogFile logFile = LogFile.get(environment);
if (logFile != null) {
logFile.applyToSystemProperties();
}
initializeEarlyLoggingLevel(environment);
initializeSystem(environment, this.loggingSystem, logFile);
initializeFinalLoggingLevels(environment, this.loggingSystem);
registerShutdownHookIfNecessary(environment, this.loggingSystem);
}
第三步:注冊springBootLoggingSystem
private void onApplicationPreparedEvent(ApplicationPreparedEvent event) {
ConfigurableListableBeanFactory beanFactory = event.getApplicationContext()
.getBeanFactory();
if (!beanFactory.containsBean(LOGGING_SYSTEM_BEAN_NAME)) {
beanFactory.registerSingleton(LOGGING_SYSTEM_BEAN_NAME, this.loggingSystem);
}
}
第四步和第五步:日志系統(tǒng)清洗
private void onContextClosedEvent() {
if (this.loggingSystem != null) {
this.loggingSystem.cleanUp();
}
}
private void onApplicationFailedEvent() {
if (this.loggingSystem != null) {
this.loggingSystem.cleanUp();
}
}
5.自定義配置文件
日志系統(tǒng) 自定義配置文件
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
6.總結(jié)
spring boot日志系統(tǒng)封裝了logback,log4j2和java log,默認(rèn)情況下使用java log,一旦使用各種starts,則默認(rèn)使用Log4J2,也可以通過classpath來改變,pom.xml指定
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
參考資料
【1】https://docs.spring.io/spring-boot/docs/2.1.2.RELEASE/reference/htmlsingle/#boot-features-logging-format
【2】https://www.jb51.net/article/133795.htm
文章標(biāo)題:讓你的spring-boot應(yīng)用日志隨心所欲--springboot日志深入分析
URL鏈接:http://bm7419.com/article20/jddico.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、營銷型網(wǎng)站建設(shè)、虛擬主機(jī)、電子商務(wù)、網(wǎng)站改版、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)