使用开源日志框架mzt-biz-log,记录「谁」在「什么时间」对「什么」做了「什么事」
- gitee地址为:gitee.com/yudaocode/m…
引入依赖
<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;
}
}
使用数据库的方式记录日志
//实现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;
}
}