関数を使用して、特定の条件に基づいてデータを確認および処理できます。 このトピックでは、関数を使用してさまざまなシナリオでデータをチェックする方法について説明します。
シナリオ 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
関数によって抽出されたフィールド値が存在し、空でない場合、Bool
値trueが返されます。 それ以外の場合、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
関数によって抽出されたフィールド値が存在し、空でない場合、Bool
値trueが返されます。 それ以外の場合、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
フィールドの値が200、request_method
フィールドの値がGET、scheme
フィールドの値が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
フィールドの値が200、request_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
フィールドの値が200、request_method
フィールドの値がGET、header_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