日志记录方案

106 阅读1分钟

使用开源日志框架mzt-biz-log,记录「谁」在「什么时间」对「什么」做了「什么事」

引入依赖

<dependency>
    <groupId>io.github.mouzt</groupId>
    <artifactId>bizlog-sdk</artifactId>
    <version>3.0.6</version>
</dependency>

开启日志记录功能

// tenant可以用来记录系统名称或业务名称
@EnableLogRecord(tenant = "测试日志框架")
public class StartMain implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(StartMain.class);
         application.run(args);
    }

使用实例

/*获取变量内容采用SPEL表达式方式 
获取操作人,实现IOperatorGetService 接口
* type:日志类型
* subType:日志子类型,可用来存储不同操作者的身份
* success:方法调用成功,action记录的信息
* fail:方法调用失败,action记录的信息
* actiion:记录日志内容
* bizNo:业务编号,可直接存储数据ID
* extra:扩展字段,可存储任何信息
* operator:操作人信息
* successCondition:成功的条件,当为true时,记录success内容,为false时,记录fail内容
* _ret:方法返回结果
* _errorMsg:方法抛出的异常信息
* */
@LogRecord(
        subType = "user",
        extra = "{{#order.toString()}}",
        fail = "{{#_errorMsg}}",
        success = "{{#order.purchaseName}},下了一个订单,内部变量:{{#innerOrder.productName}},下单结果为:{{#_ret}}",
        type="1",bizNo = "{{#order.orderId}}",
        successCondition = "{{#_ret==true}}")
@GetMapping("/test6")
public boolean ceateOrder6(Order order){
    if("1".equals(order.getOrderId())){
        throw new RuntimeException("订单创建失败");
    }
    log.info("订单创建成功:{}",order.getOrderId());
    Order order1 = new Order();
    order1.setProductName("手机");
    LogRecordContext.putVariable("innerOrder",order1);
    return true;
}

//获取日志操作人
@Component
public class LogGetUserImpl implements IOperatorGetService {
    @Override
    public Operator getUser() {
        Operator operator = new Operator();
        //获取用户信息
        operator.setOperatorId("小明");
        return operator;
    }
}

image.png

使用数据库的方式记录日志

//实现ILogRecordService接口
@Component
@Slf4j
public class CustomLogServiceImpl implements ILogRecordService {
    
    @Resource
    private LogMapper logMapper;

    ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3,10,60,
            TimeUnit.SECONDS,new ArrayBlockingQueue<>(50),new ThreadPoolExecutor.CallerRunsPolicy());

    @Override
    public void record(LogRecord logRecord) {
        CompletableFuture.runAsync(()->{
            Log log = new Log();
            BeanUtil.copyProperties(logRecord,log);
            log.setId(IdUtil.getSnowflakeNextIdStr());

            log.setClassName(logRecord.getCodeVariable().get(CodeVariableType.ClassName).toString());
            log.setMethodName(logRecord.getCodeVariable().get(CodeVariableType.MethodName).toString());
            int insert = logMapper.insert(log);
            System.out.println(insert);
        },poolExecutor).exceptionally(ex->{
            log.error("保存日志失败",ex);
            return null;
        });

    }

    @Override
    public List<LogRecord> queryLog(String bizNo, String type) {
        return null;
    }

    @Override
    public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) {
        return null;
    }
}