一、背景
高并发接口中,为了提高接口的高性能,在需要保存审计及操作记录的时候,往往有以下常见方案:
- 保存到redis数据库
- 异步保存到mysql/mongodb/es等数据库
- logger打印业务日志,采集与展示则交由elk模块
对于第一种方案,接口的高性能依赖于redis的性能;第二种方案的关键在于异步,可以是基于事件驱动机制,常见的CQRS设计就是例子;
本文则是介绍第三种方案,不同的是,我们的数据展示是在业务管理后台,而非kibana。
另外,生产环境,我们的应用程序是部署在k8s容器。
二、设计方案
- 1、服务打印日志,持久化到nfs
- 2、filebeat先挂载nfs,再配置采集日志
- 3、kafka作为数据采集的削峰填谷的角色
- 4、Logstash读取kafka的数据,解析并存储到指定es数据库
- 5、管理后台连接并读取es数据库,展示数据
三、打印业务日志
使用logback使用不同的Logger对象,区分普通的jvm日志,把业务日志输出到指定的日志文件。
- logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--该日志将日志级别不同的log信息保存到不同的文件中 -->
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="springAppName"
source="spring.application.name"/>
<springProperty scope="context" name="log_dir" source="logging.login.path" defaultValue="../logs"/>
<!-- 日志输出位置 -->
<property name="LOG_FILE" value="${log_dir}/${springAppName}-login"/>
<!-- 文件的日志输出样式 -->
<property name="FILE_LOG_PATTERN"
value="%d{
${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}