SpringBoot統合AOP機能によるログ印刷

20923 ワード

プロジェクトの作成中に、必要に応じてログを印刷する必要がありますが、開発者ごとにログの印刷フォーマットが異なり、プロジェクトにさまざまなログフォーマットが存在します.ログの抽出が困難な場合は、ログの印刷フォーマットを統一する必要があります.
AOPとは?
AOP(Aspect Oriented Programming)は、フェースプログラミング向けであり、OOP(Object Oriented Programming、オブジェクトプログラミング向け)の継続であり、OOPのステップである.JavaのSpringではAopが重要視される.
AOPは何ができるの?
AOPは私たちに大きな便利をもたらすことができて、AOPを利用して業務を隔離することができて(例えば:登録に対する統一的な検査)、業務間の結合の程度を下げて、プロジェクトの中の重複コードを減らすことができて、大いにプロジェクトの再利用性と開発効率を高めました.それは主にログの統一管理、安全検証、各種インタフェースの要求統計、異常に対する処理を使用します.
AOPの共通注記
@Aspect:このクラスを注釈クラスとして宣言します;@Pointcut:接点を定義し、後に式に従います.式は注釈をカットするか、packageの下をカットする方法として定義できます;@Before:接点の前に関連コードを実行します;@After:接点の後に関連コードを実行します;@AfterReturning:接点が内容を返した後に関連コードを実行します,@AfterThrowing:実行されたコードが異常を放出した後の論理処理を処理する,@Around:折り返し,切り込み点の前後でコードを実行でき,切り込み点がいつ実行されるかを自由に制御できる;
どのようにAOPを実現しますか?
ログ印刷の実装を例に挙げてみましょう.注意:Lombok機能を使用する必要があります.まずLombokプラグインをインストールすることをお勧めします.
package com.example.demo.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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;


@Aspect
@Component
@Slf4j
public class RequestAspect {

    @Pointcut("execution(public * com.example.demo.controller.*.*(..))")
    public void log(){
    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes sra=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request=sra.getRequest();
        //    

        log.info ("controller {}.{}       ... 
: {}"
, joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); } }

完全なpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0modelVersion>

   <groupId>com.examplegroupId>
   <artifactId>demoartifactId>
   <version>0.0.1-SNAPSHOTversion>
   <packaging>jarpackaging>

   <name>demoname>
   <description>Demo project for Spring Bootdescription>

   <parent>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-parentartifactId>
      <version>1.5.9.RELEASEversion>
      <relativePath/> 
   parent>

   <properties>
      <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
      <java.version>1.8java.version>
   properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-aopartifactId>
      dependency>
      <dependency>
         <groupId>org.projectlombokgroupId>
         <artifactId>lombokartifactId>
         <version>1.16.18version>
         <scope>providedscope>
      dependency>

      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-webartifactId>
      dependency>
      <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-testartifactId>
         <scope>testscope>
      dependency>
   dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
         plugin>
      plugins>
   build>
project>

まとめ
以上の簡単な実践により、AOP機能を用いてログの統一印刷を完了することができ、ログ印刷の混乱によるログ分析を行う際に、より速く問題を見つけることができないことを回避することができる.