1. 程式人生 > 其它 >SpringBoot中通過AOP整合日誌檔案

SpringBoot中通過AOP整合日誌檔案

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