LogAnalytics - Kusto Query (KQL) 쿼리에서 JSON을 추출하는 방법

소개



Azure 환경을 살펴보고 LogAnalytics를 사용하여 이벤트를 필터링 할 때 JSON이 포함 된 레코드를 조건으로 만들고 싶은 방법을 요약했습니다.

샘플 예


  • AWS CloudTrail 로그 샘플
  • 콘솔 로그인으로 필터
  • JSON으로 출력되는 아래의 "Success"만을 조건으로 좁히고 싶다
  • {"ConsoleLogin":"Success"}
    



    Kusto 쿼리의 JSON 추출 방법



    다음 두 가지가 기능으로 제공됩니다.

  • extractjson
  • 경로 표현식을 사용하는 JSON 텍스트에서 지정된 요소를 얻는 방법
  • 하나의 데이터 만 json body에서 추출하는 데 사용할 수 있습니다. 반대로 복수의 데이터를 추출하는 경우에는 사용할 수 없다.
  • 장점으로는 간단하고 형식 변환이 가능합니다
  • 구문
  • extractjson (Jsonpath, 데이터 소스)



  • parse_json
  • JSON 텍스트에서 json을 parse하고 읽어 들여 여러 데이터를 추출합니다.
  • 이미지는 Python json.load로 기억하면 좋을 것 같습니다

  • 한 번 읽으면 여러 데이터를 추출 할 수 있습니다.
  • 구문
  • parse_json(json)



  • 해보자



    1. extractjson 패턴
    AWSCloudTrail
    | where TimeGenerated > ago(7d)
    | where EventName == "ConsoleLogin" // CloudTrailのイベントを絞る
    | extend extractjson_result = extractjson("$.ConsoleLogin", ResponseElements)  // ResponseElementsからConsoleLoginを抽出する
    | project TimeGenerated,EventName,UserIdentityUserName,ResponseElements,extractjson_result // 出力
    

    결과

    - ResponseElements가 원래 데이터
    - extractjson으로 추출한 데이터를 "extractjson_result"필드로 표시

    2. parse_json 패턴
    AWSCloudTrail
    | where TimeGenerated > ago(7d)
    | where EventName == "ConsoleLogin" // CloudTrail のイベントを絞る
    | extend d=parse_json(ResponseElements) // parse_json で読み込み
    | extend parsejson_result = d["ConsoleLogin"]  // 正規化されたJSONを抽出する
    | project TimeGenerated,EventName,UserIdentityUserName,ResponseElements,parsejson_result // 出力
    

    결과

    - 일단 parse_json에서 json.load하는 것이 포인트
    - 정규화하여 복수의 json 추출하므로 복수를 추출하는 경우 여기가 추천

    용도 예


  • 통상의 케이스는 parse_json() 쪽이 이용 용도가 많다
  • Python 등 익숙한 분은 json.load의 생각이 제대로 오기 때문에 후자입니까?
  • extractjson은 타입 변환을 할 수 있기 때문에, 용도적으로는 그 밖에도

  • 마지막으로


  • 아직 Azure Monitor/LogAnalytics를 사용하기 시작했지만, 그 밖에도 걱정되는 점이 있으면 게시하고 싶습니다.
  • 좋은 웹페이지 즐겨찾기