로그 및 로깅 시스템/ELK

ElasticSearch 인덱스 필드 길이 제한 늘리기

mayleaf 2020. 2. 28. 01:35

안녕하세요. 정우현입니다.

오늘은 위의 에러를 해결하는 방법을 적은 글을 씁니다.

 

원인

로그스태시를 통해서 서버 로그를 엘라스틱서치에 꾸준히 넣는데, 로그의 길이가 긴 경우의 로그가 정상적으로 저장이 안되고 있는 듯해서 문제를 찾아봤더니 필드의 길이제한을 넘어가는 경우 저장을 할 수 없었습니다.

 

해법

그래서 이 문제를 해결하기 위해서 방법을 찾아봤습니다.

첫 번째 방법은 인덱스 하나에 대하여 설정을 변경하여 하나의 인덱스에만 필드의 길이제한을 변경하는 것이고,

두 번째 방법은 템플릿을 적용하여 특정 조건의 인덱스에 대해서 필드의 길이제한을 변경하는 방법입니다.

 

첫 번째 방법은 

PUT <index-name>/_settings {

    "index.mapping.total_fields.limit": 2000

}

이라는 명령을 키바나의 DevTool에서 입력하는 것이고,

 

두 번째 방법은

PUT _template/common-template {

    "index_patterns":"<index-pattern>-*",

    "order": 10,

    "template": "index*",

    "settings": {

         "index": {

               "mapping": {

                   "total_fields": {

                        "limit": "2000"

                    }

                }

          }

     }

}

이라는 명령을 키바나의 DevTool에서 입력하는 것입니다.

또한 이 방법은 같은 정보를 curl이나 다른 리퀘스트를 통하여도 동일하게 사용할 수 있고, 제가 사용중인 ELK 스택에도 두 번째 방법을 통해서 설정을 바꾸었습니다.

+ 5.5 버전과 같이 낮은 버전의 ELK같은 경우 "index_patterns" 필드가 아닌 "template"이라는 이름의 필드에 인덱스 패턴을 입력해야합니다.

 

적용 전 걱정

두 번째 방법을 적용하며 걱정한 것은 추가된 템플릿에 없는 필드가 디폴트 템플릿의 값을 빈값으로 덮어씌워 작동되지 않을 가능성을 걱정했습니다.
위의 방식이 PUT method를 사용하고, 인터넷을 살펴본바 설명에서도 override라는 표현을 봤지만 상용화된 서비스에서는 이런 사소한 부분에서도 의심을 하고 넘어가는 게 맞는다고 생각을 했고, 개발 서버에만 먼저 적용하여 테스트를 해봤습니다.

 하지만 적용해본 결과, 추가된 템플릿의 설정이 충돌하지 않는 부분에서는 order 값이 낮은 템플릿이 적용되었고 디폴트 템플릿과 추가된 템플릿 각각 남아있는 것을 확인 할 수 있습니다. 
TIP) 이때 확인은 GET _template/* 명령을 통해 현재 저장되어있는 템플릿들을 모두 확인할 수 있습니다.

 

현재의 걱정

기본적으로 엘라스틱서치는 풀텍스트 서치를 이용하고, 토큰이 많을 수록 검색 속도가 느려집니다. 그렇기 때문에 로그의 길이가 길어진다고 해서 길이제한을 늘리기보다 로그를 효과적으로 저장하고, 읽을 방법에 대해서 고민을 하고 있습니다.