Log Service は、JSON 形式のログのクエリと分析をサポートしています。 インデックスのデータ型を JSON に設定できます。

JSON 形式のデータは、テキスト、ブール、数値、配列、マップなどの複数のデータ型の組み合わせです。 JSON 形式のデータは、一般的なタイプのデータとして、自己解析され、柔軟性を持っています。 複雑なシナリオでデータを記録する場合に使用できます。 多くのログでは、固定形式のないコンテンツは JSON 形式で記録されます。 たとえば、HTTP リクエストのリクエストパラメータとレスポンスは、JSON 形式でログに記録されます。

Log Service を使用すると、インデックスフィールドのデータ型を JSON に設定できるため、JSON 形式のログをクエリおよび分析できます。

設定項目

  • Log Service は JSON 形式のフィールドを解析し、テキスト型および Boolean 型のすべてのフィールドのインデックスを自動的に生成できます。
    json_string.key_map.key_text : test_value
    json_string.key_map.key_bool : true
  • JSON 配列にない double 型または long 型のフィールドを照会するには、JSON パスを指定できます。
    key_map.key_long フィールドのデータ型を long 型に設定します。
    Query: json_string.key_map.key_long > 50
  • JSON 配列にないテキスト型、double 型、または long 型のフィールドを照会するには、統計分析機能を有効にし、SQL ステートメントを使用してこれらのフィールドを分析できます。
    json_string.key_map.key_long > 10 | select count(*) as c , 
        "json_string.key_map.key_text" group by 
        "json_string.key_map.key_text"
    • JSON オブジェクト型と JSON 配列型はサポートされていません。
    • フィールドを JSON 配列に含めることはできません。
    • Boolean 型のフィールドは、テキスト型に変換できます。
    • JSON 形式のフィールドは、ログのクエリおよび分析中に二重引用符 (" ") で囲む必要があります。
  • Log Service は、有効なコンテンツと無効なコンテンツの両方を含む JSON 形式のデータを解析できます。

    非完全有効な JSON には、無効な部分が表示されるまで、有効な部分を解析します。

    たとえば、key_3 フィールドの後のデータは切り捨てられ、次のコードでは失われます。 Log Service は、json_string.key_map.key_2 フィールドとこのフィールドの前のコンテンツを正しく解析できます。

    "json_string": 
    {
         "key_1" : "value_1",
         "key_map" : 
          {
                 "key_2" : "value_2",
                 "key_3" : "valu

クエリ構文

指定した Key でクエリする場合、クエリ文に JSON の親パスの接頭辞を追加する必要があります。 テキストおよび数値型のフィールドのクエリ構文は、JSON 形式のデータと他のデータで同じです。 詳細については、「クエリ構文」をご参照ください。

クエリの例

次のログには、時間フィールドと 4 つのキーが含まれています。そのうち、メッセージフィールドは JSON 形式です。

番号 キー データ型
0 time N/A
1 class テキスト
2 status Long
3 latency Double
4 message JSON
0. time:2018-01-01 12:00:00
  1. class:central-log
  2. status:200
  3. latency:68.75
  4. message:
  {  
      "methodName": "getProjectInfo",
      "success": true,
      "remoteAddress": "1.1.1.1:11111",
      "usedTime": 48,
      "param": {
              "projectName": "ali-log-test-project",
              "requestId": "d3f0c96a-51b0-4166-a850-f4175dde7323"
      },
      "result": {
          "message": "successful",
          "code": "200",
          "data": {
              "clusterRegion": "ap-southeast-1",
              "ProjectName": "ali-log-test-project",
              "CreateTime": "2017-06-08 20:22:41"
          },
          "success": true
      }
  }
次の図は、ログのインデックスの設定方法を示しています。
図 1. インデックスの設定方法

説明:

  • (1) は、JSON 形式のフィールドの String 型および Boolean 型のすべてのデータの照会が可能なことを示します。
  • (2) は、long 型のデータのクエリが可能なことを示します。
  • (3) は、SQL ステートメントを使用して、構成済みフィールドの分析が可能なことを示します。
  1. 文字列およびブール型のフィールドのクエリ
    • JSON 形式のフィールドを設定する必要はありません。
    • JSON マップとJSON 配列は自動的に展開されます。 複数レイヤでネストされているフィールドは、各レイヤの間をピリオド ( . ) で区切ることで検索できます。
    message.traceInfo.requestId : 92.137_1518139699935_5599
    message.param.projectName : ali-log-test-project
    message.success : true
    message.result.data.ProjectStatus : Normal

  2. double 型と long 型のフィールドの照会
    JSON 形式の各フィールドは個別に設定する必要があります。 フィールドを JSON 配列に含めることはできません。
    message.usedTime > 40
  3. SQL 文を使用したログの管理
    • JSON 形式の各フィールドは個別に設定する必要があります。 フィールドを JSON 配列に含めることはできません。
    • 照会するフィールドは、二重引用符 (" ") で囲むか、エイリアスを使用して設定する必要があります。
    * | select avg("message.usedTime") as avg_time ,
    "message.methodName"  group by "message.methodName"