구조적 문자열 데이터에서 데이터 추출
문자열 필드에는 JSON 또는 키-값 쌍과 같은 정형 데이터가 포함될 수도 있습니다. KQL을 사용하면 추가 분석을 위해 해당 값에 쉽게 액세스할 수 있습니다.
동적 필드
Log Analytics 테이블에는 동적으로 정의된 필드 형식이 있습니다. 동적 필드에는 다음과 같은 키-값 쌍이 포함됩니다.
{"eventCategory":"Autoscale","eventName":"GetOperationStatusResult","operationId":"xxxxxxxx-6a53-4aed-bab4-575642a10226","eventProperties":"{\"OldInstancesCount\":6,\"NewInstancesCount\":5}","eventDataId":" xxxxxxxx -efe3-43c2-8c86-cd84f70039d3","eventSubmissionTimestamp":"2020-11-30T04:06:17.0503722Z","resource":"ch-appfevmss-pri","resourceGroup":"CH-RETAILRG-PRI","resourceProviderValue":"MICROSOFT.COMPUTE","subscriptionId":" xxxxxxxx -7fde-4caf-8629-41dc15e3b352","activityStatusValue":"Succeeded"}
동적 필드 내의 문자열에 액세스하기 위해 점 표기법을 사용합니다. SigninLogs 테이블의 DeviceDetail 필드는 동적 형식입니다. 이 예제에서는 DeviceDetail.operatingSystem 필드 이름으로 운영 체제에 액세스할 수 있습니다.
SigninLogs
| extend OS = DeviceDetail.operatingSystem
아래 쿼리에서는 SigninLogs 테이블의 동적 필드를 사용하는 것을 보여 줍니다.
// Example query for SigninLogs showing how to break out packed fields.
SigninLogs
| extend OS = DeviceDetail.operatingSystem, Browser = DeviceDetail.browser
| extend StatusCode = tostring(Status.errorCode), StatusDetails = tostring(Status.additionalDetails)
| extend Date = startofday(TimeGenerated)
| summarize count() by Date, Identity, UserDisplayName, UserPrincipalName, IPAddress, ResultType, ResultDescription, StatusCode, StatusDetails
| sort by Date
JSON
KQL은 문자열 필드에 저장된 JSON을 조작하는 함수를 제공합니다. 많은 로그는 JSON 형식으로 데이터를 전송합니다. 해당 경우에는 JSON 데이터를 쿼리 가능한 필드로 변환하는 방법을 알아야 합니다.
아래 예제는 JSON과 관련된 함수 및 연산자의 목록입니다.
Function | 설명 |
---|---|
parse-json() 또는 todynamic() | 문자열을 JSON 값으로 해석하고 값을 동적으로 반환합니다. JsonField.Key 또는 JsonField["Key"] 함수 중 하나를 사용하여 필드를 참조합니다. |
mv-expand | 는 컬렉션의 각 값이 별도의 행을 갖도록 동적 형식의 배열 또는 속성 모음 열에 적용됩니다. 확장된 행의 다른 열은 모두 중복됩니다. mv_expand는 JSON 배열을 처리하는 가장 쉬운 방법입니다. |
mv-apply | 각 레코드에 하위 쿼리를 적용하고 모든 하위 쿼리 결과의 합집합을 반환합니다. 배열의 각 값에 쿼리를 적용합니다. |
결과를 확인하려면 각 쿼리를 개별적으로 실행합니다.
SigninLogs
| extend AuthDetails = parse_json(AuthenticationDetails)
| extend AuthMethod = AuthDetails[0].authenticationMethod
| extend AuthResult = AuthDetails[0].["authenticationStepResultDetail"]
| project AuthMethod, AuthResult, AuthDetails
SigninLogs
| mv-expand AuthDetails = parse_json(AuthenticationDetails)
| project AuthDetails
SigninLogs
| mv-apply AuthDetails = parse_json(AuthenticationDetails) on
(where AuthDetails.authenticationMethod == "Password")