tencent cloud

Tencent Cloud EdgeOne

カスタムプッシュログフィールド

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-16 11:38:31
AI翻訳

機能概要

式構文を使用することで、リアルタイムログで出力フィールドをカスタマイズし、プリセット変数、演算子、数式を柔軟に組み合わせて、多様なログ分析ニーズに対応できます。
説明:
1. 既存フィールドの互換性に関する説明:旧バージョンのカスタムフィールド(リクエストヘッダー、レスポンスヘッダー、Cookie、リクエストボディ)は、コンソールからの新規追加および編集がサポートされなくなり、照会または削除のみが可能です。既存の旧バージョンカスタムフィールドの実際のプッシュ効果には影響ありません。より柔軟なフィールド設定能力を得るために、既存フィールドを式方式の定義に切り替えることをお勧めします。
2. 現在の機能はクローズドベータ段階です。企業版ユーザーの場合は、お問い合わせください。

式構文

カスタムフィールド式の値は4つの基本要素で構成されます:プリセット変数(プラットフォーム組み込みフィールドの参照)、定数(数値または一重引用符で囲まれた文字列)、演算子(算術、比較、論理演算)、数式(組み込み関数呼び出し)。これらの要素を式構文仕様に従って自由に組み合わせ、業務ニーズに合致するログフィールドを構築できます。

プリセット変数

${変数名}を通じてプリセットフィールド変数を参照することをサポートしています。例えば${RequestHost}です。サポートされているプリセットフィールドの一覧は七層アクセスログを参照してください。
以下プリセット変数リストを追加でサポートし、クライアントリクエスト/レスポンス内の指定コンテンツを取得するために使用します:
変数
意味
例
${http.request.headers['key']}
クライアントがリクエストした指定ヘッダーの値
${http.request.headers['user-agent']}
${http.response.headers['key']}
EOがクライアントに応答する指定ヘッダーの値
${http.response.headers['content-type']}
${http.request.cookie['key']}
クライアントがリクエストしたCookie内の指定フィールドの値
${http.request.cookie['session_id']}
${http.request.body}
HTTPリクエストボディ
${http.request.body}

定数

文字列定数は必ず一重引用符で囲む必要があります。例えば'abc'です。数値定数は直接2または0.2と記述できます。
文字列内でサポートされるエスケープ文字:\\\\\\\\、\\\\'、\\\\\\"、\\\\/、\\\\b、\\\\f、\\\\t、\\\\uHHHH。

演算子

カテゴリ
演算子
説明
算術演算子
+、-、*、/
前後とも数値型である必要があります。
比較演算子
<、<=、>、>=
前後とも数値型である必要があります。
比較演算子
==、!=
前後とも数値型、または両方とも文字列型である必要があります。
論理演算子
&&、||
数式パラメータ内でのみ使用します(例:if)。

式

関数名
使い方
機能
例(入力式)
例(出力値)
concat
concat(String1, String2, ..., StringN)
複数の値を1つの文字列に連結します。
concat('Hello, ', 'World', '!')
Hello, World!
encode_uri
encode_uri(source)
URI内の破壊的な文字(スペース、漢字など)をエンコードし、:/?.&=#の構造文字は保持します。
encode_uri('https://example.com/search?q=hello world')
https://example.com/search?q=hello%20world
lower
lower(str)
文字列を小文字に変換します。
lower('Hello World')
hello world
upper
upper(str)
文字列を大文字に変換します。
upper('Hello World')
HELLO WORLD
regexp_replace
regexp_replace(source, regex, replacement)
正規表現による置換
regexp_replace('Chrome/120.0.0', 'Chrome/[0-9.]+', 'Chrome/<ver>')
Chrome/<ver>
regexp_extract
regexp_extract(expr, pattern[, index])
正規表現で抽出します。indexが0の場合は一致内容全体を返し、1、2、3...の場合は対応する番号のキャプチャグループを返します。indexが省略された場合はデフォルトで0になります。
regexp_extract('Chrome/120.0.0', 'Chrome/([0-9.]+)', 1)
120.0.0
if
if(predicate, then, else)
条件に応じて異なる値を返します。
if(1 < 2, 'yes', 'no')
yes
cast
cast(expr, type)
値の型を変換します。typeはLONG、DOUBLE、またはSTRINGです。
cast(200, 'STRING')
200
timestamp_format
timestamp_format(expr[, pattern[, timezone]])
UNIX epochのミリ秒タイムスタンプを指定の形式に変換します。patternはJoda-Time形式に従い、入力しない場合はデフォルトでISO 8601になります。timezoneはJoda-Timeのタイムゾーン名(例:Asia/Shanghai)または固定オフセット(例:+08:00)をサポートし、省略時はUTCを使用します。
timestamp_format(1700000000000, 'yyyy-MM-dd HH:mm:ss')
2023-11-14 22:13:20
unix_timestamp
unix_timestamp(timestamp)
ISO 8601時間文字列をUNIX epochの秒タイムスタンプに変換します。
unix_timestamp('2023-11-14T22:13:20Z')
1700000000

利用制限

フィールド名の制限:
フィールド名には1~100文字を入力できます。使用できるのは英字、数字、下線(_)のみで、先頭は英字である必要があります。
フィールド名に絵文字を含めることはできません。
同じリアルタイムログプッシュタスク内では、カスタムフィールド名を重複させることはできません。
フィールド名の優先順位(名前が重複する場合):式カスタムフィールド > 既存タイプのカスタムフィールド > プリセットフィールド。
式の制限:
式の長さの上限は4096文字です。
式では、定数とプリセット変数、式と定数、式とプリセット変数を直接単純に連結することはサポートされていません(例:'a' + ${RequestHost})。連結にはconcat()式を使用してください。
出力値の制限:
単一フィールドの出力値の長さの上限は1000文字です。上限を超えた場合は切り捨てられ、破棄されます。
互換性の説明:
現在、リアルタイムログのうちレイヤー7アクセスログのみがカスタムフィールドの追加をサポートしています。
既存タイプのフィールド(リクエストヘッダー、レスポンスヘッダー、Cookie、リクエストボディ)は、コンソールからの新規追加および編集がサポートされなくなり、照会または削除のみが可能です。
プラン制限の説明:
企業版ユーザーで、この機能を使用する必要がある場合は、お問い合わせの上、利用を申請してください。

操作手順

1. EdgeOneコンソールにログインし、左側のメニューバーで「サービス概要」に入り、「ウェブサイトのセキュリティ強化」内で設定が必要なサイトをクリックします。
2. サイト詳細ページで、CLS > リアルタイムログをクリックします。
3. リアルタイムログページで、新しい配信タスクを作成をクリックします(または既存タスクの編集をクリックします)。
4. ログソース選択ページで、タスク名を入力し、ログタイプ、サービスリージョンを選択し、次へをクリックします。
5. 配信内容定義ページで、カスタムフィールドを追加をクリックします。
6. カスタムフィールド名を入力してください。
7. フィールド値入力ボックスに式を入力します。$を入力すると、プリセット変数の候補が表示されます。数式名を入力すると、数式のクイック検索がトリガーされます。
8. 保存をクリックします。
9. 宛先の設定が完了したら、配信をクリックします。

例

例1:プリセット変数とconcat式の使用

シナリオ:リクエスト情報からキー識別子を抽出し、1つのレコードに連結します。
フィールド名:ClientInfo
式:
concat('host=', ${RequestHost}, ' ip=', ${ClientIP}, ' status=', ${EdgeResponseStatusCode})
出力例:
"ClientInfo": "host=www.example.com ip=1.2.3.4 status=200"

例2:比較演算子とif式の使用

シナリオ:レスポンスステータスコードに基づいてsuccess / errorタグに分類します。
フィールド名:StatusCategory
式:
if(${EdgeResponseStatusCode}>=200 && ${EdgeResponseStatusCode}<300, 'success', 'error')
説明:>=、<比較演算子と&&論理演算子を組み合わせて、if式で条件判断を実現します。
出力例(ステータスコード200):
"StatusCategory": "success"
出力例(ステータスコード404):
"StatusCategory": "error"

例3:レスポンスヘッダー変数の使用

シナリオ:EOがクライアントに返すレスポンスヘッダーContent-Typeを取得します。
フィールド名:ContentType
式:
${http.response.headers['content-type']}
出力例:
"ContentType": "text/html; charset=utf-8"

例4:regexp_extract式を使用した正規表現抽出

シナリオ:User-AgentからChromeのメジャーバージョン番号を抽出します。
フィールド名:ChromeVersion
式:
regexp_extract(${http.request.headers['user-agent']}, 'Chrome/([0-9.]+)', 1)
説明:regexp_extract式の3番目のパラメータはキャプチャグループの番号であり、1は最初のキャプチャグループ([0-9.]+)の内容を抽出することを示します。
出力例:
"ChromeVersion": "120.0.0"

例5:timestamp_formatを使用したタイムスタンプ変換

シナリオ:RequestTimeタイムスタンプを指定タイムゾーンのカスタム形式に変換します。
フィールド名:RequestTimeFormatted
式:
timestamp_format(unix_timestamp(${RequestTime})*1000, 'yyyy-MM-dd HH:mm:ss', 'Asia/Shanghai')
説明:${RequestTime}はISO 8601形式の文字列であり、unix_timestamp()によって秒単位のタイムスタンプに変換してから1000を掛けてミリ秒値を取得し、さらにtimestamp_format()によってフォーマットして出力します。3番目のパラメータ'Asia/Shanghai'は出力タイムゾーンを北京時間として指定し、省略時はUTCを使用します。
出力例:
"RequestTimeFormatted": "2025-08-06 14:30:00"

付録:BNF構文リファレンス

以下はカスタムフィールド値式の構文仕様です:
<custom_field_value> ::= <expr>

<expr> ::= <term> ("+" | "-" <term>)*
<term> ::= <factor> ("*" | "/" | "%" <factor>)*
<factor> ::= ("-")? <primary>
<primary> ::= <num> | <literal_string> | <var> | <func_call> | "(" <expr> ")"

<var> ::= "$" "{" <var_name> (<index_key>)? "}"
<var_name> ::= [a-zA-Z] ([a-zA-Z0-9] | "_" | ".")*
<index_key> ::= "[" <literal_string> "]"

<func_call> ::= <func_name> "(" (<func_args>)? ")"
<func_name> ::= [a-z] ([a-z] | [0-9] | "_")*
<func_args> ::= <func_arg> ("," <func_arg>)*
<func_arg> ::= <logic_or>

<logic_or> ::= <logic_and> ("||" <logic_and>)*
<logic_and> ::= <comparison> ("&&" <comparison>)*
<comparison> ::= <expr> (<cmp_op> <expr>)?
<cmp_op> ::= "==" | "!=" | ">=" | "<=" | ">" | "<"

<num> ::= [0-9]+ ("." [0-9]+)?

<literal_string> ::= "'" (<ls_plain> | <ls_escape>)* "'"
<ls_escape> ::= "\\" ("'" | """ | "\\" | "/" | "b" | "f" | "t" | <unicode_esc>)
<unicode_esc> ::= "u" <hex> <hex> <hex> <hex>
<hex> ::= [0-9] | [a-f] | [A-F]
<ls_plain> ::= [a-zA-Z0-9] | " " | "!" | """ | "#" | "$" | "%" | "&" | "("
| ")" | "*" | "+" | "," | "-" | "." | "/" | ":" | ";" | "<"
| "=" | ">" | "?" | "@" | "[" | "]" | "^" | "_" | "`"
| "{" | "|" | "}" | "~"

参考資料

HTTP標準ヘッダー

各種HTTPリクエストヘッダーおよびレスポンスヘッダーの意味を理解し、それらをログに記録するかどうかを判断したい場合は、HTTP標準ヘッダー説明を参照してください。










ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック