微服务版工程日志记录(AOP记录操作日志(笔记))

这篇博客介绍了如何在微服务架构下,利用Spring AOP记录操作日志,并通过Feign将日志传递到专门的日志服务。首先,讨论了系统服务的日志存储设计,包括POJO、DAO、Service和Controller的实现,并通过Postman进行了测试。接着,详细阐述了资源服务如何利用AOP无侵入地捕获日志,并通过Feign客户端将日志发送到系统服务,涉及五个步骤,包括Feign的配置和接口定义。
摘要由CSDN通过智能技术生成

基于AOP(面向切面)记录操作日志

一 、系统服务中的日志存储设计

pojo 逻辑实现

创建Log对象,基于此对象封装用户行为日志

package com.jt.system.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
/**
 * 基于此对象封装用户行为日志
 * 谁在什么时间执行了什么操作,访问了什么方法,传递了什么参数,访问时长是多少.
 */
@Data
@TableName("tb_logs")
public class Log implements Serializable {
   
    private static final long serialVersionUID = 3054471551801044482L;
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String operation;
    private String method;
    private String params;
    private Long time;
    private String ip;
    @TableField("createdTime")
    private Date createdTime;
    private Integer status;
    private String error;
}

dao 逻辑实现

package com.jt.system.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.system.pojo.Log;
import org.apache.ibatis.annotations.Mapper;

/**
 * 用户行为日志数据层对象
 */
@Mapper
public interface LogMapper extends BaseMapper<Log> {
   
	//有自己特有方法时,可在这里添加
}

创建测试类测试将日志持久化到数据库

package com.jt;

import com.jt.system.dao.LogMapper;
import com.jt.system.pojo.Log;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
public class LogMapperTests {
   
    @Autowired
    private LogMapper logMapper;
    @Test
    void testInsert(){
   
        //构建用户行为日志对象(基于此对象存储一些用户行为日志,先用假数据)
        Log log = new Log();
        log.setUsername("cgb2107");
        log.setIp("10.10.10.10");
        log.setOperation("查询资源");
        log.setMethod("pkg.ResourceController.doSelect");
        log.setParams("");
        log.setStatus(1);
        log.setTime(100L);
        log.setCreatedTime(new Date());
        //将日志持久化到数据库
        logMapper.insert(log);

    }
}

service 逻辑实现

service接口

package com.jt.system.service;

import com.jt.system.pojo.Log;

/**
 * 用户行为日志业务逻辑接口定义
 */
public interface LogService {
   
    /**
     * 保存用户行为日志
     * @param log
     */
    void insertLog(Log log);
}

serviceImpl实现类

package com.jt.system.service;

import com.jt.system.dao.LogMapper;
import com.jt.system.pojo.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class LogServiceImpl implements LogService{
   

    @Autowired
    private LogMapper logMapper;

    /**
     * @Async注解描述的方法,底层会异步执行
     * 不由web服务线程执行,而是交给spring自带的线程池中的线程去执行
     * (但是@Async注解,要想起作用,有个前提: 需要在启动类上添加异步执行注解@EnableAsync)
     * 优点: 不会长时间阻塞web服务(tomcat)线程
     * @param log
     */
    @Async
    @Override
    public void insertLog(Log log) {
   
        logMapper.insert(log);
    }
}

controller 逻辑实现

package com.jt.system.controller;

import com.jt.system
可以使用拦截器(Interceptor)来实现微服务AOP记录登录设备ID、登录IP和登录地址。在拦截器中,可以通过HttpServletRequest对象获取登录设备ID、登录IP和登录地址等信息,然后将这些信息记录日志中或者存储到数据库中。 以下是一个示例代码: ```java public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取登录设备ID String deviceId = request.getHeader("deviceId"); // 获取登录IP String ip = request.getRemoteAddr(); // 获取登录地址 String address = getAddressByIp(ip); // 记录登录信息 log.info("用户登录,设备ID:{},IP:{},地址:{}", deviceId, ip, address); return true; } private String getAddressByIp(String ip) { // 根据IP地址获取地理位置信息 // TODO:实现获取地理位置信息的逻辑 return ""; } } ``` 在使用时,需要将LoginInterceptor注册到微服务的拦截器链中。例如,在Spring Boot中可以通过@Configuration注解和WebMvcConfigurer接口来实现: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); } } ``` 这样,当有请求进入微服务时,LoginInterceptor会被拦截器链调用,从而实现记录登录设备ID、登录IP和登录地址的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值