取り込みプロセッサを使用して、ログがLogstoreに書き込まれる前にログを処理できます。 たとえば、インジェストプロセッサを使用して、フィールドの変更、フィールドの解析、データのフィルタリング、データのマスクを行うことができます。 このトピックでは、取り込みプロセッサを設定する方法について説明します。 このトピックでは、取り込みプロセッサが使用されるシナリオについても説明します。
前提条件
プロジェクトと標準ログストアが作成され、ログ収集設定が構成されます。 詳細については、参照プロジェクトの作成,Logstoreの作成、およびデータ収集の概要.
シナリオ
生ログからrequest_method
、request_uri
、およびstatus
フィールドを抽出するには、次の操作を実行します。
生ログ
body_bytes_sent: 22646
host: www.example.com
http_protocol: HTTP/1.1
remote_addr: 192.168.31.1
remote_user: Elisa
request_length: 42450
request_method: GET
request_time: 675
request_uri: /index.html
status: 200
time_local: 2024-12-04T13:47:54+08:00
手順
取り込みプロセッサを作成します。
にログインします。Simple Log Serviceコンソール.
[プロジェクト] セクションで、表示するプロジェクトをクリックします。
左側のナビゲーションウィンドウで、
を選択します。[プロセッサの取り込み] タブで、[作成] をクリックします。 [プロセッサの作成] パネルで、[プロセッサ名] 、[SPL] 、[エラー処理] パラメーターを設定し、[OK] をクリックします。 下表に、各パラメーターを説明します。
パラメーター
説明
プロセッサ名
取り込みプロセッサの名前。 例:
nginx-logs-text
説明
取り込みプロセッサの説明。
SPL
Simple Log Service Processing Language (SPL) ステートメント。 例:
* | project request_method, request_uri, status
詳細については、「SPL instructions」をご参照ください。
エラー処理
SPLベースのデータ処理障害が発生したときに実行されるアクション。 有効な値:
生データの保持
生データの破棄
説明このトピックでは、SPLベースのデータ処理の失敗とは、SPLステートメントの実行の失敗を指します。 例えば、SPL文は、無効なデータ入力のために実行されないことがある。 無効なSPL構文によって引き起こされるSPLベースのデータ処理の失敗は含まれません。
無効なSPL構文設定のためにデータの解析に失敗した場合、生データはデフォルトで保持されます。
取り込みプロセッサをLogstoreに関連付けます。
管理するプロジェクトの左側のナビゲーションウィンドウで、[ログストレージ] をクリックし、管理するログストアにポインターを移動してから、
を選択します。Logstore属性ページの右上隅にある [変更] をクリックします。 編集モードで、取り込みプロセッサドロップダウンリストからLogstoreに関連付ける取り込みプロセッサを選択し、[保存] をクリックします。
説明関連付けられた取り込みプロセッサは、増分ログに対してのみ有効です。 取り込みプロセッサを有効にするには約1分かかります。
Logstoreのクエリと分析ページで、[検索と分析] をクリックして、収集したログを照会します。
他のシナリオ
フィールドの変更
フィールドを管理するには、
project
、project-away
、project-rename
、extend
のSPL手順を使用できます。 Raw log:body_bytes_sent: 22646 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.31.1 remote_user: Elisa request_length: 42450 request_method: PUT request_time: 675 request_uri: /request/path-1/file-6?query=123456 status: 200 time_local: 2024-12-04T13:47:54+08:00
シナリオ
要件の説明
SPLステートメント
結果
特定のフィールドを保持する
次のフィールドのみを保持します。
request_method
request_uri
status
* | project request_method, request_uri, status
request_method: PUT request_uri: /request/path-1/file-6?query=123456 status: 200
次のフィールドのみを保持し、結果フィールドの名前を変更します。
request_method
フィールドの名前をmethod
に変更します。request_uri
フィールドの名前をuri
に変更します。ステータス
を使用します。
* | project method=request_method, uri=request_uri, status
method: PUT uri: /request/path-1/file-6?query=123456 status: 200
名前が
request_
で始まるすべてのフィールドを保持します。* | project -wildcard "request_*"
request_length: 42450 request_method: PUT request_time: 675 request_uri: /request/path-1/file-6?query=123456
特定のフィールドの削除
次のフィールドを削除します。
http_protocol
リファラー
remote_addr
remote_user
* | project-away http_protocol, referer, remote_addr, remote_user
body_bytes_sent: 22646 host: www.example.com request_length: 42450 request_method: PUT request_time: 675 request_uri: /request/path-1/file-6?query=123456 status: 200 time_local: 2024-12-04T13:47:54+08:00
名前が
request_
で始まるすべてのフィールドを削除します。* | project-away -wildcard "request_*"
body_bytes_sent: 22646 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.31.1 remote_user: Elisa status: 200 time_local: 2024-12-04T13:47:54+08:00
フィールドの作成
app
という名前のフィールドを作成し、そのフィールドの値をtest-app
に設定します。* | extend app='test-app'
app: test-app body_bytes_sent: 22646 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.31.1 remote_user: Elisa request_length: 42450 request_method: PUT request_time: 675 request_uri: /request/path-1/file-6?query=123456 status: 200 time_local: 2024-12-04T13:47:54+08:00
request_query
という名前のフィールドを作成し、request_uri
フィールドの値からrequest_queryフィールドの値を抽出します。* | extend request_query=url_extract_query(request_uri)
body_bytes_sent: 22646 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.31.1 remote_user: Elisa request_length: 42450 request_method: PUT request_query: query=123456 request_time: 675 request_uri: /request/path-1/file-6?query=123456 status: 200 time_local: 2024-12-04T13:47:54+08:00
フィールド名の変更
time_local
フィールドの名前をtime
に変更します。* | project-rename time=time_local
body_bytes_sent: 22646 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.31.1 remote_user: Elisa request_length: 42450 request_method: PUT request_time: 675 request_uri: /request/path-1/file-6?query=123456 status: 200 time: 2024-12-04T13:47:54+08:00
フィールド値の変更
request_uri
フィールドのパスを保持し、クエリパラメーターを削除します。* | extend request_uri=url_extract_path(request_uri)
または
* | extend request_uri=regexp_replace(request_uri, '\?.*', '')
body_bytes_sent: 22646 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.31.1 remote_user: Elisa request_length: 42450 request_method: PUT request_time: 675 request_uri: /request/path-1/file-6 status: 200 time_local: 2024-12-04T13:47:54+08:00
Parseフィールド
parse-regexp
、parse-JSON
、parse-csv
のSPL命令と正規表現関数やjson関数などのSQL処理関数を使用して、フィールドを解析および抽出できます。シナリオ
生データ
要件の説明
SPLステートメント
結果
正規表現モードでのデータ解析
content: 192.168.1.75 - David [2024-07-31T14:27:24+08:00] "PUT /request/path-0/file-8 HTTP/1.1" 819 21577 403 73895 www.example.com www.example.com "Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1"
NGINXアクセスログから正規表現を使用してフィールドを抽出し、生データの
content
フィールドを破棄します。* | parse-regexp content, '(\S+)\s-\s(\S+)\s\[(\S+)\]\s"(\S+)\s(\S+)\s(\S+)"\s(\d+)\s(\d+)\s(\d+)\s(\d+)\s(\S+)\s(\S+)\s"(.*)"' as remote_addr, remote_user, time_local, request_method, request_uri, http_protocol, request_time, request_length, status, body_bytes_sent, host, referer, user_agent | project-away content
body_bytes_sent: 73895 host: www.example.com http_protocol: HTTP/1.1 referer: www.example.com remote_addr: 192.168.1.75 remote_user: David request_length: 21577 request_method: PUT request_time: 819 request_uri: /request/path-0/file-8 status: 403 time_local: 2024-07-31T14:27:24+08:00 user_agent: Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1
request_method: PUT request_uri: /request/path-0/file-8 status: 200
request_uri
フィールドから文字列file-8
を抽出し、文字列file
に名前を付けます。* | extend file=regexp_extract(request_uri, 'file-.*')
file: file-8 request_method: PUT request_uri: /request/path-0/file-8 status: 200
JSONモードでのデータ解析
headers: {"Authorization": "bearer xxxxx", "X-Request-ID": "29bbe977-9a62-4e4a-b2f4-5cf7b65d508f"}
JSONモードで
headers
フィールドを解析し、生データのheaders
フィールドを破棄します。* | parse-json headers | project-away headers
Autorization: bearer xxxxx X-Request-ID: 29bbe977-9a62-4e4a-b2f4-5cf7b65d508f
headers
フィールドから特定のフィールドを抽出します。 たとえば、ヘッダーフィールドからAuthorization
フィールドを抽出し、Authorizationフィールドの名前をtoken
に変更します。* | extend token=json_extract_scalar(headers, 'Authorization')
headers: {"Authorization": "bearer xxxxx", "X-Request-ID": "29bbe977-9a62-4e4a-b2f4-5cf7b65d508f"} token: bearer xxxxx
request: {"body": {"user_id": 12345, "user_name": "Alice"}}
JSONモードで
request
フィールドのbody
フィールドを解析します。* | parse-json -path='$.body' request
request: {"body": {"user_id": 12345, "user_name": "Alice"}} user_id: 12345 user_name: Alice
区切り文字モードでのデータ解析
content: 192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",www.example.com
コンマ (,) を使用してフィールドを分割し、生データの
content
フィールドを破棄します。* | parse-csv -quote='"' content as ip, time, host | project-away content
host: www.example.com ip: 192.168.0.100 time: 10/Jun/2019:11:32:16,127 +0800
content: 192.168.0.100||10/Jun/2019:11:32:16,127 +0800||www.example.com
区切り文字
| |
を使用してフィールドを分割し、生データのcontent
フィールドを破棄します。* | parse-csv -delim='||' content as ip, time, host | project-away content
host: www.example.com ip: 192.168.0.100 time: 10/Jun/2019:11:32:16,127 +0800
フィルターデータ
where
命令を使用してデータをフィルタリングできます。SPLベースのデータ処理中は、生データのすべてのフィールドがデフォルトでテキストとして使用されることに注意してください。 数値を処理する前に、データ型変換関数を使用して、必要なフィールドの値を変換する必要があります。 詳細については、「データ型変換関数」をご参照ください。
生データ
要件の説明
SPLステートメント
結果
request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919 status: 200 --- request_id: 7f9dad20-bc57-4aa7-af0e-436621f1f51d status: 500
status
フィールド値が200
のログのみを保持します。* | where status='200'
または
* | where cast(status as bigint)=200
request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919 status: 200
request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919 status: 200 --- request_id: 7f9dad20-bc57-4aa7-af0e-436621f1f51d status: 500 error: something wrong
error
フィールドを含まないログのみを保持します。* | where error is null
request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919 status: 200
error
フィールドを含むログのみを保持します。* | where error is not null
request_id: 7f9dad20-bc57-4aa7-af0e-436621f1f51d status: 500 error: something wrong
method: POST request_uri: /app/login --- method: GET request_uri: /user/1/profile status: 404 --- method: GET request_uri: /user/2/profile status: 200
request_uri
フィールド値が/user/
で始まるログのみを保持します。* | where regexp_like(request_uri, '^\/user\/')
method: GET request_uri: /user/1/profile status: 404 --- method: GET request_uri: /user/2/profile status: 200
request_uri
フィールド値が/user/
で始まり、status
フィールド値が200
のログのみを保持します。* | where regexp_like(request_uri, '^\/user\/') and status='200'
method: GET request_uri: /user/2/profile status: 200
マスクデータ
extend
命令と、正規表現関数、文字列関数、URL関数などのSQL関数を使用して、データをマスクできます。regexp_replace
関数を使用してフィールド値を置き換える場合、キャプチャグループを使用できます。\1
、\2
、および \Nを使用して、1番目、2番目、およびN番目のキャプチャグループの値を表すことができます。たとえば、
regexp_replace('192.168.1.1 ', '(\d +)\.(\d +)\.\d +. \\d + ', '\1.\2.*.*.* ')
関数の結果は192.168.*
です。生データ
要件の説明
SPLステートメント
結果
request_uri: /api/v1/resources?user=123&ticket=abc status: 200
request_uri
フィールドから機密情報を削除します。* | extend request_uri=url_extract_path(request_uri)
または
* | extend request_uri=regexp_replace(request_uri, '\?.*', '')
request_uri: /api/v1/resources status: 200
client_ip: 192.168.1.123 latency: 100
IPアドレスの中央の2オクテットをアスタリスク (*) でマスクします。
* | extend client_ip=regexp_replace(client_ip, '(\d+)\.\d+\.\d+\.(\d+)', '\1.*.*.\2')
client_ip: 192.*.*.123 latency: 100
sql: SELECT id, name, config FROM app_info WHERE name="test-app" result_size: 1024
sql
フィールドには機密情報が含まれます。 この場合、操作とテーブル名のみを保持します。* | extend table=regexp_extract(sql, '\bFROM\s+([^\s;]+)|\bINTO\s+([^\s;]+)|\bUPDATE\s+([^\s;]+)', 1) | extend action=regexp_extract(sql,'\b(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)\b', 1) | project-away sql
action: SELECT table: app_info result_size: 1024