すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:関数を使用したデータの確認

最終更新日:Aug 28, 2024

関数を使用して、特定の条件に基づいてデータを確認および処理できます。 このトピックでは、関数を使用してさまざまなシナリオでデータをチェックする方法について説明します。

シナリオ 1: フィールドが存在するかを確認する

  • 生のログエントリ

    a: a_value
    b:       // Empty string
  • ドメイン固有言語 (DSL) オーケストレーション

    • 解決策1: e_has関数とe_not_has関数を使用します。

      e_if(e_has("a"),e_set("has_a", true))
      e_if(e_has("b"),e_set("has_b", true))
      e_if(e_has("c"),e_set("has_c", true))
      e_if(e_not_has("a"),e_set("not_has_a", true))
      e_if(e_not_has("b"),e_set("not_has_b", true))
      e_if(e_not_has("c"),e_set("not_has_c", true))
    • 解決策2: e_search関数を使用します。

      e_if(e_search('a: *'),e_set("has_a", true))
      e_if(e_search('b: *'), e_set("has_b", true))
      e_if(e_search('c: *'), e_set("has_c", true))
      e_if(e_search('not a: *'), e_set("not_has_a", true))
      e_if(e_search('not b: *'), e_set("not_has_b", true))
      e_if(e_search('not c: *'), e_set("not_has_c", true))
      説明

      上記の例では、e_if関数が各条件に対して記述されており、ソリューションをよりわかりやすく示しています。 すべての条件と対応する操作をe_if (条件1、操作1、条件2、操作2) として含めることで、関数を単純化できます。

  • 結果

    a:a_value
    b:    // Empty string
    has_a: true
    has_b: true
    not_has_c: true

シナリオ 2: フィールド値が存在するかどうか、空ではないかどうかを確認する

  • 生のログエントリ

    a: a_value
    b:     // Empty string
  • DSL オーケストレーション

    • 解決策1 (推奨): フィールド値を返すv関数を使用します。

      e_if(v("a"), e_set("not_empty_a", true))
      e_if(v("b"), e_set("not_empty_b", true))
      e_if(v("c"), e_set("not_empty_c", true))
      説明

      v関数によって抽出されたフィールド値が存在し、空でない場合、Booltrueが返されます。 それ以外の場合、falseが返されます。

    • 解決策2: e_search関数を使用します。

      # The field value contains at least one character.
      e_if(e_search('a: "?"'), e_set("not_empty_a", true))
      e_if(e_search('b: "?"'), e_set("not_empty_b", true))
      e_if(e_search('c: "?"'), e_set("not_empty_c", true))
      
      # Regular expression
      e_if(e_search('a~=".+"'), e_set("not_empty_a", true))
      e_if(e_search('b~=".+"'), e_set("not_empty_b", true))
      e_if(e_search('c~=".+"'), e_set("not_empty_c", true))
      
      # The field value exists and is not empty.
      e_if(e_search('a: * and not a==""'), e_set("not_empty_a", true))
      e_if(e_search('b: * and not b==""'), e_set("not_empty_b", true))
      e_if(e_search('c: * and not c==""'), e_set("not_empty_b", true))
  • 結果

    a: a_value
    b:     // Empty string
    not_empty_a: true

シナリオ 3: フィールド値が存在し、空であるかどうかを確認する

  • 生のログエントリ

    a: a_value
    b:     // Empty string
  • DSL オーケストレーション

    • 解決策1 (推奨): フィールド値を返すv関数を使用します。

      e_if(op_and(e_has("a"), op_not(v("a"))), e_set("empty_a", true))
      e_if(op_and(e_has("b"), op_not(v("b"))), e_set("empty_b", true))
      e_if(op_and(e_has("c"), op_not(v("c"))), e_set("empty_c", true))
      
      # Invalid syntax
      e_if(op_not(v("a")), e_set("empty_a", true))
      e_if(op_not(v("b")), e_set("empty_b", true))
      e_if(op_not(v("c")), e_set("empty_c", true))
      説明

      v関数によって抽出されたフィールド値が存在し、空でない場合、Booltrueが返されます。 それ以外の場合、falseが返されます。 フィールド値が存在しない場合、またはフィールド値がNoneの場合、true値が返されます。

    • 解決策2: e_search関数を使用します。

      e_if(e_search('a==""'), e_set("empty_a", true))
      e_if(e_search('b==""'), e_set("empty_b", true))
      e_if(e_search('c==""'), e_set("empty_c", true))
      
      # Invalid syntax
      e_if(e_search('a:""'), e_set("empty_a", true))
      e_if(e_search('b:""'), e_set("empty_b", true))
      説明

      前述の無効な構文の例では、部分クエリにe_search関数が使用されています。 この場合、値が空であるかどうかにかかわらず、a: "" フィールドの値が存在する場合はtrueが返されます。

  • 結果

    a: a_value
    b:       // Empty string
    empty_b: true

シナリオ 4: フィールド値間の論理関係に基づいてアクションを実行する

  • 未加工のログエントリ

    "Log entry 1"
    http_host: example.com
    status: 200
    request_method: GET
    scheme: https
    header_length: 700
    body_length: 1200
    
    "Log entry 2"
    http_host: example.org
    status: 200
    request_method: POST
    scheme: https
    header_length: 100
    body_length: 800
    
    "Log entry 3"
    http_host: example.net
    status: 200
    request_method: GET
    scheme:  http
    header_length: 700
    body_length: 800
    
    "Log entry 4"
    http_host: aliyundoc.com
    status: 404
    request_method: GET
    scheme: https
    header_length: 100
    body_length: 300
  • 要件 1

    statusフィールドの値が200されているすべてのログエントリにtypeフィールドを追加します。 typeフィールドの値はnormalです。

    • DSL オーケストレーション

      e_if(e_match("status", "200"), e_set("type", "normal"))
      Or
      e_if(e_search('status==200'), e_set("type", "normal"))
      説明
      • これらのソリューションのいずれかは、要件が単純なシナリオで使用できます。

      • この場合、status:200を使用して、statusフィールドの値に200が含まれているかどうかを確認できます。 具体的には、status==200を使用することを推奨します。

    • 結果

      "Log entry 1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 1200
      
      "Log entry 2"
      type: normal
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "Log entry 3"
      type: normal
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "Log entry 4"
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 300
  • 要件 2

    次の条件を満たすすべてのログエントリにtypeフィールドを追加します。statusフィールドの値が200request_methodフィールドの値がGETschemeフィールドの値がhttpsです。 typeフィールドの値はnormalです。

    • DSL オーケストレーション

      e_if(e_search('status==200 and request_method==GET and scheme==https'), e_set("type", "normal"))
      Or
      e_if(e_match_all("status", "200", "request_method", "GET", "scheme", "https"), e_set("type", "normal"))
      説明
      • e_searchまたはe_match_all関数を使用して、複数のフィールドを照合できます。 e_search関数はより簡単です。

      • この場合、status:200を使用して、statusフィールドの値に200が含まれているかどうかを確認できます。 具体的には、status==200を使用することを推奨します。

    • 結果

      "Log entry 1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 1200
      
      "Log entry 2"
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "Log entry 3"
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "Log entry 4"
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 300
  • 要件 3

    次の条件の1つ以上を満たすすべてのログエントリにtypeフィールドを追加します。statusフィールドの値が200request_methodフィールドの値がGET、またはschemeフィールドの値がhttpsです。 typeフィールドの値はnormalです。

    • DSL オーケストレーション

      e_if(e_search('status==200 or request_method==GET or scheme==https'), e_set("type", "normal"))
      Or
      e_if(e_match_any("status", "200", "request_method", "GET", "scheme", "https"), e_set("type", "normal"))
    • 結果

      "Log entry 1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 100
      
      "Log entry 2"
      type: normal
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "Log entry 3"
      type: normal
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "Log entry 4"
      type: normal
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 1300
  • 要件 4

    次の条件を満たすすべてのログエントリにtypeフィールドを追加します。statusフィールドの値が200request_methodフィールドの値がGETheader_lengthフィールドとbody_lengthフィールドの値の合計が1000以下です。 typeフィールドの値はnormalです。

    • DSL オーケストレーション

      e_if(op_and(e_search('status: 200 and request_method: GET'), op_le(op_sum(v("header_length"), v("body_length")), 1000)), e_set("type", "normal"))
      説明

      e_search関数やその他の式関数を複数の論理演算に使用できます。

    • 結果

      "Log entry 1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 100
      
      "Log entry 2"
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "Log entry 3"
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "Log entry 4"
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 1300