- Sumologic이란?
Sumo Logic은 클라우드 기반 로그 관리 및 분석 플랫폼이다.
이 도구는 기업과 조직이 대규모의 로그 데이터를 실시간으로 수집, 분석 및 시각화하여 시스템 상태, 응용 프로그램 동작 및 보안 이벤트 등을 모니터링하고 이해하는 데 도움을 줄 수 있다.
- sumo logic docs : https://help.sumologic.com/docs/search/search-query-language/
- Sumologic Search Query란?
Query를 이용하여 수집된 로그에서 필요한 정보만을 추출할 수 있는 기능이다.
- Search Query Base
keyword search | parse | where | group-by | sort | limit
Sumologic에서의 Search Query의 기본 방식은 위와 같이 파이프라인(|) 을 기준으로 다양한 조건을 추가하여 목적에 맞는 로그를 찾아낼 수 있다.
보통의 경우라면 아래 예시와 같이 _sourcecategory나, _index를 사용하여 특정 로그를 지정하고 그 중 원하는 값을 쿼리에 따라 추출하게 된다.
아래의 쿼리에서는 "*"로 표시된 부분의 정보에서 src_ip를 추출하여 값 별로 발생한 카운팅을 산출 하고 그 카운트에 따른 정렬을 하는 쿼리이다.
_sourcecategory=apache
| parse "* --" as src_ip
| count by src_ip | sort _count
주석 의 경우 라인별 주석과 영역 주석을 사용할 수 있고 아래와 같다.
// - Comments out a single line of the query, or a part of a single line.
/* */ - Creates a multiple line comment.
- 주요 사용 쿼리 샘플과 설명
1) parse 사용
_index=adminapi_apne2 and "exception"
| parse "[ERROR][*]" as transactionId
위의 쿼리는 특정 Index 로그 영역을 지정하여 그 로그에서 “exception”이라는 문자열이 들어간 로그 추출한다.
그중에 [ERROR][*] 에서 "*" 영역 부분에 transactionId가 저장되도록 로그를 구성하였는데 그 값을 추출하여 transactionId 컬럼에 노출이 되게끔 하는 쿼리이다.
2) logreduce & logcompare
_index=adminapi_apne2 and "exception"
| parse "[ERROR][*]" as transactionId | logreduce
위와 같이 추출된 내용에서 logreduce를 추가하면 동일한 값(패턴)에 대해 발생빈도 count를 확인 가능하다.
"logcompare" 를 추가하면 시간별 발생 추이 ( + 또는 - 퍼센테이지)도 확인 가능하다.
3) count as , order by , where 조건절 사용
_index=api_apne2 AND "REQUEST method=")
| parse "path=[*]" as path
| count as call by path
| order by call desc
| where call > 100
해당 index의 로그에서 "REQUEST method” 라는 텍스트가 있는 로그만 필터링 한다.
그리고 path=[*]에서 *에 저장된 url 정보만 path 필드로 저장(추출)한다.
ex) path=[/api/v1/example] 가 있다면 "/api/v1/example"이 추출됨.
path별로 grouping하고 counting해서 발생빈도를 노출한다.
call 값에 따라 정렬을 해주고 call의 합이 100이 넘는 호출만 노출하여 보여주도록 하는 쿼리이다.
4) json의 맵핑 및 조건 처리
_index=api_apne2 and "RESPONSE method"
| parse "responseBody=[*]" as body
| json field=body "code" as code
| where code != 200
| parse "path=[*]" as url
| count as call by url
해당 인덱스의 로그에서 “RESPONSE method” 문자열을 포함한 로그만 대상으로 추출하고
responseBody=[*] 에 * 부분에 해당하는 값 만을 추출하여 body라는 값으로 지정한다.
이 값을 json 타입으로 mapping하여 그 값내에 code라는 값을 체크하고 그 값이 (result_code) 200이 아닌(오류) 경우에 대해서
path를 url이라고 정의하고 추출하며 url 별로 grouping하여 카운팅한다.
5) keyvalue, Max() 사용
(_index=api_apne2 OR _index=admin_apne2)
AND ("/user" AND "service=Hello")
AND _sourceCategory="api-application-log"
| keyvalue auto keys "userKey" as serviceUserId refonly
| max(_messagetime) as time group by serviceUserId
| formatDate(toLong(time), "yyyy-MM-dd HH:mm:ss") as time
두 개의 로그 index 내에서 "/user"라는 api 와 “service=Hello”이라는 문구를 포함한 로그 중에
api-application-log 에 소스카테고리(로그파일 저장 path) 중 로그에 포함된 값에서 검색을 한다.
userKey에 맵핑된 값을 serviceUserId 로 필터링하여 추출하고 serviceId별로 그룹핑하여 최고 큰 _messagetime을 가진 값만을 각각 추출한다.
추출된 최종 대상 로그의 time값을 formatDate()에 맞게 포맷팅 하여 time 값으로 추출하여 화면에 보여준다.
6) substring()의 사용
(_index=api_apne2 OR _index=admin_apne2)
and "RESPONSE method"
AND _sourceCategory="/apne2/log-application-log"
| parse "path=[*]"as path
| substring(path, 0, 22) as fixed_path
| where fixed_path = "/api/sample"
| substring(path, 23, 45) as param
| count as accl by param
두 개의 로그 index 내에서 response 문자열이 포함된 로그만을 대상으로 _sourceCategory = /apne2/log-application-log 을 대상으로 쿼리를 수행한다.
*에 저장된 url path 내용만을 path라는 변수로 추출하고 그 중에 고정 url인 부분은 substring을 사용하여 fixed_path로 지정한다.
fixed_path ="/api/sample" 은 로그만을 검색하여 나머지 url 부분을 substring으로 잘라서 param 변수로 처리하고 param별로 그룹핑하여 몇 번씩의 호출이 있었는지 확인한다.
이 외에도 위에 링크를 걸어둔 Docs를 통해 더 다양한 Search query를 만들어 필요한 로그만을 효율적으로 검색하여 정보를 얻을 수 있다.