一、业务场景

  web项目开发中,经常会有的一个操作是记录请求日志,比如记录请求的IP地址,记录请求的路径,记录请求的参数等等。

每个系统都会根据自己的需要来记录一些请求相关的日志。一般会将记录的日志信息保存到数据库中,以便于查看,如出现异常

高频率的访问请求,或者是遇到其他一些问题都可以查看记录的日志来进行排查问题。如果系统的请求比较少的话,直接记录日志

则没什么问题,可是如果请求量比较大的时候,如何来优化日志记录的操作呢?

二、需求分析

  本篇文章所说的这种方式是使用异步的方式来记录日志。Java代码一般都是同步执行,所谓同步执行,简单理解

就是从上往下执行,必须要等待上一行代码执行完之后,才会执行下一行代码。了解前端的同学应该对异步操作并不

陌生,页面中的很多ajaxx请求大多都是异步执行的,并不一定要等前面一行的代码执行完,后面一行的代码也可以执

行。可是在Java中如何来进行异步操作呢?

三、解决方案

  从当前项目中学习到的方式如下:

  大致的思路是,在web项目中使用拦截器来拦截需要记录日志的请求,在这个拦截器的拦截方法中,获取一个记录日志的任务对象,

对象是多实例的。然后使用这个对象设置一些指定的值,比如请求路径,请求IP,请求求时间信息等等。将这些值设置好之后,在使用

一个工具类来调用方法,传入的参数为这个任务处理类。之后就可以使用异步线程的方式来记录请求的日志数据。自己模仿项目中的方

式写的代码如下:

拦截器中的代码:

@Slf4j
public class LogRecordInterceptor implements HandlerInterceptor{

    @Autowired
    private LogRecordRunnableTask logRecordRunnableTask;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try{
            String requestURL = request.getRequestURL().toString();
            logRecordRunnableTask.setUrl(requestURL);
            logRecordRunnableTask.setRequestTime(CommonUtil.getCurrentDateTime());
            RecordLogRunnableUtils.submit(logRecordRunnableTask);
        } catch (Exception ex) {
            log.error("日志记录异常--->{}", ex);
        }
        return true;
    }
}

注册拦截器bean对象的代码:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    /**
     *  Function:  addInterceptors
     *  Author :  kaye0110,
    *  Version : 1.0
     *  Description : 注册拦截器                            
     *  Param and Description :  
     *  @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logRecordInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

   @Bean
   public LogRecordInterceptor logRecordInterceptor(){
      return  new LogRecordInterceptor();
   }

}

日志任务处理类的代码

@Data
@Component
@Scope("prototype")
public class LogRecordRunnableTask implements Runnable{

    @Autowired
    private LogRecordService logRecordService;

    /*
     * 请求地址
     */
    private String url;

    /*
     * 请求时间
     */
    private String requestTime;

    @Override
    public void run() {
        logRecordService.createLogRecord(url, requestTime);
    }
}

注意:这个类是多实例的,类中实现Runnable接口,重写Run方法,就在这个方法中执行记录日志的操作。

Service接口实现类的代码.

@Slf4j
@Service
public class LogRecordServiceImpl implements LogRecordService {

    @Override
    public void createLogRecord(String url, String recordTime) {
        log.info("url-->{}, recordTime--->{}", url, recordTime);
    }

}

日志记录工具类的代码

@Slf4j
public class RecordLogRunnableUtils {

    private RecordLogRunnableUtils(){}

    private static ExecutorService executor = Executors.newFixedThreadPool(20);

     /* @Description: 执行日志记录操作
      * @author: yilang
      * @date: 2022/7/27 13:03
      * @param: runnable
      * @return: void
      */
    public static void submit(Runnable runnable) {
        try{
            executor.submit(runnable);
        } catch (Exception ex) {
            log.error("执行日志操作异常:{}", ex);
        }
    }
}

简单测试了一下,使用postman一次性发30个请求.

测试结果如下结果符合预期,程序正常执行,后台记录日志的时候是使用多线程的方式来进行处理的。

以后有需要的同学完全可以采用这种方式,来优化日志记录的操作,当访问量越来越大时,这种方式的优点也会提现得更加明显。

以前也有同事使用过其他方式来优化日志记录,首先将请求的日志信息保存在的redis中,然后另外跑一个定时任务定时去取

这些日志信息,如果日志信息大于100条则将其存储在数据库中,并且删除已保存的数据。这样在一定程度上也可以提高日志

记录的效率,如果各位小伙伴还有更好的办法,欢迎留言讨论。

Java异步记录日志-2022新项目的更多相关文章

  1. mybatis-拦截器实际应用-替换表名-2022新项目

    一.业务场景 考虑到新项目中部分与业务数据相关的表在后期数据量会比较大,架构师在最开始设计项目中与业务数据相关的表时,就已经考虑使用分表来 进行处理,给业务数据相关的每张表都添加统一批次的后缀,查询这 ...

  2. 项目开发中Maven的单向依赖-2022新项目

    一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...

  3. Java中list集合自定义排序-2022新项目

    一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...

  4. git实战-多分支开发-2022新项目

    现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...

  5. 无法访问mybatis.dto.StudengInVO-使用maven编译报错-2022新项目

    一.问题由来 最近一次拉代码后,合并代码然后进行编译时出现一个问题,使用maven在进行编译的时候报一个错,无法访问mybatis.dto.StudengInVO. 突然出现这个错误让自己感觉很奇怪, ...

  6. redis缓存恢复-2022新项目

    一.业务场景 Web项目开发中,为了加快数据处理的的效率,大量的使用了各种缓存,缓存技术主要使用的是redis.导致出现的小小的 问题是对redis缓存形成了一个比较强的依赖,并且有的数据暂时是没有同 ...

  7. 程序包 applets.user.service.UserService 不存在-2022新项目

    一.问题由来 接上一篇文章使用maven进行打包时报中文乱码错误,经过多次尝试后最终解决问题,显示出真正的错误信息如下: 程序包 applets.user.service.UserService 不存 ...

  8. postgresql使用group by进行数据去重-2022新项目

    一.业务场景 数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重. 比如进行统计查询的时候,可以这样写 select count(d ...

  9. “快的打车”创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - V2EX

    "快的打车"创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - ...

随机推荐

  1. 力扣算法JS LC 59-螺旋矩阵2,LC 152-乘积最大子数组

    LC 59-螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3输出:[[1,2 ...

  2. C\C++白嫖学习

    一.C语言的学习     推荐B站的郝斌老师的C语言教程,播放量可观.注意在学习前可在评论区"找宝藏". 大家可能也知道B站的小甲鱼,个人感觉内容不够优质,讲得有点粗糙,讲的故事有 ...

  3. Centos7 安装 MPICH

    查看官网版本 https://www.mpich.org/downloads/ 最新的stable release是mpich 4.0.2,复制下载链接. 安装依赖 mpich需要系列依赖,如果不确定 ...

  4. CF1681F Unique Occurrences

    题意:一棵树,问每条路径上只出现一次的值的个数的和. 思路: 显然想到考虑边贡献.每条边权下放到下面的哪个点.\(up_i\)为上面第一个点权等于它的点.我们需要一个子树内点权等于它的点(如果满足祖孙 ...

  5. Python 多道技术以及进程、线程和协程

    多道技术 并发:看起来像同时运行 并行:真正意义上的同时运行,并行肯定是并发 空间的复用与时间复用 空间复用 多个程序用一套计算机硬件 时间复用 程序切换节省时间 ''' 切换(cup)分为两种情况 ...

  6. java对象与Json字符串之间的转化

    public class Test { public static void main(String[] args) { // 实现java对象与Json字符串之间的转化 // 1. Person对象 ...

  7. k8s client-go源码分析 informer源码分析(5)-Controller&Processor源码分析

    client-go之Controller&Processor源码分析 1.controller与Processor概述 Controller Controller从DeltaFIFO中pop ...

  8. Sentinel与OpenFeign 服务熔断那些事

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 在上一篇中,我们讲解了 Senti ...

  9. 阿里巴巴开源限流组件Sentinel初探

    1 Sentinel主页 https://github.com/alibaba/Sentinel/wiki/主页 1.1 Sentinel介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要. ...

  10. .NET中测试代码运行时间

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月29日. 计算代码运行的时间,除了呆萌地用秒表去计时,或者可以通过Visual Studio来查看,还可以在.NET代码中使用St ...