SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现

Java33

针对业务开发人员通常面对的业务需求,我们将日志分为操作(请求)日志和系统运行日志,操作(请求)日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作,便于分析统计用户行为;系统运行日志又分为不同的级别(Log4j2): OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,这些日志级别由开发人员在代码编写时确定,并编写在代码中,系统运行时记录,方便系统开发人员分析定位解决问题,查找系统性能瓶颈。
我们可以自定义注解利用AOP拦截Controller请求实现系统(日志)操作日志的记录,系统运行日志可以使用log4j2或者logback。在SpringCloud微服务架构下,可以使用Gateway统一记录操作(请求)日志,由于微服务分布式集群部署,同一服务也存在多个,这里的日志追踪就需要借助Skywalking和ELK来实现具体的追踪分析记录。
由于最近爆发的log4j2和logback的漏洞问题,请选择最新修复漏洞的版本。根据网上很多性能的对比,log4j2显著优于logback,所以我们将SpringBoot默认的日志Logback修改为Log4j2。
在设计框架时,尽量考虑日志系统的使用场景,将日志系统的实现设计为可动态配置,然后根据业务需求选择合适的日志系统。根据常见的业务需求,我们临时实现微服务日志系统如下:

[En]

When designing the framework, we consider the usage scenario of the log system as much as possible, design the implementation of the log system as dynamically configurable, and then choose the appropriate log system according to the business requirements. According to the common business requirements, we temporarily implement the micro-service log system as follows:

操作日志:
  • 使用AOP特性,自定义注解拦截Controller请求实现系统操作日志
    优势:实现简单,通过注解即实现记录操作日志。
    缺点:需要硬编码到代码中,灵活性差。
  • 在网关Gateway通过读取配置,统一记录操作日志
    优势:可配置,实时更改需要记录哪些操作日志。
    缺点:配置实现稍复杂。

操作日志分为两种实现方式,各有优劣,不管哪种实现方式,日志记录都通过Log4j2来记录,通过Log4j2的配置,可动态选择记录到文件、关系型数据库MySQL、NoSQL数据库MongoDB、消息中间件Kafka等。

系统日志:
  • Log4j2记录日志,ELK采集分析展示
    系统日志我们就采取通用的日志记录方式即可,通过Log4j2记录到日志文件,在通过ELK采集分析展示。
输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

Java基础常见知识&面试题总结(中)

Java基础常见知识&面试题总结(中) 泛型 Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了...
Java

平台接口建设规范

建设目标 平台接口建设规范旨在界定接口开发、测试和使用的框架边界,定义技术目标和要求,并提供完整的接口文档,为自有平台和第三方平台提供数据和服务支持。[En]The platform interfac...
Java

Java se

一些需要注意的点 ConcurrentHashMap CAS是乐观锁 CopyOnWriteArrayList的add方法
Java

Mybaits plus 数据库映射java实体三种方式

前言 数据库一般是用下划线进行设计字段,Java实体一般用驼峰法设计属性。这是不成文的规定。当数据库字段映射java实体会出现问题。下面分别是数据库字段和实体属性。 解决问题三种方式 1.利用mysq...
Java

Java 面试题集锦

第一阶段 1、重载(overload)和重写(overwrite)区别 重写:子类继承父类,子类重写父类的方法。 重载: 2、StringBuffer、StringBuilder、String 区别 ...
Java

关于Collection和Map的笔记

这两个在日常节目中使用得太频繁了,所以或多或少有必要把它们录下来,以便在需要时可以翻阅。[En]These two are used too frequently in daily programmi...
Java

Integer包装类中值的比较

前提知识:"=="当比较基本类型时比较的是值,当为引用类型时比较的是内存地址 首先看代码和结果: Integer integer1 = new Integer(1); Integer integer2...
Java

spring多数据源配置笔记

本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源。 关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/article/de...
Java

Java 16 新特性:record类

以前我们定义类都是用 class关键词,但从Java 16开始,我们将多一个关键词 record,它也可以用来定义类。 record关键词的引入,主要是为了提供一种更为简洁、紧凑的 final类的定义...