SpringBoot中通過AOP整合日誌檔案
阿新 • • 發佈:2021-12-27
SpringBoot中通過AOP整合日誌檔案
1.SpringBoot中通過AOP整合日誌檔案
1.匯入相關的依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <!-- 去掉springboot自帶的日誌,不然會衝突 --> <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"?> <!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration 後面的 status 用於設定 log4j2 自身內部的資訊輸出,可以不設定,當設定成 trace 時,可以看到 log4j2 內部各種詳細輸出--> <configuration status="INFO"> <!--先定義所有的 appender--> <appenders> <!--輸出日誌資訊到控制檯--> <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 才會生效--> <!--root:用於指定專案的根日誌,如果沒有單獨指定 Logger,則會使用 root 作為預設的日誌輸出--> <loggers> <root level="info"> <appender-ref ref="Console"/> </root> </loggers> </configuration>
3.dao層的介面以及實現類
檔案路徑: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("執行了新增方法..."); } @Override public void update() { System.out.println("執行了修改方法..."); } @Override public void delete() { System.out.println("執行了刪除方法..."); } @Override public void query() { System.out.println("執行了查詢方法..."); } }
4.Service層業務實現類
檔案路徑: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層介面控制類
檔案路徑: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.編寫業務類增強類,加入一個日誌檔案記錄
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){
//這個RequestContextHolder是Springmvc提供來獲得請求的東西
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
// 記錄下請求內容
log.info("################URL : " + request.getRequestURL().toString());//獲取請求的地址
log.info("################HTTP_METHOD : " + request.getMethod());//獲取請求的方法
log.info("################IP : " + request.getRemoteAddr());
log.info("################THE ARGS OF THE CONTROLLER : " + Arrays.toString(joinPoint.getArgs()));
/**
* getSignature().getDeclaringTypeName() 是獲取包+類名的
* joinPoint.getSignature.getName() 獲取了方法名
* joinPoint.getTarget() 返回的是需要加強的目標類的物件
* joinPoint.getThis()) 返回的是經過加強後的代理類的物件
*/
log.info("################CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
log.info("################TARGET: " + joinPoint.getTarget());
log.info("################THIS: " + joinPoint.getThis());
System.out.println("方法執行之前...");
}
@After("webLog()")
public void after(){
System.out.println("方法執行之後...");
}
}
7.執行測試,檢視結果
啟動主啟動器類,在瀏覽器中輸入http://localhost:8080/test,檢視控制檯輸出資訊
搞定,結束...
本文來自部落格園,作者:小公羊,轉載請註明原文連結:https://www.cnblogs.com/aadzj/p/15735373.html