網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
目錄
- 前言
- 自定義日志配置
- 日志級(jí)別
- 使用
- 1. 依賴
- 2. 配置 logback-spring.xml
- 3. 全局日志AOP實(shí)現(xiàn)
前言
SpringBoot 在所有內(nèi)部日志中使用Commons Logging,但是默認(rèn)配置也提供了對(duì)常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過(guò)配置使用控制臺(tái)或者文件輸出日志內(nèi)容。
默認(rèn)日志Logback
SLF4J——簡(jiǎn)單日志門(mén)面,對(duì)應(yīng)的英文為Simple Logging Facade,是存取日志的標(biāo)準(zhǔn)接口,包括slf4j、log4j、jdk logging api和apache common-log等具體實(shí)現(xiàn)。
其實(shí)SLF4J類(lèi)似于Commons Logging,也是一個(gè)日志接口,而Logback類(lèi)似于Log4j,是一個(gè)日志的實(shí)現(xiàn)。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.5)
2021-05-11 14:37:21.934 INFO 10716 --- [ restartedMain] com.pro.MyBlogSiteApplication : Starting MyBlogSiteApplication using Java 11.0.9 on DESKTOP-04S0A5K with PID 10716 (C:\Users\ibbd\Desktop\sundry\my-blog-site\target\classes started by ibbd in C:\Users\ibbd\Desktop\sundry\my-blog-site)
2021-05-11 14:37:21.937 INFO 10716 --- [ restartedMain] com.pro.MyBlogSiteApplication : The following profiles are active: dev
2021-05-11 14:37:22.021 INFO 10716 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-05-11 14:37:22.021 INFO 10716 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-05-11 14:37:23.584 INFO 10716 --- [ restartedMain] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2021-05-11 14:37:24.675 INFO 10716 --- [ restartedMain] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
2021-05-11 14:37:25.656 INFO 10716 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http)
2021-05-11 14:37:25.675 INFO 10716 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
從默認(rèn)的日志信息可以看出
-
時(shí)間日期:精確到毫秒
-
日志級(jí)別:ERROR, WARN, INFO, DEBUG or TRACE
-
進(jìn)程ID
-
分隔符:— 標(biāo)識(shí)實(shí)際日志的開(kāi)始
-
線程名:方括號(hào)括起來(lái)(可能會(huì)截?cái)嗫刂婆_(tái)輸出)
-
Logger名:通常使用源代碼的類(lèi)名
-
日志內(nèi)容
自定義日志配置
根據(jù)不同的日志系統(tǒng),你可以按如下規(guī)則組織配置文件名,就能被正確加載:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
Spring Boot官方推薦優(yōu)先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,spring boot可以為它添加一些spring boot特有的配置項(xiàng)(下面會(huì)提到)。
默認(rèn)的命名規(guī)則,并且放在 src/main/resources
下面即可
如果你即想完全掌控日志配置,但又不想用logback.xml作為L(zhǎng)ogback配置的名字,application.yml可以通過(guò)logging.config屬性指定自定義的名字:
logging.config=classpath:logging-config.xml
日志級(jí)別
日志級(jí)別從低到高分為
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
如果設(shè)置為 WARN
,則低于 WARN
的信息都不會(huì)輸出
一般設(shè)置為 DEBUG
就夠用了
使用
1. 依賴
spring-boot-starter
這個(gè)包就自帶了 logging
的依賴包, AOP這個(gè)包后面會(huì)用到
使用的 SpringBoot 版本:v2.4.5
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
2. 配置 logback-spring.xml
在 src/main/resources
目錄下新建 logback-spring.xml
配置文件
<configuration scan="true" scanPeriod="30 seconds">
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="LOG_PATH" value="./logs"/>
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%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}}" />
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/my-blog-site.%d{yyyy-MM-dd}.%i.logFileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>30maxHistory>
rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
appender>
<springProfile name="dev,prod">
<logger name="org.springframework" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
logger>
<logger name="com.netflix" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
logger>
<logger name="com.pro.test" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
logger>
<logger name="java.sql" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
logger>
<logger name="com.pro" level="DEBUG,INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
logger>
springProfile>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
root>
configuration>
3. 全局日志AOP實(shí)現(xiàn)
Pointcut
切入點(diǎn)說(shuō)明
1. execution(public * *(..)) # ——表示匹配所有public方法
2. execution(* set*(..)) # ——表示所有以“set”開(kāi)頭的方法
3. execution(* com.pro.service.UserService.*(..)) # ——表示匹配所有UserService接口的方法
4. execution(* com.pro.service.*.*(..)) # ——表示匹配service包下所有的方法
5. execution(* com.pro.service..*.*(..)) # ——表示匹配service包和它的子包下的方法
# () 參數(shù)說(shuō)明
()匹配沒(méi)有參數(shù); (..)代表任意多個(gè)參數(shù); (*)代表一個(gè)參數(shù),但可以是任意型; (*,String)代表第一個(gè)參數(shù)為任何值,第二個(gè)為String類(lèi)型。
記錄日志
package com.pro.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* 請(qǐng)求日志處理
*/
@Aspect
@Component
public class WebLogAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(WebLogAspect.class);
ThreadLocal<Long> startTime = new ThreadLocal<>();
// 切入點(diǎn)
@Pointcut("execution(* com.pro.controller..*.*(..))")
public void pc() {}
// 前置通知
@Before("pc()")
public void doBefore(JoinPoint joinPoint) {
// 記錄請(qǐng)求開(kāi)始時(shí)間
startTime.set(System.currentTimeMillis());
// 接收請(qǐng)求, 記錄請(qǐng)求內(nèi)容
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
// 記錄請(qǐng)求內(nèi)容
LOGGER.info("URL: " + request.getRequestURL().toString());
LOGGER.info("HTTP_METHOD: " + request.getMethod());
LOGGER.info("IP: " + request.getRemoteAddr());
LOGGER.info("CLASS_METHOD: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
LOGGER.info("Args: " + Arrays.toString(joinPoint.getArgs()));
}
// 返回通知
@AfterReturning(returning = "result", pointcut = "pc()")
public void doAfterReturning(Object result) {
// 請(qǐng)求返回內(nèi)容
LOGGER.info("RESPONSE: " + result);
LOGGER.info("SPEND TIME: " + (System.currentTimeMillis() - startTime.get()));
// 用完之后移除, 避免內(nèi)存泄漏
startTime.remove();
}
// 異常通知
@AfterThrowing(value = "pc()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
// 獲取類(lèi)名加方法名
String name = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
// 記錄異常信息
LOGGER.info("Exception_Class_Method: {}, Exception_Message: {}", name, e.getMessage());
}
}
原文鏈接:https://blog.csdn.net/weixin_44953227/article/details/116654006
相關(guān)推薦
- 2023-05-24 Golang實(shí)現(xiàn)AES對(duì)稱加密算法實(shí)例詳解_Golang
- 2022-07-04 C#使用StreamReader和StreamWriter類(lèi)讀寫(xiě)操作文件_C#教程
- 2022-07-22 spring-boot設(shè)置跨域訪問(wèn)方式
- 2022-07-26 圖解Elasticsearch 獲取兩個(gè)索引數(shù)據(jù)不同之處的四種方案
- 2022-03-20 C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之鏈隊(duì)列的基本操作_C 語(yǔ)言
- 2022-07-04 python實(shí)現(xiàn)畫(huà)桃心表白_python
- 2022-09-07 在SQL?Server中使用?Try?Catch?處理異常的示例詳解_MsSql
- 2023-03-11 Tensorflow的DataSet的使用詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支