【SaaS - Export项目】系统日志管理(检测频繁登录,异地登录 ) 分页优化 AOP应用场景之日志记录

系统日志管理

分析

1.记录用户访问的Controller 和 用户的IP
两个功能一个是分页显示,保存日志
在这里插入图片描述
2.数据组成

1.设置登录用户信息 seesion获取
java User user = (User)session.getAttribute(“loginUser”);
2.设置企业信息 IP地址 request获取 request.getLocalAddr()方法
3. 设置记录时间 new Date()
4.执行的方法名称 增强方法获取
jp.getSignature().getName()
5. 执行的类名称
jp.getTarget().getClass().getName()

步骤

1.分析逻辑
2.创建实体类
3.开始编写测试
4.完成测试,实现逻辑
5.使用AOP来进行日志记录

SysLog

public class SysLog {
    private String id            ;
    private String userName      ;
    private String ip            ;
    private Date time          ;
    private String method        ;
    private String action        ;
    private String companyId     ;
    private String companyName   ;
    }

TestSysLogService

分页 添加日志

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:spring/applicationContext-*.xml")
public class TestSysLogService {
    private static final Logger l = LoggerFactory.getLogger(TestSysLogService.class);
    @Autowired
    ISysLogService iSysLogService;
    @Test
    public void test01(){
        //分页列表
        //页面上显示分页列表,就要求业务方法中提供查询PageInfo的方法
        PageInfo<SysLog>  pi= iSysLogService.findByPage(1,3,"1");
        l.info("pi = "+pi);
    }
    
  @Test
    public void test02(){

      //将一个表单数据保存在javaBean中,再将javaBean存到数据库
      SysLog sysLog = new SysLog();
        //设置登录用户信息
      sysLog.setUserName("老八");
        //设置企业信息
      sysLog.setCompanyId("1");
      sysLog.setCompanyName("吉首大学");
        //IP地址
      sysLog.setIp("192.168.10.11");
        //设置记录时间
      sysLog.setTime(new Date());
        //执行的方法名称
      sysLog.setMethod("toList");
        //执行的类名称
      sysLog.setAction("com.zx.web.company.CompanyController");

      sysLog.setCompanyId("1");
      sysLog.setCompanyName("吉首大学");
      iSysLogService.saveSysLog(sysLog);

    }


}

ISysLogService

public interface ISysLogService {
    PageInfo<SysLog> findByPage(int curr, int pageSize, String companyId);
    void saveSysLog(SysLog sysLog);
}

SysLogServiceImpl

@Service
public class SysLogServiceImpl implements ISysLogService {
    //service调用dao
    @Autowired
    ISysLogDao iSysLogDao;
    @Override
    public PageInfo<SysLog> findByPage(int curr, int pageSize, String companyId) {
        //设置参数,拿到start =(curr-1)*pageSize
        PageHelper.startPage(curr,pageSize);
        //调用全查
        List<SysLog> list = iSysLogDao.findAll(companyId);
        //包装成PageInfo
        PageInfo<SysLog> pi = new PageInfo<>(list);
        return pi;
    }

    @Override
    public void saveSysLog(SysLog sysLog) {
        String uuid= UUID.randomUUID().toString();
        sysLog.setId(uuid);
        iSysLogDao.save(sysLog);
    }
}

ISysLogDao

public interface ISysLogDao {
    List<SysLog> findAll(String companyId);
    void save(SysLog sysLog);
}

ISysLogDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--namespace: 需要映射的Dao接口类型-->
<mapper namespace="com.wzx.dao.system.syslog.ISysLogDao">
    <!-- 配置映射 字段-->
    <resultMap id="syslogMap" type="sysLog">
        <id column="id"           property="id"          />
        <result column="user_name"    property="userName"    />
        <result column="ip"           property="ip"          />
        <result column="time"         property="time"        />
        <result column="method"       property="method"      />
        <result column="ACTION"       property="action"      />
        <result column="company_id"   property="companyId"   />
        <result column="company_name" property="companyName" />
    </resultMap>
<!--    List<SysLog> findAll(String companyId);-->
    <select id="findAll" parameterType="string" resultMap="syslogMap">
        select * from st_sys_log where company_id =#{companyId} order by time desc
    </select>
<!--    void save(SysLog sysLog);-->
    <insert id="save" parameterType="sysLog">
    insert into st_sys_log
        (
        id            ,
        user_name     ,
        ip            ,
        time          ,
        method        ,
        ACTION        ,
        company_id    ,
        company_name
        )
        values
        (
        #{id            },
        #{userName      },
        #{ip            },
        #{time          },
        #{method        },
        #{action        },
        #{companyId     },
        #{companyName   }
        )
    </insert>
</mapper>

SysLogController

@Controller
@RequestMapping("/system/syslog")
public class SysLogController extends BaseController {
    private static final Logger l = LoggerFactory.getLogger(SysLogController.class);

    @Autowired
    ISysLogService iSysLogService;



    @RequestMapping(path = "/toList", method = {RequestMethod.GET, RequestMethod.POST})
    public String toList(@RequestParam(defaultValue = "1") int curr, @RequestParam(defaultValue = "3") int pageSize) {
        //调查询分页列表的方法
        PageInfo<SysLog> pi = iSysLogService.findByPage(curr, pageSize, getLoginCompanyId());
        //将pi添加到页面
        request.setAttribute("pi", pi);
        return "system/syslog/log-list";
    }
}

分页优化

只显示开始当前页的后五页 ,结尾当前页的前五页

<c:forEach begin="${pi.pageNum-5 <= 0 ? 1:pi.pageNum-5 }" end="${pi.pageNum+5>pi.pages?pi.pages:pi.pageNum+5}"
                   var="i">
            <li class="paginate_button ${pi.pageNum==i ? 'active':''}"><a href="javascript:goPage(${i})">${i}</a></li>
        </c:forEach>

Aop记录日志

介绍

AOP ,Aspect Oritentd Programing 面向切面编程
本质就是在不改变代码的基础上生成动态代理类(新类)
应用场景
》日志记录(今天用到的)
》事务管理
》权限管理
》性能数据记录
在这里插入图片描述

步骤

1.编写Spring mvc 打开AOP事务
2.编写LogAspect
3.存储日志信息

开启Aop自动代理

添加aop的标签声明

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

开启AOP切面注解

<!--: 整个项目扫描有没有@Aspect注解-->
    <aop:aspectj-autoproxy/>

LogAspect

@Aspect
@Component   //不是Controller Service Repository
public class LogAspect {
    private Logger logger= LoggerFactory.getLogger(LogAspect.class);

     //要对所有的Controller包下的类的方法进行配置(每一个方法都有可能是切入点方法)
    //指定  Controller包名,以及其子包
    @Around(value = "execution(* com.zx.web.controller..*.*Controller.*(..))")
    public  Object writeLog(ProceedingJoinPoint jp) {
        // jp表示Controller中的任意方法 toList toAdd toUpdate add update delete
        //逻辑
        Object result = null;//返回一个表示页面的字符串,也可通是json数据
        try {
            //前置
            result = jp.proceed();//执行
            //后置
            //保存日志
            logger.info("切面:writeLog");
            saveSysLog(jp);
        } catch (Throwable e) {
            //异常
        } finally {
            //最终
        }
        return result;
    }

存储日志信息

信息获取方法

1.设置登录用户信息 seesion获取
java User user = (User)session.getAttribute(“loginUser”);
2.设置企业信息 IP地址 request获取 request.getLocalAddr()方法
3. 设置记录时间 new Date()
4.执行的方法名称 增强方法获取
jp.getSignature().getName()
5. 执行的类名称
jp.getTarget().getClass().getName()

 private void saveSysLog(ProceedingJoinPoint jp) {
        @Autowired
        ISysLogService iSysLogService;

        //登录成功之后session中是保存一个user对象的
        @Autowired
        HttpSession session;

        //request对象可以直接获取对方浏览器的IP
        @Autowired
        HttpServletRequest request;
        private void saveSysLog (ProceedingJoinPoint jp){
            //将一个表单数据保存在javaBean中,再将javaBean存到数据库
            SysLog sysLog = new SysLog();

            User user = (User) session.getAttribute("loginUser");
            if (user != null) {
                //设置登录用户信息
                sysLog.setUserName(user.getUserName());
                //设置企业信息
                sysLog.setCompanyId(user.getCompanyId());
                sysLog.setCompanyName(user.getCompanyName());
            }

            //IP地址  request.getLocalAddr()获取请求中的ip地址
            sysLog.setIp(request.getLocalAddr());
            //设置记录时间
            sysLog.setTime(new Date());

            //执行的方法名称  jp.getSignature() 当前执行的方法 toList
            sysLog.setMethod(jp.getSignature().getName());

            //执行的类名称 jp.getTarget()目标对象
            sysLog.setAction(jp.getTarget().getClass().getName());

            l.info("saveSysLog sysLog " + sysLog);
            iSysLogService.saveSysLog(sysLog);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,需要明确一下概念: - Gateway(网关)通常是指微服务架构中的 API 网关,它是微服务架构的入口,可以统一处理请求和响应,包括负载均衡、服务发现、认证授权、限流熔断等功能。 - AOP(面向切面编程)是一种编程范式,它通过将通用的横切关注点(如日志、事务、安全等)与业务逻辑分离,将这些关注点在代码中重复的部分抽象出来,实现了代码的模块化和可重用性。 下面是 Gateway 和 AOP 记录系统日志的优缺点比较: Gateway 记录系统日志的优缺点: - 优点: - 统一入口:作为微服务架构的入口,可以统一处理请求和响应,并记录每一个请求的日志,方便跟踪问题。 - 分布式环境下的日志:在分布式环境下,Gateway 可以将多个微服务的日志聚合在一起,方便进行全局日志分析。 - 缺点: - 记录的是请求级别的日志,无法记录每个方法或函数的详细日志。 - 日志会受到 Gateway 的性能影响,因此需要在性能和日志记录之间做出权衡。 AOP 记录系统日志的优缺点: - 优点: - 细粒度:可以在方法或函数级别记录详细的日志,对于问题的定位和排查更加方便。 - 解耦:AOP 的切面与业务逻辑分离,不会对业务逻辑产生侵入,便于维护和升级。 - 缺点: - 记录日志分散在各个微服务中,需要进行日志的聚合和分析。 - 如果 AOP 切面的实现不当,可能会对性能产生影响。 综合来看,Gateway 和 AOP 记录系统日志各有优缺点,可以根据具体情况选择适合的方式。如果是需要记录每个方法或函数的详细日志,可以选择 AOP 记录系统日志;如果是需要统一处理请求和响应,并记录每一个请求的日志,可以选择 Gateway 记录系统日志

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jon_hao

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值