日志管理(若依框架)

该博客介绍了如何在Spring Boot中使用线程池处理登录和退出时的日志记录任务,包括登录日志和操作日志的创建、执行以及异常处理。同时,展示了如何通过AOP实现方法上的操作日志记录,并异步提交到数据库。
摘要由CSDN通过智能技术生成

表设计

在这里插入图片描述

登录日志

逻辑:在登录或者退出时创建记录日志的任务,交给线程池执行。

代码分析

注入线程池 bean

/**
 * 执行周期性或定时任务
 */
@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService()
{
    return new ScheduledThreadPoolExecutor(corePoolSize,
            new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build())
    {
        @Override
        protected void afterExecute(Runnable r, Throwable t)
        {
            super.afterExecute(r, t);
            Threads.printException(r, t);
        }
    };
}

登录

com.ruoyi.web.controller.system.SysLoginController#login

​ com.ruoyi.framework.web.service.SysLoginService#login

​ com.ruoyi.framework.manager.AsyncManager#execute

退出(LogoutSuccessHandler接口onLogoutSuccess方法,处理用户登出成功请求)

com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl#onLogoutSuccess

​ com.ruoyi.framework.manager.AsyncManager#execute

LogoutSuccessHandler配置

	class: com.ruoyi.framework.config.SecurityConfig
    /**
     * 退出处理类
     */
    @Autowired
    private LogoutSuccessHandlerImpl logoutSuccessHandler;

	@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception
    {
        ......
        httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
 		......	
    }

任务执行

//异步操作任务调度线程池
private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");

/**
 * 执行任务
 * 
 * @param task 任务
 */
public void execute(TimerTask task)
{
    executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
}

创建任务

	/**
     * 记录登录信息
     * 
     * @param username 用户名
     * @param status 状态
     * @param message 消息
     * @param args 列表
     * @return 任务task
     */
    public static TimerTask recordLogininfor(final String username, final String status, final String message,
            final Object... args)
    {
		......
        return new TimerTask()
        {
            @Override
            public void run()
            {
				.......
                // 插入数据
                SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
            }
        };
    }

操作日志

使用:在方法上使用注解@Log就可以实现记录操作日志的功能

@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user)
{
    ......
    return toAjax(userService.insertUser(user));
}

逻辑:AOP实现,通过后置通知,异常通知来创建记录日志的任务,交给线程池执行。

代码分析

调用栈

com.ruoyi.framework.aspectj.LogAspect#doAfterReturning

com.ruoyi.framework.aspectj.LogAspect#doAfterThrowing

​ com.ruoyi.framework.aspectj.LogAspect#handleLog

​ com.ruoyi.framework.manager.AsyncManager#execute

核心类: com.ruoyi.framework.aspectj.LogAspect

/**
 * 操作日志记录处理
 * 
 * @author ruoyi
 */
@Aspect
@Component
public class LogAspect
{
    // 配置织入点
    @Pointcut("@annotation(com.ruoyi.common.annotation.Log)")
    public void logPointCut()
    {
    }

    /**
     * 处理完请求后执行
     *
     * @param joinPoint 切点
     */
    @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult)
    {
        handleLog(joinPoint, null, jsonResult);
    }

    /**
     * 拦截异常操作
     * 
     * @param joinPoint 切点
     * @param e 异常
     */
    @AfterThrowing(value = "logPointCut()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e)
    {
        handleLog(joinPoint, e, null);
    }

    protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult)
    {
        ......
            // 保存数据库
            AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
        ......
    }

创建任务

/**
 * 操作日志记录
 * 
 * @param operLog 操作日志信息
 * @return 任务task
 */
public static TimerTask recordOper(final SysOperLog operLog)
{
    return new TimerTask()
    {
        @Override
        public void run()
        {
            // 远程查询操作地点
            operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
            // 执行插入操作
            SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
        }
    };
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RuoYi若依管理系统是一个基于SpringBoot的权限管理系统,代码易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用。 RuoYi若依管理系统功能: 1、用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2、部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持权限。 3、岗位管理:配置系统用户所属担任职务。 4、菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5、角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6、字典管理:对系统中经常使用的一些较为固定的数据进行维护。 7、参数管理:对系统动态配置常用参数。 8、通知公告:系统通知公告信息发布维护。 9、操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 10、登录日志:系统登录日志记录查询包含登录异常。 11、在线用户:当前系统中活跃用户状态监控。 12、定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 13、代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 14、系统接口:根据业务代码自动生成相关的api接口文档。 15、服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 16、在线构建器:拖动表单元素生成相应的HTML代码。 17、连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。   RuoYi若依管理系统 更新日志: v4.6.1 新增IE浏览器版本过低提示页面 新增详细信息tab页签方式 新增解锁屏幕打开上次页签 数据监控默认账户密码防止越权访问 新增表格示例(导出选择列) 个人信息添加手机&邮箱重复验证 个人中心刷新后样式问题 操作日志返回参数添加非空验证 velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞 子表模板默认日期格式化 代码生成预览语言根据后缀名高亮显示 代码生成主子表相同字段导致数据问题 升级SpringBoot到最新版本2.2.13 升级shiro到最新版1.7.1 阻止身份认证绕过漏洞 升级bootstrapTable到最新版本v1.18.2 升级bootstrapTable相关组件到最新版本v1.18.2 升级fastjson到最新版1.2.75 升级druid到最新版本v1.2.4 升级oshi到最新版本v5.6.0 修改ip字段长度防止ipv6地址长度不够 搜索建议示例选择后隐藏列表 主子表示例增加初始化数据 优化Excel导入增加空行判断 修复横向菜单无法打开页签问题 修复导入数据为负浮点数时,导入结果会丢失精度问题 优化更多操作按钮左侧移入内容闪现消失情况 修复主子表提交中列隐藏后出现列偏移问题 单据打印网页时通过hidden-print隐藏元素 表格销毁清除记住选择数据 增加表格动态列示例 代码生成选择主子表关联元素必填 tree根据Id和Name选中指定节点增加空判断 其他细节优化
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。您是否在找一套合适后台管理系统。您是否在找一套代码易读易懂后台管理系统。那么,现在若依来了。诚意奉献之作若依是给刚出生的女儿取的名字 寓意:你若不离不弃,我必生死相依内置功能用户管理:用户是系统操作者。部门管理:配置系统组织机构。岗位管理:岗位是用户所属职务。菜单管理:配置系统菜单(支持控制到按钮)。角色管理:角色菜单权限分配。字典管理:对系统中经常使用的一些较为固定的数据进行维护。操作日志:系统操作日志记录(含异常)。登录日志:系统登录情况记录(含异常)。在线用户:当前系统中活跃用户状态监控。连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。为何选择若依是一个完全响应式,基于Bootstrap3.3.6最新版本开发的主题。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。拥有良好的代码结构,层次结构清晰。内置一系列基础功能。操作权限控制精密细致,对所有管理链接都进行权限验证,可控制到按钮。提供在线功能代码生成工具,提高开发效率及质量。提供常用工具类封装,日志、国际化、缓存、验证、字典等数据。兼容目前最流行浏览器(IE7+、Chrome、Firefox)手机移动端也支持。技术选型1、后端核心框架:Spring Boot安全框架:Apache Shiro模板引擎:Thymeleaf持久层框架:MyBatis数据库连接池:Druid缓存框架:Ehcache日志管理:SLF4J工具类:Apache Commons FastjsonPOJO:Lombok2、前端框架:Bootstrap数据表格:Bootstrap Table客户端验证:JQuery Validation树结构控件:zTree弹出层:layer3、平台服务器中间件:SpringBoot内置数据库支持:目前仅提供MySql数据库的支持,但不限于数据库开发环境:Java、Eclipse、Maven、Git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值