GithubHelp home page GithubHelp logo

ealenxie / aop-log Goto Github PK

View Code? Open in Web Editor NEW
117.0 117.0 54.0 168 KB

项目正式命名为aop-log,基于Spring AOP,ThreadLocal实现方法埋点信息收集与处理。

License: Apache License 2.0

Java 100.00%
aop java log spring-boot

aop-log's People

Contributors

ealenxie avatar lian233 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

aop-log's Issues

traceId

可以增加traceId功能吗?

不打印任何日志

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.4'
    id 'io.spring.dependency-management' version '1.1.4'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.mysql:mysql-connector-j'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    // extend
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
    // Sa-Token 权限认证,在线文档:https://sa-token.cc
    implementation 'cn.dev33:sa-token-spring-boot3-starter:1.37.0'
    implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final'
    implementation 'com.alibaba.fastjson2:fastjson2:2.0.45'
    implementation 'com.github.ealenxie:aop-log:2.5'

}

@Slf4j
@Component
public class AopLogController implements LogCollector {
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void collect(LogData logData) {
        try {
            log.info(objectMapper.writeValueAsString(logData));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            log.error("333");
        }
    }
}

@Slf4j
@Tag(name = "项目管理相关接口")
@RequiredArgsConstructor
@RequestMapping("/project/")
@RestController
@AopLog(tag = "测试接口")
public class ProjectController {


    private final IProjectService projectService;

    @GetMapping("/list")
    private R list(){

        return R.success( projectService.findAll());
    }

    @PostMapping("/submit")
    private R submit(ProjectBaseDTO dto){
        LogData.step("用户添加项目");
        return R.success(projectService.save(dto));
    }


    @PostMapping("/remove")
    private R remove(){
        return  R.success();
    }
}

没有打印日志

解决No thread-bound request found: Are you referring to request attributes outside of an actual web request

DataExtractor代码的getRequest()方法中
在其中使用RequestContextHolder来获取request信息,发现异步调用时,主线程结束后,子线程就获取不到request,会报以上错误信息。
""""
com.fasterxml.jackson.databind.JsonMappingException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. (through reference chain: com.github.LogData["args"]->com.google.gson.internal.LinkedTreeMap[3]->com.google.gson.internal.LinkedTreeMap["request"]->com.sun.proxy.$Proxy163["secure"])
""""
解决办法是: .在开启新线程之前,将servletRequestAttributes设置为子线程共享

/**
 * 获取HttpServletRequest对象
 *
 * @return HttpServletRequest
 */
public static HttpServletRequest getRequest() {
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    RequestContextHolder.setRequestAttributes(attributes,true);//设置子线程共享
    
    return attributes != null ? attributes.getRequest() : null;
}

多层调用有bug

调用链: ServiceA -> ServiceB -> ServiceC

@AopLog(type = "ServiceA", stackTraceOnErr = true)
@service
public class ServiceA implements IServiceA {

@resource
private IServiceB serviceB;

public void execute() {

LogData.step("A-Begin");
...
serviceB.execute();
LogData.step("A-End");

}
}

@AopLog(type = "ServiceB", stackTraceOnErr = true)
@service
public class ServiceB implements IServiceB {

@resource
private IServiceC serviceC;

public void execute() {

LogData.step("B-Begin");
...
serviceC.execute();
LogData.step("B-End");

}
}

@AopLog(type = "ServiceC", stackTraceOnErr = true)
@service
public class ServiceC implements IServiceC {

LogData.step("C-Begin");
...
LogData.step("C-End");
}

结果:

日志 B-End、C-End丢失

怎样获取logData中的Header对象内容

请教一下,在collect里面怎样获取logData中的header内容,header类似是Object,请教一下怎样转换?如header中有自定义的字段,例如"test": "123",怎样获取"test"的值。另外,想获取header其他自定义字段的值,如何设置?

@slf4j
@component
public class AopLogCollector implements LogCollector {
private ObjectMapper objectMapper = new ObjectMapper();

@Override
public void collect(LogData logData) {
    try {
        log.info(objectMapper.writeValueAsString(logData));
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

}

LogData对象里面args对象自动toString

image
在与前端调试的时候发现,LogData对象里面args参数,是String类型的,而不是实际的它对象类型。像是对象toString后的结果。用postman调试的时候是正常的,什么类型就是什么类型,不会是toString后的结果。
请教一下~

Before the method

需要在方法执行之前执行一些操作,目前支持吗?

优化建议

1、经测试,spring spel 表达式对性能影响很大,在tag值为默认值undefined的情况下,该代码会使性能下降40%左右
data.setTag(elSupporter.getByExpression(signature.getMethod(), point.getTarget(), point.getArgs(), aopLog.getTag()).toString());

建议修改如下
if (!aopLog.getTag().equals("undefined")) {
data.setTag(elSupporter.getByExpression(signature.getMethod(), point.getTarget(), point.getArgs(), aopLog.getTag()).toString());
}

2、另,默认的异步线程池队列,对比log4j2的disruptor异步处理性能差异巨大,在比较 asyncMode==true && log4j2 asyn==true 和
asyncMode==false && log4j2 asyn==true的情况下,开启aop-log的异步日志记录对性能的损耗大约占到20%

Bug提交

AopLogProcessor中 if (!aopLog.isLogOnErr() || !data.isSuccess()) 该判断是否是一个bug,理论上应该是 if (!aopLog.isLogOnErr() && !data.isSuccess()) 的关系

日志输出

那如果不加注解的全部输出日志,加注解的不输入日志怎么写

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.