[8.17.0] ログ量を大きく減らすLogsDBを試す

# はじめに
先日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`フィールドが表示されているのを見たことがあるかと思います。
```json
{
  "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の有無でどのように変わるのかを説明いたします。

:::note info
本機能を利用するためには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

# 手順
:::note info
本記事は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
```

:::note info
v8.17ではある程度のログ量(1GB程度)がないと効果が出ません
:::

## Apache HTTP Log Integrations
Integrationはログを自動的に整形して可視化のダッシュボードを作成するものです。
Ingest PipelineとKibana Lensが主な構成要素です。

まず3本線メニューからManagementの下にあるIntegrationsをクリックします。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_2603229_305ca722-64b8-7de4-ab54-f9bd32e37d6d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/55c660bb-1259-8a53-e16b-dccc6c449030.png)

検索バーがあるので`apache http`と入力すると以下のようにフィルタされるので、表示されているApache HTTP Serverをクリックします。
![スクリーンショット 2024-12-16 10.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/87ceb0c2-4205-6e08-d8b8-b9e53de47124.png)

右上の`Apache HTTP Server`をクリックします。
![スクリーンショット 2024-12-16 10.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/d55b75fc-392d-614a-baf9-19e65def45eb.png)

:::note
次の画面はクラスタ作成後に初めてIntegrationsを追加する人だけ表示されます
:::
この画面が表示されたら、一番下の`Add integration only (skip agent installation)`をクリックします。
![スクリーンショット 2024-11-27 17.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/1dd0a763-e2f0-1c98-9248-d8fdad88c7d5.png)

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

最後に右下の`Save and continue`をクリックします。
![スクリーンショット 2024-12-16 10.22.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/b0038c43-2924-bcd1-a5fb-0e2ffeda3016.png)

次に`Add Elastic Agent to your hosts`をクリックしてElastic Agentをインストールします。
![スクリーンショット 2024-12-16 9.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/a7c0b42d-2b15-7089-8787-8b5fe9547ea0.png)

少しスクロールダウンすると各環境におけるインストールコマンドが表示されていますので、これをコピー＆ペーストしてインストールします。
![スクリーンショット 2024-12-16 10.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/cbbbac85-c29b-76d5-2446-60d610520b3c.png)

問題なくインストールができて設定に問題がなければ以下のようになります。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_2603229_39f504ea-b6de-cfe7-4faf-0128bfff1d74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f304859e-4fd7-04ef-85c9-a335505f08a9.png)

## 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`をクリック
![スクリーンショット 2024-12-16 10.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/61ffe985-c096-092e-c7ea-ef3711499b29.png)

`Outputs`にある`default`の横にある鉛筆マークをクリック
![スクリーンショット 2024-12-16 10.45.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/dab1df41-76e2-ba00-42df-9c851e4503b9.png)

一番下にある`Performance Tuning`から`Throughput`を選び、右下の`Save and apply settings`をクリック
![スクリーンショット 2024-12-16 10.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/01bda4b6-432a-aa8f-6ee4-3c37108771ba.png)

確認ダイアログが立ち上がるので、`Save and deploy`をクリック
![スクリーンショット 2024-12-16 10.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/b438673e-6c4d-9ea3-85dc-140a7917f56e.png)

### 取り込み開始
最初に作った`apache.log`をElastic Agentで指定した場所にコピーします
すると自動的に取り込みが始まります。
まずはLogsDB無しの状態で取り込みます。

以下の手順で確認できます。

3本線メニューから一番下の`Stack Management`をクリック
![スクリーンショット 2024-12-16 11.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/3345115e-dc86-4389-fa54-a0db434be785.png)

`Index management`をクリック
![スクリーンショット 2024-12-16 10.36.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/54d19a23-521c-0b8a-a1f6-6bad8c268c2a.png)

検索ボックスに`apache`と入れて、右上にある`Include hidden indices`のチェックをつける
![スクリーンショット 2024-12-16 10.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/4f498fe3-ce9c-ea4f-e034-1ac3eb6b807a.png)

`Document Count`に投入した行数が表示されているので、これが作成した疑似ログの行数と同じになるまで待ちます。
実は投入自体はそこまで時間がかからなくても、ここの表示が追いつかないことはあります。RDBと違ってEventually Consistentなので、結果の表示は少し遅れます。
9854316行、2169571349バイトのApacheログを取り込むと以下のようになりました。容量が大きいのは、JSON化されていることと冗長化されていることによります。
![スクリーンショット 2024-12-18 9.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/655d3a12-b601-e7c4-4360-7c4ae3981f87.png)


## LogsDBを有効にする
ではLogsDBを有効にしてから同じログを取り込みます。
Data Streamの設定を変更します。Data Streamについてはこちらの記事を参考にしてください。
https://qiita.com/takeo-furukubo/items/78de759b0d94e158e49b

Indexを表示しているページで、右端の`logs-apache.access-default`をクリック
![スクリーンショット 2024-12-16 11.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/02c7ae92-4d22-d945-88b6-9e2ac55120a4.png)

Index templateの下の`logs-apache.access`をクリック
![スクリーンショット 2024-12-16 11.15.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/726727bf-de62-493c-ca25-beb503f8520f.png)

右下の`Manage`をクリックして、`Edit`をクリック
![スクリーンショット 2024-12-16 11.20.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5fe8e854-cea5-1dd5-255a-21f12d61f7c5.png)

Index Templateの設定ページになるので、`Index mode`のプルダウンメニューから`LogsDB`を選ぶ
![スクリーンショット 2024-12-18 9.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/e1cc642c-5ccb-b118-6d8a-db3a1dfc3667.png)

右上の`Review Templates`をクリックして、`Save templates`をクリックして保存します。
`Index mode`が`LogsDB`になっています。
![スクリーンショット 2024-12-18 9.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f43d8c0d-eb79-084e-f507-25dd1cbc8b58.png)

遷移した画面で`Settings`をクリックすると、logsdbが設定されているのがわかります。
![スクリーンショット 2024-12-16 11.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/afda0957-4206-3c34-5eb4-43c1e76c32a8.png)

## Rolloverする
新しい設定が入ったIndexにデータを取り込むためにRolloverします。
3本線メニューから`Management`の下にある`Dev Tools`をクリック
![スクリーンショット 2024-12-16 11.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/ac140b9a-9da5-d6ea-2c3c-5ae7183db625.png)

左側の画面に以下を入力して実行します。
```
POST logs-apache.access-default/_rollover
```
![スクリーンショット 2024-12-16 11.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/8aef21c8-d7fe-2afb-486a-71fdd8687415.png)

`Stack Management`->`Index Management`で新しいインデックス(`.ds-logs-apache.access-default-2024.12.17-000002`)が作成されたことを確認します。
![スクリーンショット 2024-12-18 9.27.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/1326960b-bb6a-7cc5-2d47-e1a46cf5a682.png)


これ以降Elastic Agentからの取り込みはこの新しいインデックスに書き込まれます。

## Apache HTTP Logを再投入
Elastic Agentで指定したディレクトリで一度`apache.log`を消してコピーすると再度取り込んでくれます。

## 最終形
最終的にこの様になりました。
![スクリーンショット 2024-12-18 9.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/2962210b-fa61-5b61-7551-3475a90e4ee9.png)

5.32GB -> 3.66GBに減っていますので、だいたい32%減となります。
これはApache Logの場合の数字ですので、ログの種類によっていどのぐらい減るかは是非テストしてみてください。

# まとめ
Enterpriseライセンスを使用すると、本記事で紹介したLogsDBに加えてSearchable Snapshotも利用できます。これらを駆使することで、ログの種類によって最適な状態にできます。
監査ログはそこまで頻繁に検索しないのでLogsDB＋Searchable Snapshot、メトリクスは１週間で廃棄、など自由に組み合わせることができます。
ただ、Synthetic _sourceによって_sourceを持ってくる場合はCPUの負荷が上がることもあります。

うまく組み合わせてコストとパフォーマンスの最適化を行ってみてください。