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 이 며 조회 와 통계 속도 도 손 색 이 없다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.