はじめに
先日v8.17.0がリリースされましたが、その中にLogsDBという機能が含まれています。これはログをElasticsearchに取り込む際により効率的に保存することで、ログによるストレージ利用量を大きく削減する機能です。メトリクスではすでにTSDSとしてリリースしているもののログ版のような感じです。容量削減以外にも、近いデータ(host.nameや@timestamp)を同じ場所に置くという機能もあります。
正式なドキュメントとブログはこちらです。
https://www.elastic.co/guide/en/elasticsearch/reference/current/logs-data-stream.html
https://www.elastic.co/search-labs/blog/elasticsearch-logsdb-index-mode
大きくはsynthetic _sourceによる削減です。これはElasticsearchには_sourceというフィールドにそのドキュメントのすべてのデータが入っていたのですが、これを必要なときに組み立てるようにした機能です。
Dev Toolsでsearchクエリをかけると_sourceフィールドが表示されているのを見たことがあるかと思います。
{
"took": 3454,
"timed_out": false,
"_shards": {
"total": 6,
"successful": 6,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": 3.060212e-7,
"hits": [
{
"_index": ".ds-elastic-cloud-logs-8-2024.12.13-000010",
"_id": "NIb1zJMBR1m15PL7bWVj",
"_score": 3.060212e-7,
"_source": {
"@timestamp": "2024-12-16T00:54:05.466Z",
"ecs.version": "1.6.0",
"state": "HEALTHY",
"log.level": "info",
"input": {
"type": "log"
},
"host": {
"name": "53a029ee4db3"
},
synthetic _source以外にも圧縮方法を変更したりしています。ログにもよりますが、最大で65%削減という場合もあるようです。
本記事ではLogsDBの使い方に始まり、全く同じログデータを投入してLogsDBの有無でどのように変わるのかを説明いたします。
本機能を利用するためにはEnterpriseライセンスが必要です
LogsDB自体はBasicでも利用可能ですが、容量を削減させるSynthetic _sourceはEnterpriseライセンスのみです
準備
v8.17.0のElasticクラスタが必要です。クラウドもしくはオンプレで用意しましょう。
Elastic Agentを利用するので、オンプレの場合はFleet Serverも立ち上げます。
Elastic Cloudなら自動的にFleetも立ち上がります。
Elastic Cloudで新しくクラスタを作成する場合、v8.16.0以降で少し見た目が変わります。以下の記事を参考にしてください。
https://qiita.com/takeo-furukubo/items/b041b2aff9cf068c21f1
手順
本記事はv8.17.0をベースに記載しています
Apache HTTP Logの準備
別に何でも良いのですが、コンテナでさっと疑似ログを作成できるApache HTTP Logで試します。
こちらを参考にしてください。
https://zenn.dev/not75743/articles/fb5be8a9ac838a
数秒で100MBを超えるログが用意されます。
今回は980万行で2.1GB程度のログを用意しました。
Ctrl-Cで止めないと作り続けるので注意してください。
$ docker compose exec apacheloggen apache-loggen > apache.log
$ ls -l apache.log
-rw-r--r-- 1 takeofurukubo staff 2169571349 12 18 01:43 apache.log
$ wc -l apache.log
9854316 apache.log
v8.17ではある程度のログ量(1GB程度)がないと効果が出ません
Apache HTTP Log Integrations
Integrationはログを自動的に整形して可視化のダッシュボードを作成するものです。
Ingest PipelineとKibana Lensが主な構成要素です。
まず3本線メニューからManagementの下にあるIntegrationsをクリックします。

検索バーがあるのでapache httpと入力すると以下のようにフィルタされるので、表示されているApache HTTP Serverをクリックします。

右上のApache HTTP Serverをクリックします。

次の画面はクラスタ作成後に初めてIntegrationsを追加する人だけ表示されます
この画面が表示されたら、一番下のAdd integration only (skip agent installation)をクリックします。

以下を設定します。
-
Collect metrics from Apache instancesのチェックを外す- 疑似ログなのでメトリクスは取れません
-
Collect logs from Apache instancesの横にあるChange defaultsをクリック- ここではログの場所を指定しています。疑似ログなので
/var等は必要ありません。 -
Add rowをクリックして/<ログの場所>/apache*.logを追加。これは実際にログのある場所を指定してください。(画面では/elastic/apache*.logとなっています) - 他の3つを消す(別にあってもよいですが)
- ここではログの場所を指定しています。疑似ログなので
最後に右下のSave and continueをクリックします。

次にAdd Elastic Agent to your hostsをクリックしてElastic Agentをインストールします。

少しスクロールダウンすると各環境におけるインストールコマンドが表示されていますので、これをコピー&ペーストしてインストールします。

問題なくインストールができて設定に問題がなければ以下のようになります。

Apache HTTP Logを投入
そのままでも良いのですが、大きな疑似ファイルを作ってしまった場合だと、デフォルトだと時間がかかるので少し設定を変更します。
Elastic Agentの多重度変更
このページに有るOptimized for Throughputにします。
workerが4になるので、Elastic Agentを動作させている端末の負荷は大きく上がります。本番で使うときは気をつけましょう。
https://www.elastic.co/guide/en/fleet/current/es-output-settings.html#es-output-settings-performance-tuning-settings
まず3本線メニューからFleetをクリックして、Settingsをクリック

Outputsにあるdefaultの横にある鉛筆マークをクリック

一番下にあるPerformance TuningからThroughputを選び、右下のSave and apply settingsをクリック

確認ダイアログが立ち上がるので、Save and deployをクリック

取り込み開始
最初に作ったapache.logをElastic Agentで指定した場所にコピーします
すると自動的に取り込みが始まります。
まずはLogsDB無しの状態で取り込みます。
以下の手順で確認できます。
3本線メニューから一番下のStack Managementをクリック

検索ボックスにapacheと入れて、右上にあるInclude hidden indicesのチェックをつける

Document Countに投入した行数が表示されているので、これが作成した疑似ログの行数と同じになるまで待ちます。
実は投入自体はそこまで時間がかからなくても、ここの表示が追いつかないことはあります。RDBと違ってEventually Consistentなので、結果の表示は少し遅れます。
9854316行、2169571349バイトのApacheログを取り込むと以下のようになりました。容量が大きいのは、JSON化されていることと冗長化されていることによります。

LogsDBを有効にする
ではLogsDBを有効にしてから同じログを取り込みます。
Data Streamの設定を変更します。Data Streamについてはこちらの記事を参考にしてください。
https://qiita.com/takeo-furukubo/items/78de759b0d94e158e49b
Indexを表示しているページで、右端のlogs-apache.access-defaultをクリック

Index templateの下のlogs-apache.accessをクリック

Index Templateの設定ページになるので、Index modeのプルダウンメニューからLogsDBを選ぶ

右上のReview Templatesをクリックして、Save templatesをクリックして保存します。
Index modeがLogsDBになっています。

遷移した画面でSettingsをクリックすると、logsdbが設定されているのがわかります。

Rolloverする
新しい設定が入ったIndexにデータを取り込むためにRolloverします。
3本線メニューからManagementの下にあるDev Toolsをクリック

左側の画面に以下を入力して実行します。
POST logs-apache.access-default/_rollover
Stack Management->Index Managementで新しいインデックス(.ds-logs-apache.access-default-2024.12.17-000002)が作成されたことを確認します。

これ以降Elastic Agentからの取り込みはこの新しいインデックスに書き込まれます。
Apache HTTP Logを再投入
Elastic Agentで指定したディレクトリで一度apache.logを消してコピーすると再度取り込んでくれます。
最終形
5.32GB -> 3.66GBに減っていますので、だいたい32%減となります。
これはApache Logの場合の数字ですので、ログの種類によっていどのぐらい減るかは是非テストしてみてください。
まとめ
Enterpriseライセンスを使用すると、本記事で紹介したLogsDBに加えてSearchable Snapshotも利用できます。これらを駆使することで、ログの種類によって最適な状態にできます。
監査ログはそこまで頻繁に検索しないのでLogsDB+Searchable Snapshot、メトリクスは1週間で廃棄、など自由に組み合わせることができます。
ただ、Synthetic _sourceによって_sourceを持ってくる場合はCPUの負荷が上がることもあります。
うまく組み合わせてコストとパフォーマンスの最適化を行ってみてください。



