IBM Cloud: Cloud Logsでのログの探し方（きほんのき）

# はじめに

IBM Cloudでは、Cloud Logsというログ機能が従来のLogAnalysisの後継としてリリースされています。新しいUIなので、全く馴染みのない人のためにすごく簡単なログの探し方を書いてみました。

# 1. ログを表示させる
まず、超初心者が1番ありがちなのは、初めてコンソールにアクセスした際に、以下のように表示されて"ログが表示されていない!?"って思うことです。これは、

- Priority Insights（管理者が特に重要とみなしているログだけを優先的に表示する機能）が選択されているから
- 正しい時間軸が選択されていないから

の可能性が高いです。それを修正してみると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/966edf1a-4b8a-a202-4138-832d22a6e7e9.png)

以下のようにログがずらずらと出てきましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/69744da7-2ea5-bbf0-bd9f-1b05d1bade35.png)

また、画面を広く使いたい場合は、適宜左側に表示されるフィルターを隠しましょう。
- Before ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/045d3e2e-9ca7-6240-8445-f4496c0f6bfe.png)
- After ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/afa6e011-53b7-1b77-60f2-a6ac8779f3f7.png)


# 2. タイムゾーンとログ日付フォーマットのカスタマイズ

表示されるログのTimestampは、デフォルトで`DD/MM/YYYY`のようになっています。つまり、2024年12月6日だと06/12/2024のように表示されます。初見の人にとっては、これに違和感を感じるはずです。必要に応じてこの表示方式は修正しましょう。また、タイムゾーンもデフォルトでは`Local time`ではなくGMTの方が良いという人は、そちらも変更することも可能です。

- Preferencesを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d67bd264-387b-ab0b-65fc-bc544f791c23.png)
- 必要に応じて`MM/DD/YYYY`方式に変更する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b8dc5f80-b692-8b66-8465-91dc2c6de061.png)




# 3. ログ表示のカスタマイズ

次に触ってみるべき箇所は、ログの表示方法です。今は１行ずつ表示されていますね。１つのログを隅々まで見る前に、まずはログを探さなければいけません。将来的にフィルタリングをして探していくにしても、そもそも１つ１つのログの違いの概要をざっと目視で把握する必要があります。そのためには、１つ１つのログをどのように一覧表示すると良さそうかを適宜その時々で使いやすいものに切り替えて利用すると良いでしょう。
（ちなみに私は普段は1 Lineを使っており、必要に応じてログを展開して確認するようにしています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/be4037d1-006e-e55e-3444-60f637a4bbd8.png)

- 1 Line: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1172280a-edc5-66ab-e1a3-bb857254e3ec.png) <br> ちなみに、`>`をクリックすることでログを展開し、以下のように詳細を表示させることも可能です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/48a98e04-9699-d4c5-6f45-e29a792343d3.png)
- 2 Line: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/da5a6fca-eb43-a7cd-b2b7-c8014fc72b0f.png)
- Condensed: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/29ae45ec-9c16-39ac-1c26-b199766932e4.png)
- JSON: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fb2a069b-f007-ebda-05a0-e2f1535eb614.png)
- List: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e817b0ff-bc57-51aa-166d-7f8e80561f6e.png)

# 4. グラフ表示のカスタマイズ

グラフは、Severityごとの数で表示されています。

- `Count all grouped by Severity`のあたりをクリックすると、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/056a0722-319d-7444-1dc6-ea714c47897c.png)
- 以下のように表示される形式が指定できることがわかる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/24358011-c7f8-93eb-2101-faa3dbe26fae.png)
- 例えば以下のように、`initiator.authName`ごとの集計に変更すると ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/cba6af0b-44bf-bbb6-6c20-861696524065.png)
- 直近で誰がどれぐらいアクセスしているのかな？ということも簡単にグラフ化できます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c76f2bfc-d047-c596-6f34-ba94110f42db.png)


また、異なる期間のデータを比較することも可能であり、Severityごとの集計にするにしても、`Compare to`の設定で1日前を指定すれば、以下のように上に今日の、下に比較先（一日前）のグラフを表示させるようなことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5d0fb161-1f7d-b57a-2e03-ad924cc1ed26.png)



# 5. カラムの追加

このログ一覧をよく見てみると、Timestamp, Content, Textという3つのカラムしかありません。ログによっては、もっと特徴的な情報を表示させた方が良い場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/76f3c329-f4e2-4ae4-468d-cf6490eabdaf.png)

ログを見てみるとわかりますが、このContentも単に`message`欄を引き抜いてきているだけだということがわかります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6aa032a9-ab13-fea7-fab2-f9abab413329.png)

よって、必要に応じてカラムを追加すると分かりやすくなるでしょう。例えば、今回は監査目的でログを探索しており、「誰が作業を実施したのか」というログを確認したいので、ログの中でも誰が操作をしたかを記録していると思われる`Initiator.authName`をカラムに追加したいと思います。ログ内の`Initiator.authName`の箇所を以下のようにクリックするとメニューが表示されるので、そこで`Add As Column`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3fc6f49e-c053-6a2d-3f8a-bd1ee970b96a.png)
そうすると、誰が実施した作業なのかが容易に判別可能になりました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/feed4a2e-a2a1-2778-d2eb-d6f19808b0ec.png)

# 6. ログを探す1（UI＋単純検索）

いよいよ、該当のログを探したいと思います。今回は、ICOSの操作ログを追いかけたいと思います。

:::note 
今回は、以下のようにICOSへのデータアクセスをイベントとしてトラッキングする構成にしているため、ICOSへのデータアップロードなどはイベントに記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3eca1e8b-4595-1222-6849-12abdcecf38d.png)
:::

先ほど、直近でアップロードしたファイル名は`test3.txt`だったので、まずはあまり深く考えずに`test3.txt`でフィルターしてみたいと思います。すると以下のように出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/acc75463-1809-188c-4f38-53d49b35c564.png)

そのログを見てみたところ、「あぁ、そういえばこんなbucket名だったな」と思い出したので、改めてこのbucket名（`syasudabucket01`)をクリックして、`Query That Value Alone`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/51285533-b5ae-7b7c-a499-6bd96dd63381.png)

すると、自動的に`message`キーに`syasudabucket01`という名前が含まれているログを探すQueryを生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/bd58e0d0-7df9-5f0f-1023-18a7dcf68f90.png)

また、ログを見てみると`target.name`キーが操作対象のファイルを出力してくれているということがわかったので、改めてそれを別カラムとして作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3323e1ec-10d0-9472-30ba-f4ab8c916346.png)


すると、気になるログが抽出できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3459db45-5db3-c2b9-d88e-c70350c4812b.png)

また、実際は`message`キーにbucket名が含まれているかどうかでログを抽出するのは不適切であるため、以下のように`logSourceCRN`の値で検索した方が良いということにも気が付くと思います。

- LogSourceCRNの値をベースにQueryをフィルターをかけてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/81b497b3-2ef9-dffa-82e4-793f5ff6a64f.png)
- フィルター欄にLogSourceCRNベースの値が含まれていることが分かる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5f13b7b3-0f2f-cdcd-40d8-8b9166e9a5d3.png)

最初から適切な探し方を見つけるのは難しいため、このように試行錯誤の末たどり着くことも多いでしょう。ちなみに、上記では、`Query That Value Alone`を選択したので、上記のような結果になりましたが、`Include In Query`を選択すると、既存のフィルター条件に加えて`AND`で選択したフィルターを追加することができます。

# 7. ログを探す2（もう少し細かな検索方法）

ログの検索には、[Apache Lucene（ルシーン）](https://lucene.apache.org/core/2_9_4/queryparsersyntax.html)や、[Coralogix DataPrime](https://coralogix.com/docs/dataprime/dataprime-query-language/#additional-resources)のSyntaxが使えますが、Luceneの方が簡単なのでまずはこちらを使いこなせるようになると良いでしょう。
[ここ](https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-query-data-lucene)が参考になりますが、いくつか記法を抜粋しておきます。


| Lucene記法 | 意味 |
|:--|:--|
| `ubernete`  |  ubernete というキーワードを含む完全一致。<br> `containers-kubernetes-key`を含むログはマッチング対象とならない。 |
| `Kubernetes` |  Kubernetes というキーワードを含む完全一致。<br>`containers-kubernetes-key`を含むログは`-`が区切り文字という扱いになっており、また大文字・小文字を無視するためマッチング対象。 |
| `ubernete*` <br> `*`ubernete |  ワイルドカード検索。<br>`containers-kubernetes-key`というキーワードを含むログはどちらもマッチング対象。ただし、Luceneのバージョンによっては冒頭の`*`は使えないようなので、冒頭に`*`を利用する探索は避けた方が良いかもしれない。|
| `"create object"` | "create object"という文字列を含む|
| `test4`  |  test4 というキーワードを含む。<br>`test4.txt`を含むログも、`.`が区切り文字となっているためマッチング対象 |
| `test4 syasudabucket01`  |  test4というキーワードとsyasudabucket01というキーワードを両方含む（自動的にAND条件になる） |
| `test4 AND syasudabucket01`  |  test4というキーワードとsyasudabucket01というキーワードを両方含む |
| `test4 OR syasudabucket01`  |  test4というキーワードとsyasudabucket01というキーワードをどちらか含む |
| `message:create` | messageフィールドにcreateというキーワードを含む。<br> `message:Virtual Server for VPC: create console-access-token`などがマッチング対象|
|`reason.reasonCode:[400 TO 500}` | reason.reasonCodeフィールドに400以上500未満(499以下)のキーワードを含む|
|`initiator.host.address:/111.[0-9]{1,3}.9.[0-9]{1,3}/`|`initiator.host.address`フィールドに111.xx.9.xxというIPアドレスを含む。`//`に挟むことで正規表現が使える。|


また、必要に応じて、このフィルターのQueryに対して保存しておきましょう。後から誰かと共有する時に便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/58b84607-737c-3d23-1fdf-959b660cac3d.png)

:::note warn
本投稿時点では、Priority Insightsだと12K、ICOSだと50Kまでしか結果が返らないという制約があります。適宜フィルターを使ってログを絞り込みましょう。
https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-query_limitations&locale=en
:::

# 8. 気になるログはハイライトしておいたり、ログに対するリンクを残しておく。

ログはハイライトしておくことで、色を変更できます。
- ハイライト処理![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f29287a7-ad6c-ec03-0b11-06ba11499cbd.png)
- ログの色が変わる![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0d382ef8-1aea-2974-75d4-2f1635136103.png)

また、リンクを作成しておき、後ほどこのログを後から参照できるようにすることも可能です。
- ログへのリンク作成 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ea437a72-8119-9318-4090-ba7c5c40e95f.png)




# 9. ログをローカルにexportする

ログは、json方式もしくはCSV方式で保管可能です。

- `Settings` -> `Export`を選択。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/34a08b7c-a77a-3839-d730-61c76568a219.png)
- JSON方式だと、フィルター結果に対して、現在のviewに沿ったexportか、全データのexportかを選択可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3f2b782b-a16f-8068-ec99-30a165539e76.png)
- デフォルトだと最初の1ページしかexportされないので、`Export xxx First pages`を変更する。最大で20ページ分までexport可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/df4be10d-347b-4071-5bba-a62a48d1c88d.png)
- CSV方式の場合は、現在のviewに沿ったexportであるかどうかは選択できず、そのままフィルター結果に対して、データをexportする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/8be7cc4d-bb92-6553-c971-f05d0139735b.png)


:::note warn
最大で20ページしかexportできません。1ページあたりのログが100なので、20ページということはおよそ2000までのログしかexportできません。
https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-export-data&locale=en
:::


# 10. Viewとして保存する

このカラム条件やフィルター条件などは、そのままでは次回ログイン時には消えてしまいます。よってこのViewを保存しておきます。

- `Unsaved view ...`の箇所をクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e27e1845-388b-5406-021a-cb8bc66abf9a.png)
- 適当な名前を指定してViewを作成。なお、Privacy settingsを`Priate`にしておくと、自分にしか見えないViewとなります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ed7fa7ce-607c-c9df-e36f-abdcb07562ab.png)


これで終わりでも良いのですが、大人数でCloud Logsを共用利用する場合は、フォルダーを作って分類した方が良いでしょう。

- `All Views`を選択。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/2d03aa59-262a-4b68-4f07-e67a893a4b92.png)
- フォルダーボタンを押下。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/80ac0bb1-9a74-41e5-a213-0f2f7129e693.png)
- フォルダーを作成。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e6e993fb-661a-26c4-5d64-95236cff8766.png)
- フォルダが作成された。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6fde2faa-cf20-600d-8311-498ab21858a0.png)
- フォルダが作成されたので、先ほどのViewを作成したフォルダーにドラッグアンドドロップすると、移動できる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/50a50ba1-3758-96bf-cea6-5cab20a50f57.png)

なお、このViewを再度カスタマイズしてそれを再度同じ名前で保存したい場合は、Saveボタン（フロッピーディスクのようなボタン）を押下するとQuick Saveができます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/64c92389-63a2-fddc-3a1c-90c6f84627e4.png)


逆に、Viewを別名で保存したい場合は、以下のように実施します。

- メニュー内で最初に`Duplicate`を選択する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/89f7c110-9177-c7fd-8e97-91867f30f8ce.png) 
- その上で名称などを再度編集する
    - Before: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/52766b7c-279e-de4a-6e0c-26c45f652eda.png)
    - After: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/057b4cb6-8385-0457-7f36-4ed8e324019e.png)

- 必要に応じてViewを適切なフォルダに移動しましょう。
    - 移動前!![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/76b6e251-a551-9115-cbfb-83917334db49.png)
    - 移動後!![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e5d1c273-a0ac-d929-365d-554b12e72e91.png)


ちなみに、私はログを見る時に、誰が何を操作したのかを理解したいので、`initiator.authName`と`target.name`をカラムに追加したビューをデフォルトのビューにしています。