qqxx6661 / log-record

使用注解优雅记录系统日志,操作日志,后端埋点等,支持SpEL表达式,自定义上下文,自定义函数,实体类DIFF等其他高阶处理。
Apache License 2.0
916 stars 173 forks source link

如何实现LogRecordContext.putGlobalVariable这个操作 #70

Closed PzTao closed 1 year ago

PzTao commented 1 year ago

LogRecordContext.putVariable其他方法获取不到,是否存在LogRecordContext.putGlobalVariable这种操作呢

qqxx6661 commented 1 year ago

LogRecordContext是线程级别共享的。能否提供一下你的实际使用方式,确认下是不是跨线程使用了?

如果确实需要跨线程使用,目前的LogRecordContext是不支持的,目前正在使用TransmittableThreadLocal改造。

目前开放了 “日志处理线程池前置处理” 特性。在README中有提到,看下能否满足需求:

在使用线程池处理包装好的日志之前,很多人有一些特殊逻辑需要插入,比如将traceId放入上下文,这里开放接口在logDTO发送给线程池前允许加入用户自定义逻辑。

使用方式如下,添加SpringBean覆写LogRecordThreadWrapper

@Slf4j
@Configuration
public class LogRecordConfig {

    @Bean
    public LogRecordThreadWrapper logRecordThreadWrapper() {
        return new LogRecordThreadWrapper() {
            @Override
            public Runnable createLog(Consumer<LogDTO> consumer, LogDTO logDTO) {
                log.info("Before send createLog task to LogRecordThreadPool. Current thread [{}]", Thread.currentThread().getName());
                return LogRecordThreadWrapper.super.createLog(consumer, logDTO);
            }
        };
    }

}
PzTao commented 1 year ago

1 2 3 当我在红框方法(第二张图)上使用 @OperationLog(bizId = "#bizId",bizType = "''",msg = "''") 就会导致第三张图片处获取不到bizId,去掉则能正常获取

qqxx6661 commented 1 year ago

1 2 3 当我在红框方法(第二张图)上使用 @OperationLog(bizId = "#bizId",bizType = "''",msg = "''") 就会导致第三张图片处获取不到bizId,去掉则能正常获取

putVariable写在哪里了?还是说你想拿的是注解上的bizId

PzTao commented 1 year ago

1 2 3 当我在红框方法(第二张图)上使用 @OperationLog(bizId = "#bizId",bizType = "''",msg = "''") 就会导致第三张图片处获取不到bizId,去掉则能正常获取

putVariable写在哪里了?还是说你想拿的是注解上的bizId

放在了最外层,id里的bizId也是从LogRecordContext获取的