首页 > 解决方案 > 将@Around 方面应用于@Slf4j

问题描述

是否可以将方面应用于 Maven 依赖项?我的项目中还有其他方面可以正常工作,但是当我尝试将这一方面应用于@Slf4j记录器时,它会被跳过。我确定切入点是ch.qos.logback.classic.Logger.*通过调试并进入 log.info 调用,但它仍然不会触发方面。是否有在依赖项上启用它的设置?

其他被注释掉的切入点是我尝试过的切入点,但它们要么导致 bean 无法创建(它们没有资格被 bean 后处理器处理),要么不做任何事情。

@Aspect
@Component
public class LoggingAspect {

    @Around("execution(* ch.qos.logback.classic.Logger.*(..))"// && " +
//            "execution(* lombok.*(..)) && " +
//            "execution(* org.slf4j.*(..)) && " +
//            "execution(* org.slf4j.Logger.*(..)) "
    )
    public Object prependBridgeRunId(ProceedingJoinPoint jp) throws Throwable {
        //get original args
        Object[] args = jp.getArgs();

        for (int i = 0; i < args.length; i++) {
            Object raw = args[i];
            if (raw instanceof String) {
                // and replace it with a new value
                args[i] = "{\"bridgeRunId\": " + GlobalConstants.getBridgeRunId() + "}" + raw;
            }
        }

        //execute original method with new args
        return jp.proceed(args);
    }
}
<dependencyManagement>
        <dependencies>
            <!-- Sleuth automatically adds trace interceptors when in the classpath -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-sleuth</artifactId>
                <version>${sleuth.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>net.logstash.logback</groupId>
                <artifactId>logstash-logback-encoder</artifactId>
                <version>${logstash.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>

        <!--FOR TRUSTING SELF SIGNED CERTS-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>
        <!--FOR TRUSTING SELF SIGNED CERTS-->

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</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-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>

        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>com.vaadin.external.google</groupId>
                    <artifactId>android-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>${avro.version}</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.24</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-json-org</artifactId>
            <!-- <version>2.9.7</version> -->
            <exclusions>
                <exclusion>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core -->
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>3.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.immutables</groupId>
            <artifactId>value</artifactId>
            <version>${immutables.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
        <!-- JSON LOGBACK CONFIG -START -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- ch.qos.logback.contrib.jackson.JacksonJsonFormatter -->
        <dependency>
            <groupId>ch.qos.logback.contrib</groupId>
            <artifactId>logback-jackson</artifactId>
            <version>${logback.contrib.version}</version>
        </dependency>
        <!-- ch.qos.logback.contrib.json.classic.JsonLayout -->
        <dependency>
            <groupId>ch.qos.logback.contrib</groupId>
            <artifactId>logback-json-classic</artifactId>
            <version>${logback.contrib.version}</version>
        </dependency>
        <!-- JSON LOGBACK CONFIG -END -->
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.8.RC1</version>
            <scope>runtime</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.8.RC1</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <reporting>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>${maven.checkstyle.version}</version>
                <configuration>
                    <configLocation>google_checks.xml</configLocation>
                </configuration>
                <reportSets>
                    <reportSet>
                        <reports>
                            <report>checkstyle</report>
                        </reports>
                    </reportSet>
                </reportSets>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>${maven.info.report.version}</version>
                <configuration>
                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                </configuration>
            </plugin>
        </plugins>
    </reporting>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!--                <includes>-->
                <!--                    <include>**/*.json</include>-->
                <!--                </includes>-->
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>something.else.BusinessRules</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>${avro.version}</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>${project.basedir}/src/main/resources/avro</sourceDirectory>
                            <outputDirectory>${project.build.directory}/</outputDirectory>
                            <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.7</version>
                <configuration>
                    <complianceLevel>11</complianceLevel>
                    <source>11</source>
                    <target>11</target>
                    <showWeaveInfo>true</showWeaveInfo>
                    <verbose>true</verbose>
                    <Xlint>ignore</Xlint>
                    <encoding>UTF-8</encoding>
                    <weaveDependencies>
                        <weaveDependency>
                            <groupId>ch.qos.logback</groupId>
                            <artifactId>logback-classic</artifactId>
                        </weaveDependency>
                    </weaveDependencies>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!-- use this goal to weave all your main classes -->
                            <goal>compile</goal>
                            <!-- use this goal to weave all your test classes -->
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

标签: springaspectjslf4j

解决方案


我不认为旧的 Mojohaus 插件版本甚至支持 Java 11,Java 8 应该是最大的。请使用更新的版本 (1.14.0) 或者 - 甚至更好 - 切换到我自己的 fork,我在维护 AspectJ 本身的同时维护它:https ://github.com/dev-aspectj/aspectj -maven插件。版本 1.13.1 支持 Java 17,并且可以配置为也支持未来的 Java 和 AspectJ 版本,而无需更新插件。Eclipse 和 IntelliJ IDEA 的工具也适用于这个插件。

此外,当为第三方库使用编译后二进制编织时,请注意编织文件最终会在您的 Maven 模块的目标目录中并与您的工件一起打包的事实。为了避免在类路径上同时存在同一类文件的编织和非编织变体,请确保在运行时不依赖原始文件,或者只是在单独的 Maven 模块中进行二进制编织,然后依赖该模块而不是原来的图书馆。那将是最干净的解决方案。

作为编译后编织的替代方案,您可以简单地使用加载时编织,如 Spring 手册,将 AspectJ 与 Spring 应用程序一起使用一章中所述。那么你根本不需要使用 AspectJ Maven Plugin,只要你坚持基于注解的语法,并且根本不使用原生的 Aspectj 语法。

顺便说一句,无论您使用编译后编织还是加载时编织,都不需要将方面声明为 Spring @Component。这甚至可能产生 Spring 尝试将其作为 Spring AOP 方面应用的负面影响,即使它已经被编织为原生 AspectJ 方面。


推荐阅读