구문 분석을 사용하면 해당 값을 패싯하는 커스텀 쿼리를 더 쉽게 만들 수 있습니다. 이를 통해 요청 URL당 응답 코드의 분포를 이해하고 문제가 있는 페이지를 빠르게 찾을 수 있습니다.
로그 구문 분석의 작동 방식
다음은 뉴렐릭이 로그 구문 분석을 구현하는 방법에 대한 간단한 설명입니다.
로그 구문 분석
작동 원리
대상
구문 분석은 선택된 특정 필드에 적용됩니다. 기본적으로 message 필드가 사용됩니다. 그러나 현재 데이터에 존재하지 않는 필드/속성까지 포함해, 모든 필드/속성을 선택할 수 있습니다.
각 구문 분석 규칙은 규칙이 구문 분석을 시도할 로그를 결정하는 NRQL WHERE 절을 사용하여 생성됩니다.
매칭 프로세스를 간소화하려면 로그에 logtype 속성을 추가하는 것이 좋습니다. 그러나 logtype 사용하는 것으로 제한되지 않습니다. NRQL WHERE 절에서 하나 이상의 속성을 매칭 기준으로 사용할 수 있습니다.
시기
구문 분석은 각 로그 메시지에 한 번만 적용됩니다. 여러 구문 분석 규칙이 로그와 매치하는 경우 성공한 첫 번째 규칙만 적용됩니다.
구문 분석 규칙은 순서가 없습니다. 둘 이상의 구문 분석 규칙이 로그와 매치되는 경우 무작위로 하나가 선택됩니다. 동일한 로그와 매치되지 않도록 구문 분석 규칙을 작성해야 합니다.
구문 분석은 데이터가 NRDB에 기록되기 전에 로그 수집 중에 실행됩니다. 데이터가 스토리지에 기록되면 더 이상 구문 분석을 할 수 없습니다.
데이터 보강이 이뤄지기 전에(before) 파이프라인에서 구문 분석이 실행됩니다. 구문 분석 규칙에 대한 매칭 기준을 정의할 때는 주의해야 합니다. 기준이 구문 분석 또는 보강이 수행될 때까지 존재하지 않는 속성을 기반으로 하는 경우 매칭이 발생할 때 해당 데이터가 로그에 표시되지 않습니다. 결과적으로, 구문 분석이 실행되지 않습니다.
방법
규칙은 Grok, 정규식 또는 이 둘을 혼합하여 작성할 수 있습니다. Grok은 복잡한 정규식을 추상화하는 패턴 모음입니다.
뉴렐릭의 Parsing UI는 Java Regex 구문을 지원합니다. 캡처 그룹의 속성 또는 필드 이름의 경우, Java Regex는 [A-Za-z0-9]만 허용합니다.
Grok을 사용한 속성 구문 분석
구문 분석 패턴은 로그 메시지 구문 분석을 위한 업계 표준인 Grok를 사용하여 지정됩니다.logtype 필드가 있는 수신 로그는 내장된 구문 분석 과 비교 확인되며 가능한 경우 연결된 Grok 패턴이 로그에 적용됩니다.
Grok은 복잡한 리터럴 정규식 대신 사용될 내장 및 명명된 패턴을 추가하는 정규식의 상위 집합입니다. 예를 들어 정수가 정규식 (?:[+-]?(?:[0-9]+))과 매칭될 수 있다는 것을 기억할 필요 없이 동일한 정규식을 나타내는 Grok 패턴 INT를 사용하도록 %{INT}을 작성할 수 있습니다.
PATTERN_NAME 지원 Grok 패턴 중 하나입니다. 패턴 이름은 정규식을 나타내는 사용자 친화적인 이름입니다. 해당 정규식과 정확히 동일합니다.
OPTIONAL_EXTRACTED_ATTRIBUTE_NAME이 제공된 경우, 패턴 이름과 매치되는 값으로 로그 메시지에 추가될 속성의 이름입니다. 정규식을 사용하여 명명된 캡처 그룹을 사용하는 것과 같습니다. 이것이 제공되지 않으면 구문 분석 규칙은 문자열의 영역과 매치되지만 해당 값으로 속성을 추출하지는 않습니다.
OPTIONAL_TYPE 은 추출할 속성 값의 유형을 지정합니다. 생략하면, 값이 문자열로 추출됩니다. 예를 들어, "File Size: 123"의 값 123을 숫자에서 file_size 속성으로 추출하려면 value: %{INT:file_size:int}을 사용합니다.
OPTIONAL_PARAMETER 특정 유형에 대해 선택적으로 파라미터를 지정합니다. 현재는 datetime 유형만 파라미터를 지정할 수 있습니다. 자세한 내용은 아래를 참조하십시오.
매치되는 문자열에서 정규식과 Grok 패턴 이름을 혼합하여 사용할 수도 있습니다.
지원되는 Grok 패턴 목록을 보려면 이 링크를 클릭하고, 지원되는 Grok 유형 목록을 보려면 여기를 클릭하십시오.
변수 이름은 명시적으로 설정해야 하며 %{URI:uri} 같이 소문자여야 한다는 데 유의하십시오. %{URI} 또는 %{URI:URI} 같은 표현식은 안됩니다.
로그 레코드는 다음과 같은 형식을 띌 수 있습니다.
{
"message":"54.3.120.2 2048 0"
}
이 정보는 정확하지만 그 의미가 직관적이지 않습니다. Grok 패턴은 원하는 텔레메트리 데이터를 추출하고 이해하는 데 도움이 됩니다. 예를 들어 다음과 같은 로그 레코드는 사용하기가 훨씬 쉽습니다.
프로세싱 후, 로그 레코드에는 host_ip, bytes_received 및 bytes_sent 필드가 포함됩니다. 이제 뉴렐릭에서 이러한 필드를 사용하여 로그 데이터에 대한 통계 연산을 필터링, 패싯 및 수행할 수 있습니다. 뉴렐릭에서 Grok 패턴으로 로그를 구문 분석하는 방법에 대한 보다 자세한 내용은 블로그 게시물을 참조하십시오.
올바른 권한이 있는 경우 UI에서 구문 분석 규칙을 만들어 Grok 구문 분석을 생성, 테스트 및 활성화할 수 있습니다. 예를 들어 Inventory Services라는 마이크로 서비스에 대한 특정 유형의 오류 메시지를 가져오려면, 특정 오류 메시지와 제품을 찾는 Grok 구문 분석 규칙을 만듭니다. 이를 위해서는:
규칙에 이름을 지정합니다. 예: Inventory Services error parsing
구문 분석할 기존 필드를 선택(기본값 = message)하거나 새 필드 이름을 입력합니다.
들어오는 로그에 대한 사전 필터 역할을 하는 NRQL WHERE절을 식별합니다. 예: entity.name='Inventory Service'. 이 사전 필터는 규칙에서 처리해야 하는 로그 수를 줄여 불필요한 프로세싱을 제거합니다.
멀티라인 로그의 경우 GREEDYDATA Grok 패턴은 새로운 줄을 매치하지 않습니다. ( .*와 동일)
따라서 %{GREEDYDATA:some_attribute}를 직접 사용하는 것이 아니라 그 앞에 멀티라인 플래그를 추가해야 합니다. (?s)%{GREEDYDATA:some_attribute}
뉴렐릭 로그 파이프라인은 기본적으로 로그 JSON 메시지를 구문 분석하지만, 때로 일반 텍스트와 혼합된 JSON 로그 메시지가 있는 경우가 있습니다. 이런 상황에서, 메시지를 구문 분석한 다음 JSON 속성을 사용하여 필터링하길 원할 수 있습니다. 이 경우 jsongrok 유형을 사용할 수 있습니다. 이 유형은 grok 패턴에서 캡처한 JSON을 구문 분석합니다. 이 포맷은 3가지 주요 부분, 즉 grok 구문, 구문 분석된 json 속성에 할당하려는 접두사 및 jsongrok 유형에 의존합니다. jsongrok 유형을 사용하면 포맷이 올바르지 않은 로그에서 JSON을 추출하고 구문 분석할 수 있습니다. 예를 들어, 로그에 날짜/시간 문자열이 접두사로 붙는 경우:
json({"dropOriginal": true}): 구문 분석에 사용된 JSON 스니펫을 삭제합니다. true(기본값)로 설정하면 구문 분석 규칙이 원본 JSON 스니펫을 삭제합니다. JSON 속성은 메시지 필드에 유지됩니다.
json({"dropOriginal": false}): 추출된 JSON 페이로드를 보여줍니다. false로 설정하면 전체 JSON 전용 페이로드가 위의 my_attribute_prefix에 이름이 지정된 속성 아래에 표시됩니다. JSON 속성은 여기 메시지 필드에 남아 있을 뿐만 아니라 사용자에게 JSON 데이터에 대한 3가지 다른 뷰를 제공합니다. 세 가지 버전 모두 저장하는 것이 우려되는 경우 여기에서 기본값인 true를 사용하는 것이 좋습니다.
json({"depth": 62}): JSON 값을 구문 분석하려는 깊이 수준(기본값은 62)입니다.
json({"keepAttributes": ["attr1", "attr2", ..., "attrN"]}): JSON에서 추출할 속성을 지정합니다. 제공된 목록은 공백으로 둘 수 없습니다. 이 구성 옵션을 설정하지 않으면 모든 속성이 추출됩니다.
json({"dropAttributes": ["attr1", "attr2", ..., "attrN"]}): JSON에서 드롭할 속성을 지정합니다. 이 구성 옵션이 설정되지 않으면 속성이 드롭되지 않습니다.
json({"isEscaped": true}): 이스케이프된 JSON을 구문 분석하려면 이 옵션을 true로 설정합니다. (일반적으로 JSON이 문자열화될 때 볼 수 있습니다. 예: {\"key\": \"value\"})
시스템이 쉼표로 구분된 값(CSV) 로그를 보내고 이를 뉴렐릭에서 구문 분석해야 하는 경우 Grok 패턴으로 캡처한 CSV를 구문 분석하는 csvGrok 유형을 사용할 수 있습니다. 이 형식은 Grok 구문, 구문 분석된 CSV 속성에 할당하려는 접두사 및 csvGrok 유형의 세 가지 주요 부분에 의존합니다. csvGrok 유형을 사용하여 로그에서 CSV를 추출하고 구문 분석할 수 있습니다.
CSV Grok 유형 구성(유효한 JSON이어야 함)에서 필수적으로 열을 지시해야 합니다.
열 이름으로 "_"(밑줄)을 설정하여 결과 객체에서 열을 삭제하면 모든 열을 무시할 수 있습니다.
선택적 구성 옵션:
"열" 구성은 필수이지만 다음 설정을 사용하여 CSV 구문 분석을 변경할 수 있습니다.
dropOriginal: (기본값은 true) 구문 분석에 사용된 CSV 스니펫을 삭제합니다. true (기본값)으로 설정하면 구문 분석 규칙이 원래 필드를 삭제합니다.
noPrefix: (기본값은 false) Grok 필드 이름을 결과 객체의 접두사로 포함하지 않습니다.
separator: (기본값은 ,) 각 열을 분할하는 문자/문자열을 정의합니다.
또 다른 일반적인 시나리오는 \t를 구분 기호로 지정해야 하는 TSV(탭으로 구분된 값)입니다. %{GREEDYDATA:log:csv({"columns": ["timestamp", "status", "method", "url", "time", "bytes"], "separator": "\t"})
quoteChar: (기본값은 ") 열 내용을 선택적으로 둘러싸는 문자를 정의합니다.
시스템이 IPv4 주소가 포함된 로그를 보내는 경우 뉴렐릭은 지리적으로 주소를 찾고 지정된 속성으로 로그 이벤트를 보강할 수 있습니다. Grok 패턴이 캡처한 IP 주소의 위치를 찾는 geoGrok type을 사용할 수 있습니다. 이 포맷은 IP의 도시, 국가, 위도/경도 등 주소와 관련된 하나 이상의 필드를 반환하도록 구성할 수 있습니다.
규칙은 매칭되는 로직과 구문 분석 로직의 조합입니다. 매칭은 로그의 속성에 대한 쿼리 매치를 정의함으로써 수행됩니다. 규칙은 소급 적용되지 않습니다. 규칙이 생성되기 전에 수집된 로그는 해당 규칙에 의해 구문 분석되지 않습니다.
로그를 구성하고 구문 분석하는 가장 간단한 방법은 로그 이벤트에 logtype 필드를 포함하는 것입니다. 이것은 로그에 적용할 내장된 규칙을 뉴렐릭에 알려줍니다.
중요
구문 분석 규칙이 활성화되면, 규칙에 의해 구문 분석된 데이터는 영구적으로 변경됩니다. 변경 사항은 되돌릴 수 없습니다.
제한
구문 분석은 계산 비용이 많이 들고 위험이 따릅니다. 계정에 정의된 커스텀 규칙과 패턴을 로그에 매칭시키기 위해 구문 분석이 수행됩니다. 많은 수의 패턴이나 잘못 정의된 커스텀 규칙은 엄청난 양의 메모리와 CPU 리소스를 소비할 뿐아니라 완료하는 데도 오랜 시간이 걸립니다.
문제를 방지하기 위해, 규칙당 메시지당, 계정당 2회의 구문 분석 제한을 적용합니다.
제한
설명
Per-message-per-rule
규칙당 메시지당 제한으로 단일 메시지를 구문 분석하는 데 소요되는 시간이 100ms를 초과하는 것을 방지합니다. 이 제한에 도달하면 시스템은 해당 규칙을 사용하여 로그 메시지를 구문 분석하려는 시도를 중지합니다.
인제스트 파이프라인은 해당 메시지에 적용 가능한 다른 모든 항목을 실행하려고 시도하며, 메시지는 여전히 수집 파이프라인을 통해 전달되고 NRDB에 저장됩니다. 로그 메시지는 원래의 구문 분석되지 않은 포맷입니다.
Per-account
계정당 제한은 계정이 공정한 리소스 할당량 이상을 사용하는 것을 방지하기 위함입니다. 이 제한은 계정에 대한 분당 모든(all) 로그 메시지를 처리하는 데 소요된 총 시간을 고려합니다.
로그를 집계할 때는 로그를 쉽게 구성, 검색 및 구문 분석할 수 있도록 메타데이터를 제공하는 것이 중요합니다. 이를 위한 한 가지 간단한 방법은 전송될 때 로그 메시지에 속성 logtype을 추가하는 것입니다. 내장된 구문 분석 규칙은 특정 logtype 값에 기본적으로 적용됩니다.
팁
logType, logtype 및 LOGTYPE 필드는 모두 내장된 규칙을 지원합니다. 검색을 쉽게 하려면 조직이 단일 구문으로 정렬하는 것이 좋습니다.
다음은 지원되는 전송 방법 중 일부에서 보낸 로그에 logtype을 추가하는 몇 가지 방법의 예입니다.
logtype을 attribute로 추가합니다. 명명된 각 소스에 대해 로그 유형을 설정해야 합니다.
logs:
-name: file-simple
file: /path/to/file
attributes:
logtype: fileRaw
-name: nginx-example
file: /var/log/nginx.log
attributes:
logtype: nginx
record_transformer를 사용하여 새 필드를 추가하는 .conf 파일에 필터 블록을 추가합니다. 이 예에서는 nginx의 logtype을 사용하여 내장 NGINX 구문 분석 규칙을 트리거합니다. 다른 Fluentd 예제들을 확인해 보십시오.
<filter containers>
@type record_transformer
enable_ruby true
<record>
#Add logtype to trigger a built-in parsing rule for nginx access logs
logtype nginx
#Set timestamp from the value contained in the field "time"
timestamp record["time"]
#Add hostname and tag fields to all records
hostname "#{Socket.gethostname}"
tag ${tag}
</record>
</filter>
record_modifier를 사용하여 새 필드를 추가하는 필터 블록을 .conf 파일에 추가합니다.이 예에서는 nginx의 logtype을 사용하여 내장된 NGINX 구문 분석 규칙을 트리거합니다. 다른 Fluent Bit 예시를 확인해보십시오.
[FILTER]
Name record_modifier
Match *
Record logtype nginx
Record hostname ${HOSTNAME}
Record service_name Sample-App-Name
add_field mutate 필터를 사용해 새 필드를 추가하는 필터 블록을 Logstash 구성에 추가합니다. 이 예에서는 nginx의 logtype을 사용하여 내장된 NGINX 구문 분석 규칙을 트리거합니다. 다른 Logstash 예시를 확인해보십시오.
filter {
mutate {
add_field=> {
"logtype"=> "nginx"
"service_name"=> "myservicename"
"hostname"=> "%{host}"
}
}
}
뉴렐릭으로 전송된 JSON 요청에 속성을 추가할 수 있습니다. 이 예에서는 값이 nginx인 logtype 속성을 추가하여 내장된 NGINX 구문 분석 규칙을 트리거합니다. Logs API를 사용하는 방법을 보다 자세히 알아보십시오.
POST /log/v1 HTTP/1.1
Host: log-api.newrelic.com
Content-Type: application/json
X-License-Key: YOUR_LICENSE_KEY
Accept: */*
Content-Length: 133
{
"timestamp": TIMESTAMP_IN_UNIX_EPOCH,
"message": "User 'xyz' logged in",
"logtype": "nginx",
"service": "login-service",
"hostname": "login.example.com"
}
커스텀 구문 분석 규칙 생성 및 보기
많은 로그가 고유한 방식으로 형식화되거나 구조화됩니다. 이를 구문 분석하려면 커스텀 로직을 빌드하고 적용해야 합니다.
로그 UI의 왼쪽 탐색 메뉴에서 Parsing을 선택한 다음 유효한 NRQL WHERE 절과 Grok 패턴을 사용하여 고유한 커스텀 구문 분석 규칙을 생성합니다.