springboot 日志收集_从零学ELK系列(十):SpringBoot项目接入ELK升级版(超详细图文教程)...

v2-17202dedc83ded1e6bd1d1e9120d8500_1440w.jpg?source=172ae18b

前言

之前在《从零学ELK系列(八):SpringBoot项目接入ELK(超详细图文教程)》中演示了SpringBoot项目接入ELK,后来项目中对这部分进行了优化,之前博文中也有读者问到,将优化整理成博文和大家共享;
优化前:
一次请求记录两条日志(request一条,response一条),通过UUID传连起来
优化后:
一次请求记录一条日志(request信息与response信息都在一起)

目录

  • 从零学ELK系列(一):为什么要跟我学从零学ELK系列
  • 从零学ELK系列(二):VMware安装Centos(超详细图文教程)
  • 从零学ELK系列(三):Centos安装Docker(超详细图文教程)
  • 从零学ELK系列(四):Docker安装Elasticsearch(超详细图文教程)
  • 从零学ELK系列(五):Docker安装Kibana(超详细图文教程)
  • 从零学ELK系列(六):Docker安装Logstash(超详细图文教程)
  • 从零学ELK系列(七):Centos安装Filebeat(超详细图文教程)
  • 从零学ELK系列(八):SpringBoot项目接入ELK(超详细图文教程)
  • 从零学ELK系列(九):Nginx接入ELK(超详细图文教程)
  • 从零学ELK系列(十):SpringBoot项目接入ELK升级版(超详细图文教程)

架构图&时序图

  • 架构图

v2-59b057769a8ffc153eedaaa99fc3543b_b.jpg
  • 程序写入日志时序图

v2-5c286987e36c42af046bf667950f15c5_b.jpg
  • ELK收集日志及Kibina查询日志时序图

v2-99b35d1a2f6dff6e1d2b5d7857bdff28_b.jpg

代码实现

  • 完整代码(GitHub,欢迎大家Star,Fork,Watch)https://github.com/dangnianchuntian/springboot
  • 主要代码展示
    • FileBeatLogUtil
/*
    • RequestLogAspectConf
/*
 * Copyright (c) 2020. zhanghan_java@163.com All Rights Reserved.
 * 项目名称:SpringBoot项目接入ELK
 * 类名称:RequestLogAspectConf.java
 * 创建人:张晗
 * 联系方式:zhanghan_java@163.com
 * 开源地址: https://github.com/dangnianchuntian/springboot
 * 博客地址: https://zhanghan.blog.csdn.net
 */

package com.zhanghan.zhelkboot.aop;

import com.zhanghan.zhelkboot.util.FileBeatLogUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Aspect
@Order(0)
@Component
public class RequestLogAspectConf {

 @Autowired
 private HttpServletRequest request;

 @Autowired
 private Environment env;

 private final Logger logger = LoggerFactory.getLogger(this.getClass());

 /**
     * 范围切点方法
     */
 @Pointcut("execution(* com.zhanghan.zhelkboot.controller..*.*(..))")
 public void methodPointCut() {
    }

 @Before("methodPointCut()")
 void doBefore(JoinPoint joinPoint) {
        authLogic(joinPoint);
    }

 private void authLogic(JoinPoint joinPoint) {

 try {

            String applicationName = env.getProperty("spring.application.name");

 //获取当前http请求
            String reqName = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();

            String requestParams = FileBeatLogUtil.getParams(joinPoint);

            FileBeatLogUtil.writeRequestInfo(request, applicationName, reqName, requestParams);
        } catch (Exception e) {
            logger.error("authLogic;Exception:{}", e.getMessage());
        }

    }

}
    • ResponseLogAdvice
/*
 * Copyright (c) 2020. zhanghan_java@163.com All Rights Reserved.
 * 项目名称:SpringBoot项目接入ELK
 * 类名称:ResponseLogAdvice.java
 * 创建人:张晗
 * 联系方式:zhanghan_java@163.com
 * 开源地址: https://github.com/dangnianchuntian/springboot
 * 博客地址: https://zhanghan.blog.csdn.net
 */

package com.zhanghan.zhelkboot.aop;

import com.zhanghan.zhelkboot.util.FileBeatLogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.http.HttpServletResponse;


@ControllerAdvice
public class ResponseLogAdvice implements ResponseBodyAdvice {

 @Autowired
 private HttpServletResponse response;

 private final Logger logger = LoggerFactory.getLogger(this.getClass());

 @Override
 public boolean supports(MethodParameter methodParameter, Class aClass) {
 return true;
    }

 @Override
 public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
 try {

 if (o != null) {

                Logger log = LoggerFactory.getLogger("logstashInfo");

                FileBeatLogUtil.writeResponseLog(o, log, response);

            }
        } catch (Exception e) {
            logger.error("beforeBodyWrite;Exception:{}", e.getMessage());
        }
 return o;
    }

}

    • LombokController
/*
 * Copyright (c) 2020. zhanghan_java@163.com All Rights Reserved.
 * 项目名称:SpringBoot项目接入ELK
 * 类名称:LombokController.java
 * 创建人:张晗
 * 联系方式:zhanghan_java@163.com
 * 开源地址: https://github.com/dangnianchuntian/springboot
 * 博客地址: https://zhanghan.blog.csdn.net
 */

package com.zhanghan.zhelkboot.controller;

import com.zhanghan.zhelkboot.controller.request.LombokRequest;
import com.zhanghan.zhelkboot.util.wrapper.WrapMapper;
import com.zhanghan.zhelkboot.util.wrapper.Wrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class LombokController {

 private static Logger logger = LoggerFactory.getLogger(LombokController.class);

 @RequestMapping(value = "/lombok", method = RequestMethod.POST)
 public Wrapper lombok(@RequestBody LombokRequest lombokRequest) {

        logger.info("lombok param {}", lombokRequest.toString());

        Map<String, Object> map = new HashMap();
        map.put("intLombok", lombokRequest.getIntLombok());
        map.put("strLombok", lombokRequest.getStrLombok());
        map.put("boleanLombok", lombokRequest.getBoleanLombok());
        map.put("personLombok", lombokRequest.getPersonLombok());
 return WrapMapper.ok(map);
    }

}

测试

  • 在服务器上部署并进行请求

v2-1da41c5f43c4f503bbc5594a7cf16ef3_b.jpg
  • 在Kibina上进行查看(请求时间,请求内容,响应内容,响应时间)

v2-7287ff3c3b3846545af1538c1a7a7650_b.jpg

总结

  • 通过日志收集系统可以对系统进行监控
    • 有助于排错
    • 可以看到每个接口的处理时间,是我们对系统进行优化一个重要参考指标
  • 会持续将生产项目中进行优化同步到本项目中并进行输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值