例: 一般ログ形式でのログ解析
この例のチュートリアルでは、ingest pipelineを使用して、インデックス作成前に一般ログ形式のサーバーログを解析します。開始する前に、ingest pipelinesの前提条件を確認してください。
解析したいログは次のようになります:
ログ
212.87.37.154 - - [05/May/2099:16:21:15 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
これらのログには、タイムスタンプ、IPアドレス、およびユーエージェントが含まれています。これらの3つの項目をElasticsearchの独自のフィールドに設定して、より迅速な検索と視覚化を実現したいと考えています。また、リクエストがどこから来ているのかを知りたいです。
- 1. Kibanaで、メインメニューを開き、Stack Management \u0026gt; Ingest
Pipelinesをクリックします。
- 2. Create pipeline > New pipelineをクリックします。
- 3. Nameを
my-pipeline
に設定し、オプションでパイプラインの説明を追加します。 - 4. grok processorを追加してログメッセージを解析します:
- 4.1. Add a processorをクリックし、Grokプロセスタイプを選択します。
- 4.2. Fieldを
message
に設定し、Patternsを次のgrok patternに設定します:
Grok
%{IPORHOST:source.ip} %{USER:user.id} %{USER:user.name} \[%{HTTPDATE:@timestamp}\] "%{WORD:http.request.method} %{DATA:url.original} HTTP/%{NUMBER:http.version}" %{NUMBER:http.response.status_code:int} (?:-|%{NUMBER:http.response.body.bytes:int}) %{QS:http.request.referrer} %{QS:user_agent}
- 4.3. Addをクリックしてプロセッサを保存します。
- 4.4. プロセッサの説明を
Extract fields from 'message'
に設定します。
- 4.4. プロセッサの説明を
- 5. タイムスタンプ、IPアドレス、およびユーエージェントフィールドのためのプロセッサを追加します。プロセッサを次のように構成します:
| プロセスタイプ | フィールド | 追加オプション | 説明 |
| :— | :— | :— | :— |
| Date |@timestamp
| Formats:dd/MMM/yyyy:HH:mm:ss Z
|Format '@timestamp' as 'dd/MMM/yyyy:HH:mm:ss Z'
|
| GeoIP |source.ip
| Target field:source.geo
|Add 'source.geo' GeoIP data for 'source.ip'
|
| User agent |user_agent
| |Extract fields from 'user_agent'
|
あなたのフォームは次のようになります:
4つのプロセッサは順次実行されます:
Grok \u0026gt; Date \u0026gt; GeoIP \u0026gt; User agent
矢印アイコンを使用してプロセッサの順序を変更できます。
または、Import processorsリンクをクリックして、プロセッサをJSONとして定義できます:
Js
{
"processors": [
{
"grok": {
"description": "Extract fields from 'message'",
"field": "message",
"patterns": ["%{IPORHOST:source.ip} %{USER:user.id} %{USER:user.name} \\[%{HTTPDATE:@timestamp}\\] \"%{WORD:http.request.method} %{DATA:url.original} HTTP/%{NUMBER:http.version}\" %{NUMBER:http.response.status_code:int} (?:-|%{NUMBER:http.response.body.bytes:int}) %{QS:http.request.referrer} %{QS:user_agent}"]
}
},
{
"date": {
"description": "Format '@timestamp' as 'dd/MMM/yyyy:HH:mm:ss Z'",
"field": "@timestamp",
"formats": [ "dd/MMM/yyyy:HH:mm:ss Z" ]
}
},
{
"geoip": {
"description": "Add 'source.geo' GeoIP data for 'source.ip'",
"field": "source.ip",
"target_field": "source.geo"
}
},
{
"user_agent": {
"description": "Extract fields from 'user_agent'",
"field": "user_agent"
}
}
]
}
- 6. パイプラインをテストするには、Add documentsをクリックします。
- 7. Documentsタブで、テスト用のサンプルドキュメントを提供します:
Js
[
{
"_source": {
"message": "212.87.37.154 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\""
}
}
]
- 8. Run the pipelineをクリックして、パイプラインが期待通りに動作したことを確認します。
- 9. すべてが正しく見える場合は、パネルを閉じて、Create
pipelineをクリックします。
これで、ログデータをdata streamにインデックス作成する準備が整いました。 - 10. index templateを作成し、data stream enabledを設定します。
Python
resp = client.indices.put_index_template(
name="my-data-stream-template",
index_patterns=[
"my-data-stream*"
],
data_stream={},
priority=500,
)
print(resp)
Js
const response = await client.indices.putIndexTemplate({
name: "my-data-stream-template",
index_patterns: ["my-data-stream*"],
data_stream: {},
priority: 500,
});
console.log(response);
Console
PUT _index_template/my-data-stream-template
{
"index_patterns": [ "my-data-stream*" ],
"data_stream": { },
"priority": 500
}
- 11. 作成したパイプラインを使用してドキュメントをインデックスします。
Python
resp = client.index(
index="my-data-stream",
pipeline="my-pipeline",
document={
"message": "89.160.20.128 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\""
},
)
print(resp)
Js
const response = await client.index({
index: "my-data-stream",
pipeline: "my-pipeline",
document: {
message:
'89.160.20.128 - - [05/May/2099:16:21:15 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"',
},
});
console.log(response);
Console
POST my-data-stream/_doc?pipeline=my-pipeline
{
"message": "89.160.20.128 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\""
}
- 12. 確認するために、データストリームを検索してドキュメントを取得します。次の検索は、
filter_path
を使用して、document sourceのみを返します。
Python
resp = client.search(
index="my-data-stream",
filter_path="hits.hits._source",
)
print(resp)
Ruby
response = client.search(
index: 'my-data-stream',
filter_path: 'hits.hits._source'
)
puts response
Js
const response = await client.search({
index: "my-data-stream",
filter_path: "hits.hits._source",
});
console.log(response);
Console
GET my-data-stream/_search?filter_path=hits.hits._source
コンソール-結果
{
"hits": {
"hits": [
{
"_source": {
"@timestamp": "2099-05-05T16:21:15.000Z",
"http": {
"request": {
"referrer": "\"-\"",
"method": "GET"
},
"response": {
"status_code": 200,
"body": {
"bytes": 3638
}
},
"version": "1.1"
},
"source": {
"ip": "89.160.20.128",
"geo": {
"continent_name" : "Europe",
"country_name" : "Sweden",
"country_iso_code" : "SE",
"city_name" : "Linköping",
"region_iso_code" : "SE-E",
"region_name" : "Östergötland County",
"location" : {
"lon" : 15.6167,
"lat" : 58.4167
}
}
},
"message": "89.160.20.128 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"",
"url": {
"original": "/favicon.ico"
},
"user": {
"name": "-",
"id": "-"
},
"user_agent": {
"original": "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"",
"os": {
"name": "Mac OS X",
"version": "10.11.6",
"full": "Mac OS X 10.11.6"
},
"name": "Chrome",
"device": {
"name": "Mac"
},
"version": "52.0.2743.116"
}
}
}
]
}
}