SpringBoot中通過(guò)AOP整合日志文件的實(shí)現(xiàn)
1.導(dǎo)入相關(guān)的依賴(lài)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <!-- 去掉springboot自帶的日志,不然會(huì)沖突 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency> <!-- log4j-api --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </dependency> <!-- log4j-slf4j-impl --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </dependency> <!-- slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <!-- slf4j-simple 解決沖突--> <!--<dependency>--> <!--<groupId>org.slf4j</groupId>--> <!--<artifactId>slf4j-simple</artifactId>--> <!--</dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
2.log4j2 日志文件
<?xml version="1.0" encoding="UTF-8"?> <!--日志級(jí)別以及優(yōu)先級(jí)排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration 后面的 status 用于設(shè)置 log4j2 自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成 trace 時(shí),可以看到 log4j2 內(nèi)部各種詳細(xì)輸出--> <configuration status="INFO"> <!--先定義所有的 appender--> <appenders> <!--輸出日志信息到控制臺(tái)--> <console name="Console" target="SYSTEM_OUT"> <!--控制日志輸出的格式--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </console> </appenders> <!--然后定義 logger,只有定義 logger 并引入的 appender,appender 才會(huì)生效--> <!--root:用于指定項(xiàng)目的根日志,如果沒(méi)有單獨(dú)指定 Logger,則會(huì)使用 root 作為默認(rèn)的日志輸出--> <loggers> <root level="info"> <appender-ref ref="Console"/> </root> </loggers> </configuration>
3.dao層的接口以及實(shí)現(xiàn)類(lèi)
文件路徑:com.dzj.dao.Userdao.java
package com.dzj.dao; public interface Userdao { void add(); void update(); void delete(); void query(); }
文件路徑:com.dzj.dao.UserDaoImpl.java
package com.dzj.dao; import org.springframework.stereotype.Service; @Service public class UserDaoImpl implements Userdao { @Override public void add() { System.out.println("執(zhí)行了添加方法..."); } @Override public void update() { System.out.println("執(zhí)行了修改方法..."); } @Override public void delete() { System.out.println("執(zhí)行了刪除方法..."); } @Override public void query() { System.out.println("執(zhí)行了查找方法..."); } }
4.Service層業(yè)務(wù)實(shí)現(xiàn)類(lèi)
文件路徑:com.dzj.service.UserService.java
package com.dzj.service; import com.dzj.dao.UserDaoImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired UserDaoImpl userDao; public void add(){ userDao.add(); } public void update(){ userDao.update(); } public void delete(){ userDao.delete(); } public void query(){ userDao.query(); } }
5.Controller層接口控制類(lèi)
文件路徑:com.dzj.controller.UserController.java
package com.dzj.controller; import com.dzj.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @ResponseBody public class UserController { @Autowired UserService userService; @RequestMapping("/test") public String userTest(){ userService.add(); return "chenggongle..."; } }
6.編寫(xiě)業(yè)務(wù)類(lèi)增強(qiáng)類(lèi),加入一個(gè)日志文件記錄
package com.dzj.advice; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; 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.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; @Component @Aspect public class AdviceMethod { private static final Logger log = LoggerFactory.getLogger(AdviceMethod.class); @Pointcut("execution(public * com.dzj.service.UserService.*(..))") public void webLog(){} @Before("webLog()") public void before(JoinPoint joinPoint){ //這個(gè)RequestContextHolder是Springmvc提供來(lái)獲得請(qǐng)求的東西 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); // 記錄下請(qǐng)求內(nèi)容 log.info("################URL : " + request.getRequestURL().toString());//獲取請(qǐng)求的地址 log.info("################HTTP_METHOD : " + request.getMethod());//獲取請(qǐng)求的方法 log.info("################IP : " + request.getRemoteAddr()); log.info("################THE ARGS OF THE CONTROLLER : " + Arrays.toString(joinPoint.getArgs())); /** * getSignature().getDeclaringTypeName() 是獲取包+類(lèi)名的 * joinPoint.getSignature.getName() 獲取了方法名 * joinPoint.getTarget() 返回的是需要加強(qiáng)的目標(biāo)類(lèi)的對(duì)象 * joinPoint.getThis()) 返回的是經(jīng)過(guò)加強(qiáng)后的代理類(lèi)的對(duì)象 */ log.info("################CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); log.info("################TARGET: " + joinPoint.getTarget()); log.info("################THIS: " + joinPoint.getThis()); System.out.println("方法執(zhí)行之前..."); } @After("webLog()") public void after(){ System.out.println("方法執(zhí)行之后..."); } }
7.運(yùn)行測(cè)試,查看結(jié)果
啟動(dòng)主啟動(dòng)器類(lèi),在瀏覽器中輸入http://localhost:8080/test,查看控制臺(tái)輸出信息
到此這篇關(guān)于SpringBoot中通過(guò)AOP整合日志文件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot AOP日志文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于ReadWriteLock實(shí)現(xiàn)鎖的應(yīng)用
這篇文章主要介紹了Java基于ReadWriteLock實(shí)現(xiàn)鎖的應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10mybatis分頁(yè)及模糊查詢(xún)功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)為大家詳細(xì)介紹了mybatis實(shí)現(xiàn)分頁(yè)及模糊查詢(xún)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06SpringMVC中ModelAndView的使用及說(shuō)明
這篇文章主要介紹了SpringMVC中ModelAndView的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11JAVA實(shí)現(xiàn)遍歷文件夾下的所有文件(遞歸調(diào)用和非遞歸調(diào)用)
本篇文章主要介紹了JAVA 遍歷文件夾下的所有文件(遞歸調(diào)用和非遞歸調(diào)用) ,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01MyBatis框架關(guān)聯(lián)映射實(shí)例詳解
這篇文章主要介紹了MyBatis框架關(guān)聯(lián)映射,關(guān)系映射主要處理復(fù)雜的SQl查詢(xún),如子查詢(xún),多表聯(lián)查等復(fù)雜查詢(xún),應(yīng)用此種需求時(shí)可以考慮使用,需要的朋友可以參考下2022-11-11SpringBoot淺析安全管理之Spring Security配置
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問(wèn)題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置2022-08-08springboot為異步任務(wù)規(guī)劃自定義線(xiàn)程池的實(shí)現(xiàn)
本文主要介紹了springboot為異步任務(wù)規(guī)劃自定義線(xiàn)程池,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06