search.png
关于我
menu.png
基于Redis实现的日志记录组件——超实用(1)概述

收录于墨的2020~2021开发经验总结

1、概述

该组件的开发目的,是试图制造一个,能够实时查阅的、高性能的、轻量级、易于使用的日志组件。

在我们的系统开发中,日志无疑是极其重要的一环。没有日志,排查错误、分析用户使用情况、追溯业务事件就无从谈起。

通常,Java web开发中,使用的日志一般是Slf4j。

private final static Logger log = LoggerFactory.getLogger(ProductService.class);

通过使用debug、info、warn、error等方法打印日志。并通过配置xml文件实现日志的归档策略。

但是,这种日志是存储于文件之中。它的体量较大。不利于实时查看。一般情况是下载整个日志文件然后进行搜索和分析。

可以理解为这种日志是比较底层的。

我希望的这种日志组件应该是,按不同的业务功能进行分组,分模块。每个模块单独记录属于它的日志,互不干扰。并且要求日志能够实时的查看,性能还需要快。

Redis映入我的眼帘。正好使用list这种结构来保存日志。

实现的效果如下:

    @RedisLogOpt(component = "product", opt = "查询", spel = "'查询产品' + #params.toString() + ',结果:' + #result.toString()")
    public PageInfo<Product> searchProduct(ProductSearchDto productSearchDto, Pageable pageable) {
        // 某些操作
        return productPage.toPageInfo();
    }

其中spel是spring的spel表达式。这个RedisLogOpt注解标识了该方法所属的组件,执行的操作类型,以及其详细的日志信息。
通过spel表达式,这样的日志配置可以十分的灵活。

使用效果如下:

在这里插入图片描述
在这里插入图片描述

详细的日志:
在这里插入图片描述
在这里插入图片描述

组件在yml文件中配置:

      productComp:
        name: product
        description: product产品增删改查
        expire: 60
        timeUnit: HOURS
        sizeLimit: 1000
        checkProportion: 0.5

从上到下,分别是组件名称、描述、日志的过期时间、日志的过期时间单位、日志的最大大小、日志达到最大大小的多少时进行过期检查。

这些属性,在界面中可以进行编辑,并且实时生效:

在这里插入图片描述
在这里插入图片描述

为了使得页面更加简洁、高性能、轻量,没有使用任何前端组件和框架,直接用h5和原生js写成。

日志除了支持注解方式使用之外,还可以通过注入组件的方式来写日志,例如以下这个定时任务:


    @Resource
    private RedisLogService redisLogService;

    private final AtomicInteger num = new AtomicInteger(0);
   
    @Scheduled(fixedDelay = 500)
    public void createLog() {
        // 半秒写一个日志
        redisLogService.log("test", "定时任务",
                "这是一个测试定时任务,啦啦啦啦啦啦!" + num.getAndIncrement());
    }

通过这种方式,可以使得日志的记录更加的灵活,随心所欲的记录自己想要的内容。

不同的日志会被记录在不同的组件,通过点击“选中”来查看对应组件的日志。

在这里插入图片描述
在这里插入图片描述

如上图,选中的是“test”的组件。

组件的日志会实时刷新,可以配置要呈现的日志区间,和刷新频率,应用之后就会实时生效:

在这里插入图片描述
在这里插入图片描述

未完待续!

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2021年06月30日 21:10:48

评论区#

还没有评论哦,期待您的评论!

关闭特效