AOP-配合slf4j打印日志

本文介绍了一种利用AOP(面向切面编程)技术实现方法调用日志记录的方法。通过自定义注解@AutoLog,在目标实例或其方法上标注,可以控制是否打印方法参数及返回结果的JSON字符串。此方案采用Spring AOP实现,适用于希望对业务代码进行非侵入式日志记录的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思想

  1. 凡在目标实例上或在目标实例方法(非静态方法)上标注自定义注解@AutoLog,其方法执行时将触发AOP操作;
  2. @AutoLog只有一个参数,用来控制是否打印该方法的参数和返回结果的json字符串,默认不打印,通过@AutoLog(debug= true)开启
  3. 通过AOP拦截方法并打印日志

代码

package com.yan.mssm.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoLog {
    boolean debug() default false;
}
package com.yan.mssm.aop;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Optional;

@Component
@Aspect
public class AutoLogAspectJ {
    private static final String LOG_FORMAT = "[AOP-LOG]->Method {}: {}";
    private static final String BEGIN = "begin";
    private static final String END = "end";
    private static final String PARAMS = "params";
    private static final String RESULT = "result";
    private static Logger LOGGER;

    private static String toJsonString(Object object) {
        ObjectMapper objectMapper = new ObjectMapper();
        String result = null;
        try {
            result = objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            LOGGER.error(e.getMessage());
        }
        return result;
    }

    @Around(value = "@within(com.yan.mssm.aop.AutoLog) || @annotation(com.yan.mssm.aop.AutoLog)")
    public Object test(ProceedingJoinPoint point) throws Throwable {
        Class targetClass = point.getTarget().getClass();
        LOGGER = LoggerFactory.getLogger(targetClass);
        Signature signature = point.getSignature();
        String methodSignature = signature.toString();
        boolean debug = isDebug(targetClass, AutoLog.class, signature.toLongString());
        LOGGER.info(LOG_FORMAT, BEGIN, methodSignature);
        printParams(point, LOGGER, debug);
        Object result = point.proceed();
        printResult(LOGGER, debug, result);
        LOGGER.info(LOG_FORMAT, END, methodSignature);
        return result;
    }

    private void printResult(Logger logger, boolean debug, Object result) {
        if (debug) {
            Optional.ofNullable(result)
                    .ifPresent(o -> logger.info(LOG_FORMAT, RESULT, o));
        }
    }

    private void printParams(ProceedingJoinPoint point, Logger logger, boolean debug) {
        if (debug) {
            Object[] args = point.getArgs();
            if (args.length == 0) {
                return;
            }
            logger.info(LOG_FORMAT, PARAMS, toJsonString(args));
        }
    }

    private boolean isDebug(Class targetClass, Class<AutoLog> autoLogClass, String longMethodSignature) {
        return targetClass.isAnnotationPresent(autoLogClass)
                && ((AutoLog) targetClass.getDeclaredAnnotation(autoLogClass)).debug()
                || Arrays.stream(targetClass.getDeclaredMethods())
                .filter(method -> method.toString().equals(longMethodSignature) && method.isAnnotationPresent(autoLogClass))
                .anyMatch(method -> method.getAnnotation(autoLogClass).debug());
    }

}
"C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:58017,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -javaagent:D:\Idea-2021.2\plugins\java\lib\rt\debugger-agent.jar -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_301\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\rt.jar;E:\huanan_win\cmd_demo\by_remote_service\target\classes;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter-web\2.7.12\spring-boot-starter-web-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter\2.7.12\spring-boot-starter-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot\2.7.12\spring-boot-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter-logging\2.7.12\spring-boot-starter-logging-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\apache-maven-3.6.3\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\apache-maven-3.6.3\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\apache-maven-3.6.3\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\apache-maven-3.6.3\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter-json\2.7.12\spring-boot-starter-json-2.7.12.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\core\jackson-databind\2.13.5\jackson-databind-2.13.5.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.5\jackson-annotations-2.13.5.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.5\jackson-datatype-jdk8-2.13.5.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.5\jackson-datatype-jsr310-2.13.5.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.5\jackson-module-parameter-names-2.13.5.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.12\spring-boot-starter-tomcat-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.75\tomcat-embed-core-9.0.75.jar;D:\apache-maven-3.6.3\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.75\tomcat-embed-el-9.0.75.jar;D:\apache-maven-3.6.3\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.75\tomcat-embed-websocket-9.0.75.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-web\5.3.27\spring-web-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-beans\5.3.27\spring-beans-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-webmvc\5.3.27\spring-webmvc-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-aop\5.3.27\spring-aop-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-context\5.3.27\spring-context-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-expression\5.3.27\spring-expression-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter-websocket\2.7.12\spring-boot-starter-websocket-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-messaging\5.3.27\spring-messaging-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-websocket\5.3.27\spring-websocket-5.3.27.jar;D:\apache-maven-3.6.3\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;D:\apache-maven-3.6.3\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-core\5.3.27\spring-core-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-jcl\5.3.27\spring-jcl-5.3.27.jar;D:\apache-maven-3.6.3\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\apache-maven-3.6.3\repository\com\baomidou\mybatis-plus-generator\3.5.3.1\mybatis-plus-generator-3.5.3.1.jar;D:\apache-maven-3.6.3\repository\cn\hutool\hutool-all\5.4.5\hutool-all-5.4.5.jar;D:\apache-maven-3.6.3\repository\org\springdoc\springdoc-openapi-ui\1.6.14\springdoc-openapi-ui-1.6.14.jar;D:\apache-maven-3.6.3\repository\org\springdoc\springdoc-openapi-webmvc-core\1.6.14\springdoc-openapi-webmvc-core-1.6.14.jar;D:\apache-maven-3.6.3\repository\org\springdoc\springdoc-openapi-common\1.6.14\springdoc-openapi-common-1.6.14.jar;D:\apache-maven-3.6.3\repository\io\swagger\core\v3\swagger-core\2.2.7\swagger-core-2.2.7.jar;D:\apache-maven-3.6.3\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.13.5\jackson-dataformat-yaml-2.13.5.jar;D:\apache-maven-3.6.3\repository\io\swagger\core\v3\swagger-annotations\2.2.7\swagger-annotations-2.2.7.jar;D:\apache-maven-3.6.3\repository\io\swagger\core\v3\swagger-models\2.2.7\swagger-models-2.2.7.jar;D:\apache-maven-3.6.3\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\apache-maven-3.6.3\repository\org\webjars\swagger-ui\4.15.5\swagger-ui-4.15.5.jar;D:\apache-maven-3.6.3\repository\org\webjars\webjars-locator-core\0.50\webjars-locator-core-0.50.jar;D:\apache-maven-3.6.3\repository\com\fasterxml\jackson\core\jackson-core\2.13.5\jackson-core-2.13.5.jar;D:\apache-maven-3.6.3\repository\io\github\classgraph\classgraph\4.8.149\classgraph-4.8.149.jar;D:\apache-maven-3.6.3\repository\mysql\mysql-connector-java\8.0.29\mysql-connector-java-8.0.29.jar;D:\apache-maven-3.6.3\repository\com\google\protobuf\protobuf-java\3.19.4\protobuf-java-3.19.4.jar;D:\apache-maven-3.6.3\repository\org\projectlombok\lombok\1.18.28\lombok-1.18.28.jar;D:\apache-maven-3.6.3\repository\com\baomidou\mybatis-plus-boot-starter\3.4.2\mybatis-plus-boot-starter-3.4.2.jar;D:\apache-maven-3.6.3\repository\com\baomidou\mybatis-plus\3.4.2\mybatis-plus-3.4.2.jar;D:\apache-maven-3.6.3\repository\com\baomidou\mybatis-plus-extension\3.4.2\mybatis-plus-extension-3.4.2.jar;D:\apache-maven-3.6.3\repository\com\baomidou\mybatis-plus-core\3.4.2\mybatis-plus-core-3.4.2.jar;D:\apache-maven-3.6.3\repository\com\baomidou\mybatis-plus-annotation\3.4.2\mybatis-plus-annotation-3.4.2.jar;D:\apache-maven-3.6.3\repository\com\github\jsqlparser\jsqlparser\4.0\jsqlparser-4.0.jar;D:\apache-maven-3.6.3\repository\org\mybatis\mybatis\3.5.6\mybatis-3.5.6.jar;D:\apache-maven-3.6.3\repository\org\mybatis\mybatis-spring\2.0.5\mybatis-spring-2.0.5.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.12\spring-boot-autoconfigure-2.7.12.jar;D:\apache-maven-3.6.3\repository\org\springframework\boot\spring-boot-starter-jdbc\2.7.12\spring-boot-starter-jdbc-2.7.12.jar;D:\apache-maven-3.6.3\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-jdbc\5.3.27\spring-jdbc-5.3.27.jar;D:\apache-maven-3.6.3\repository\org\springframework\spring-tx\5.3.27\spring-tx-5.3.27.jar;D:\apache-maven-3.6.3\repository\ch\qos\logback\logback-classic\1.4.14\logback-classic-1.4.14.jar;D:\apache-maven-3.6.3\repository\ch\qos\logback\logback-core\1.2.12\logback-core-1.2.12.jar;D:\apache-maven-3.6.3\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\Idea-2021.2\lib\idea_rt.jar" com.example.demo.ByRemoteServiceApplication Connected to the target VM, address: '127.0.0.1:58017', transport: 'socket' SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.12) 六月 06, 2025 4:01:55 下午 org.apache.catalina.core.StandardService startInternal 信息: Starting service [Tomcat] 六月 06, 2025 4:01:55 下午 org.apache.catalina.core.StandardEngine startInternal 信息: Starting Servlet engine: [Apache Tomcat/9.0.75] 六月 06, 2025 4:01:55 下午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring embedded WebApplicationContext _ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.4.2
最新发布
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值