SpringBoot+Dubbo 통합 ELK 실전

12561 단어 SpringBootDubboELK
머리말
일 지 는 우리 의 개발 과 운영 과정 에 수반 되 어 왔 다.시스템 에 버그 가 발생 하면 Xshell 을 통 해 서버 에 연결 하고 로그 파일 을 찾 아 문제 의 출처 를 조금씩 찾 습 니 다.
인터넷 의 신속 한 발전 에 따라 우리 의 시스템 은 갈수 록 방대 해진 다.육안 분석 로그 파일 에 의존 하여 문 제 를 조사 하 는 방식 이 점점 문제점 을 드 러 내 고 있다.
  • 분포 식 클 러 스 터 환경 에서 서버 수량 이 수백 수천 에 달 할 수 있 습 니 다.어떻게 정확하게 포 지 셔 닝 합 니까?
  • 마이크로 서비스 구조 에서 이상 정보 에 따라 다른 각 서비스의 문맥 정 보 를 어떻게 찾 습 니까?
  • 로그 파일 이 커지 면서 서버 에서 직접 열 수 없 는 난처 함 에 직면 할 수 있 습 니 다.
  • 텍스트 검색 이 너무 느 려 서 다 차원 조회 가 불가능 합 니 다
  • 이러한 문제 에 직면 하여 우 리 는 집중 화 된 로그 관 리 를 통 해 모든 서버 노드 의 로 그 를 통일 적 으로 수집 하고 관리 하 며 방문 해 야 한다.
    오늘날 우리 의 수단 은Elastic Stack을 사용 하여 그것들 을 해결 하 는 것 이다.
    1.Elastic Stack 이란 무엇 입 니까?
    엘 라 스틱 에 대해 조금 낯 설 어 하 는 사람 이 있 을 지도 모른다.엘 라 스틱 스 택 은 엘 라 스틱 스 택 의 세대교체 제품 이 었 다.
    Elastic Stack 은 각각 네 개의 오픈 소스 프로젝트 에 대응 했다.
    Beats
    Beats 플랫폼 은 다양한 용도 의 데이터 수집 기 를 모 아 다양한 유형의 데 이 터 를 수집 합 니 다.예 를 들 어 파일,시스템 모니터링,윈도 이벤트 로그 등 이다.
    Logstash
    Logstash 는 서버 측 데이터 처리 파이프 로 여러 소스 에서 데 이 터 를 수집 하고 데 이 터 를 변환 할 수 있 습 니 다.맞아요.데 이 터 를 수집 할 수도 있 고 변환 할 수도 있어 요.비구 조 화 된 데 이 터 를 수집 하여 필 터 를 통 해 그 를 우호 적 인 형식 으로 포맷 했다.
    Elasticsearch
    Elasticsearch 는 JSON 기반 의 분포 식 검색 및 분석 엔진 이다.Elastic Stack 의 핵심 으로 데 이 터 를 집중 적 으로 저장 합 니 다.위 에 서 는 Beats 를 이용 하여 데 이 터 를 수집 하고 Logstash 를 통 해 변환 하면 Elasticsearch 에 저장 할 수 있 습 니 다.
    Kibana
    마지막 으로 Kibana 를 통 해 자신의 Elasticsearch 의 데 이 터 를 시각 화 할 수 있다.
    본 고의 실례 는SpringBoot+Dubbo의 마이크로 서비스 구 조 를 통 해Elastic Stack와 결합 하여 로 그 를 통합 한 것 이다.구 조 는 다음 과 같다.
    , ELK 。 , , 。2.채집,전환
    1、FileBeat
    SpringBoot 프로젝트 에서 로그 백 을 설정 하고 로그 파일 의 위 치 를 확인 합 니 다.
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<file>${user.dir}/logs/order.log</file>
    	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    	 <fileNamePattern>${user.dir}/logs/order.%d{yyyy-MM-dd}.log</fileNamePattern>
    	 <maxHistory>7</maxHistory>
    	</rollingPolicy>
    	<encoder>
    	 <pattern></pattern>
    	</encoder>
    </appender>
    Filebeat가 벼 운 방법 을 제공 하여 로그 와 파일 을 전송 하고 모 으 는 데 사용 합 니 다.
    그래서 로그 파일 의 위치 와 내용 을 어디로 전달 하 는 지 알려 야 합 니 다.
    다음 과 같이 저 희 는FileBeat읽 기FileBeat경로 의 모든 로그 파일 을 설정 하 였 습 니 다.
    
    - type: log
     # Change to true to enable this input configuration.
     enabled: true
     # Paths that should be crawled and fetched. Glob based paths.
     paths:
     - /usr/local/logs/*.log
    그리고usr/local/logs에서 수집 한 데 이 터 를FileBeat로 전송 하 라 고 알려 주세요.
    
    #----------------------------- Logstash output --------------------------------
    output.logstash:
     # The Logstash hosts
     hosts: ["192.168.159.128:5044"]
    또한Logstash파일 데 이 터 를 수집 할 때 한 줄 한 줄 읽 습 니 다.그러나FileBeat수 집 된 파일 에는 여러 줄 의 텍스트 를 뛰 어 넘 는 메시지 가 포 함 될 수 있 습 니 다.
    예 를 들 어 오픈 소스 프레임 워 크 에서 의도 적 으로 줄 을 바 꿉 니 다.
    
    2019-10-29 20:36:04.427 INFO org.apache.dubbo.spring.boot.context.event.WelcomeLogoApplicationListener 
     :: Dubbo Spring Boot (v2.7.1) : https://github.com/apache/incubator-dubbo-spring-boot-project
     :: Dubbo (v2.7.1) : https://github.com/apache/incubator-dubbo
     :: Discuss group : [email protected]
    또는 자바 이상 스 택 정보:
    
    2019-10-29 21:30:59.849 INFO com.viewscenes.order.controller.OrderController http-nio-8011-exec-2         ...
    java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
    	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    	at java.util.ArrayList.get(ArrayList.java:433)
    따라서 어떤 줄 이 하나의 이벤트 의 일부분 인지 설정FileBeat해 야 합 니 다.multiline일치 할 정규 표현 식 모드 를 지정 합 니 다.multiline.pattern부정 모드 로 정의 합 니 다.multiline.negate일치 하 는 줄 을 이벤트 에 조합 하여 after 또는 before 로 설정 하 는 방법.
    듣 기 에 비교적 관대 할 수 있 습 니 다.우 리 는 한 조 의 설정 을 보 겠 습 니 다.
    
    # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
    multiline.pattern: '^\<|^[[:space:]]|^[[:space:]]+(at|\.{3})\b|^java.'
    
    # Defines if the pattern set under pattern should be negated or not. Default is false.
    multiline.negate: false
    
    # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
    # that was (not) matched before or after or as long as a pattern is not matched based on negate.
    # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
    multiline.match: after
    위 설정 파일 은 텍스트 내용 이multiline.match로 시작 하면 이 줄 의 내용 을 새 줄 이 아 닌 이전 줄 의 후속 으로 간주 합 니 다.
    위의 자바 이상 스 택 정 보 는 이 정규 에 부합 합 니 다.그래서< +at+ java.
    
    java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
    	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    	at java.util.ArrayList.get(ArrayList.java:433)
    이 내용 들 은FileBeat의 일부분 으로 간주 된다.
    2、Logstash ...에서 로 그 를 인쇄 할 때 로그 등급,실행 경로,스 레 드 이름 등 정 보 를 가 져 옵 니 다.
    중요 한 정 보 는 우리 가Logback로 그 를 볼 때 상기 조건 을 단독으로 통계 하거나 정확하게 조회 하 기 를 원 하 는 지 하 는 것 이다.
    그렇다면ELK필 터 를 사용 해 야 합 니 다.각 사건 을 분석 하고 이름 이 붙 은 필드 를 식별 하여 구 조 를 구축 하고 유 니 버 설 형식 으로 변환 할 수 있 습 니 다.
    이 럴 때 는 우리 가 프로젝트 에서 로 그 를 어떤 형식 으로 출력 하 는 지 먼저 봐 야 합 니 다.
    예 를 들 어 우리 가 가장 잘 아 는 JSON 포맷 이다.먼저 보기Logstash설정:
    
    <pattern>
     {"log_time":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","logger":"%logger","thread":"%thread","msg":"%m"}
    </pattern>
    맞습니다.Logback필터 에 도 JSON 해석 플러그 인 이 있 습 니 다.우 리 는 이렇게 그것 을 설정 할 수 있다.
    
    input{ 
     stdin{}
    }
    filter{
     json {
     source => "message"
     }
    }
    output {
     stdout {}
    }
    이 설정 은 JSON 해상도 기 를 이용 하여 데 이 터 를 포맷 한 다 는 것 이다.우 리 는 다음 줄 의 내용 을 입력 합 니 다.
    
    {
     "log_time":"2019-10-29 21:45:12.821",
     "level":"INFO",
     "logger":"com.viewscenes.order.controller.OrderController",
     "thread":"http-nio-8011-exec-1",
     "msg":"       ."
    }
    Logstash포맷 된 내용 을 되 돌려 줍 니 다.

    그러나 JSON 해상도 기 는 적용 되 지 않 습 니 다.로그 에 msg 필드 자체 가 JSON 데이터 형식 일 수 있 기 때 문 입 니 다.
    예 를 들 면:
    
    {
     "log_time":"2019-10-29 21:57:38.008",
     "level":"INFO",
     "logger":"com.viewscenes.order.controller.OrderController",
     "thread":"http-nio-8011-exec-1",
     "msg":"       .{"amount":1000.0,"commodityCode":"MK66923","count":5,"id":1,"orderNo":"1001"}"
    }
    이 럴 때 JSON 해상도 가 틀 릴 수 있 습 니 다.그럼 어 떡 하지?Logstash필터 플러그 인 라 이브 러 리 가 풍부 하거나 정규 에 자신 이 있 거나 표현 식 을 써 서 일치 시 킬 수 있 습 니 다.
    우리 가Logstash에서 설정 한 것 처럼 로그 내용 형식 은 JSON 형식 이 든 다른 형식 이 든 이미 확정 되 었 습 니 다.
    그래서 필 자 는 오늘 또 다른 것 을 추천 합 니 다:Dissect.
    Dissect 필 터 는 분할 작업 입 니 다.전체 문자열 에 사용 할 경계선 을 지정 하 는 일반적인 분할 작업 과 달리 이 작업 은 문자열 값 에 사용 합 니 다.Dissect 는 정규 표현 식 을 사용 하지 않 고 속도 가 매우 빠르다.
    예 를 들 어 필 자 는 여기 서Logback를 기준 으로 한다.
    
    input{ 
     stdin{}
    }
    filter{ 
     dissect {
      mapping => {
    	 "message" => "%{log_time}|%{level}|%{logger}|%{thread}|%{msg}"
      }
     } 
    }
    output {
     stdout {}
    }
    그리고|에서 로그 형식 을 설정 합 니 다:
    
    <pattern>
     %d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%logger|%thread|%m%n
    </pattern>
    마지막 으로 똑 같이 정확 한 결 과 를 얻 을 수 있다.

    데이터 수집 과 형식 변환 이 완료 되 었 습 니 다.물론 위의 설정 은 모두 콘 솔 의 입 출력 입 니 다.
    우 리 는Logback에서 데 이 터 를 수집 하고FileBeat에서 형식 을 바 꾸 어 데 이 터 를dissect로 출력 하 는 진지 한 설정 을 살 펴 보 았 다.
    
    input {
     beats {
     port => 5044
     }
    }
    filter{
     dissect {
      mapping => {
      "message" => "%{log_time}|%{level}|%{logger}|%{thread}|%{msg}"
      }
     }
     date{
      match => ["log_time", "yyyy-MM-dd HH:mm:ss.SSS"]
      target => "@timestamp"
     }
    }
    output {
     elasticsearch {
     hosts => ["192.168.216.128:9200"]
     index => "logs-%{+YYYY.MM.dd}"
     }
    }
    사고 가 나 지 않 으 면 브 라 우 저 를 켜 면 Kibana 에서 로 그 를 볼 수 있 습 니 다.예 를 들 어 로그 등급elasticsearch의 항목 을 봅 니 다.

    추적
    생각해 보 세 요.우 리 는 전단 에 주문 서 를 보 냈 습 니 다.백 엔 드 시스템 이 마이크로 서비스 구조 라면 재고 시스템,쿠폰 시스템,계 정 시스템,주문 시스템 등 여러 서 비 스 를 거 칠 수 있다.어떻게 이 요청 의 호출 링크 를 추적 합 니까?
    1.MDC 메커니즘
    우선,우 리 는 MDC 메커니즘 을 좀 이해 해 야 한다.
    MDC-Mapped Diagnostic Contexts 는 실질 적 으로 로그 기록 프레임 워 크 가 유지 하 는 맵 입 니 다.이 프로그램 코드 는 키 쌍 을 제공 하고 로그 기록 프레임 워 크 에서 로그 메시지 에 삽입 할 수 있 습 니 다.
    요컨대,우 리 는DEBUG을 사 용 했 습 니 다.그러면MDC.PUT(key,value)로그 에서 이 value 를 자동 으로 인쇄 할 수 있 습 니 다.Logback에서 우 리 는 먼저 하나의SpringBoot를 써 서 모든 요 구 를 차단 하여 하나의HandlerInterceptor를 생 성 할 수 있다.
    
    @Component
    public class TraceIdInterceptor implements HandlerInterceptor {
    
     Snowflake snowflake = new Snowflake(1,0);
    
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
      MDC.put("traceId",snowflake.nextIdStr());
      return true;
     }
    
     @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
      MDC.remove("traceId");
     }
    
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){}
    }
    그리고 로그 메시지 에 이traceId를 설정 합 니 다.
    
    <pattern>
     %d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%logger|%thread|%X{traceId}|%m%n
    </pattern>
    2、Dubbo Filter
    또 하나의 문 제 는 마이크로 서비스 구조 에서 우리 가 어떻게 이것Logback을 왔 다 갔다 하 게 하 느 냐 하 는 것 이다.
    익숙 한traceId친 구 는 암시 적 인 파 라 메 터 를 생각 할 수 있 습 니 다.예,우 리 는 그것 을 이용 하여traceId의 전달 을 완성 합 니 다.
    
    @Activate(group = {Constants.PROVIDER, Constants.CONSUMER}, order = 99)
    public class TraceIdFilter implements Filter {
     @Override
     public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    
      String tid = MDC.get("traceId");
      String rpcTid = RpcContext.getContext().getAttachment("traceId");
    
      boolean bind = false;
      if (tid != null) {
       RpcContext.getContext().setAttachment("traceId", tid);
      } else {
       if (rpcTid != null) {
        MDC.put("traceId",rpcTid);
        bind = true;
       }
      }
      try{
       return invoker.invoke(invocation);
      }finally {
       if (bind){
        MDC.remove("traceId");
       }
      }
     }
    }
    이렇게 쓰 면 우 리 는 어떤 요청 의 모든 로그 정 보 를 즐겁게 볼 수 있 습 니 다.예 를 들 어 아래 의 요청,주문 서비스 와 재고 서비스 두 시스템 의 로그.

    총화
    본 고 는Dubbo의 기본 개념 을 소개 하 였 다.그리고 하나의traceId프로젝트 를 통 해 로그 의 집중 화 관리,추적 을 어떻게 하 는 지 보 여 줍 니 다.
    사실Elastic Stack은 더 많은 분석 과 통계 기능 을 가지 고 있다.그래서 그 역할 은 기록 로그 에 만 국한 되 는 것 이 아니다.
    SpringBoot+Dubbo성능 도 좋다.필 자 는 한 대의 가상 컴퓨터 에 100 만 개의 사용자 데 이 터 를 기 록 했 고 index 크기 는 1.1G 이 며 조회 와 통계 속도 도 손 색 이 없다.

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기