独自フォーマットのログをAzure Log Analyticsに収集する

[Azureもくもく会@新宿 No.17](https://azure-mokumoku.connpass.com/event/79624/) で成果発表させてもらった内容です。

Windowsイベントログ、LinuxのsyslogといったOS関連ログ以外にも、独自フォーマットのログを収集したいケースがあります。
アプリケーションやミドルウェアが出力するログとかですね。

このような独自フォーマットのログを収集してみました。

# 構成図
* オンプレの監視Manager(Windows Server 2012 R2)からLog Analyticsへ独自フォーマットログを収集する想定です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ff91b821-b796-2b0f-3365-421109857462.png)
<br>

# 事前準備
## サンプルログ作成
* 今回以下のようなサンプルのログを用意しました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1edcf10b-238b-e4ca-8fda-b97f6e4b47d1.png)

* サンプルログ解説
  * 各種サーバのCPU使用率を記録するログ
  * csv形式
  * 1行目には必ずヘッダー行が書き込まれる
  * 最終行は改行されていない
  * ファイル名は「sample_YYYYMMDD-HH.log」という名前で、1時間置きに出力される

## Log Analyltics作成
* まずはログ収集先となるLog Analyticsを作成します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0ce42a0f-27ff-2fdf-6040-8aa0b1d5f13b.png)
<br>

* 作成されました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/13168c1b-0e21-c8b4-9c8d-3fa5126af313.png)
<br>

## Monitoring Service Agentセットアップ
収集元がAzureではなくオンプレなので本手順が必要です。
収集元がAzureVMの場合は、仮想マシンを接続するだけでよいです。（ポータルのLog Analytics画面から[仮想マシン]を選択し接続する）

* Log Analytics画面より、[詳細設定]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4cd45e26-87e6-db3a-b118-de8aaf2c0074.png)
<br>

* [Windowsエージェントのダウンロード(64ビット)]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8b78ddce-d0fc-7428-51fd-5bacca61d5da.png)
<br>

* MMASetup-AMD64.exeがダウンロードされたことを確認します
* [ワークスペースID]、[主キー]をメモしておきます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f989f2f0-94da-1bd0-ae04-80e02b9a6201.png)

<br>

* ダウンロードしたMMASetup-AMD64.exeを監視Managerに配置し、実行します
* [次へ]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/62dc5b6f-dd4c-d36a-4770-c8a75a6fafca.png)
<br>

* [同意します]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/64b98729-db65-5ce9-9ceb-7691e7e367d9.png)
<br>

* インストール先を必要に応じて変更し、[次へ]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fea68860-5183-0beb-91bd-3db4b1668944.png)
<br>

* 今回はLog Analyticsにデータを送るので、[Azureログ分析(OMS)にエージェントを接続する]にチェックを付けて、[次へ]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4e65de79-69bf-8751-636d-de124a05b1b9.png)
<br>

* 先程メモしたワークスペースIDと主キーを入力して、[次へ]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b492b3fe-e52e-3235-82eb-09664c5b07e0.png)
<br>

* 必要に応じてUpdateのチェックを付けて、[次へ]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/cb3a786d-bc80-0552-a560-3065255c23ed.png)
<br>

* 内容を確認して問題なければ、[インストール]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a35e58c3-6d10-e2d7-0e8f-c51603e70b09.png)
<br>

* Azure Log Analytics画面に戻り、[詳細設定]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4cd45e26-87e6-db3a-b118-de8aaf2c0074.png)
<br>

* コンピュータの接続数が増えていればOKです(10～15分くらい掛かりました)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/50ad17fb-1b2c-bcba-49ad-0c1a664272eb.png)
<br>


# カスタムログ設定

## Public Preview機能の有効化
* カスタムログは2018年3月時点でPublic Previewです。利用するためには機能を有効化する必要があります。
* Log Analytics画面より、[OMSポータル]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d3e48c1c-de59-0ef3-7fd3-177d6b66d057.png)
<br>

* OMSポータル画面が開きます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0bb1b49b-9280-2f54-e8ee-7b6181c17121.png)
<br>

* 右上にある歯車アイコンを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b654ea2a-af13-e13f-5b1b-fd145a3430ad.png)
<br>

* [Preview Features]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/aeab5ff4-f90c-8587-f030-cfe8cecb7401.png)
<br>

* [有効]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f976aeaa-be9e-014a-259e-bbb10c59f9e7.png)
<br>

* [有効]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2a03083c-ced6-0804-d706-7448e0e6cbaa.png)
<br>

## カスタムログ収集設定
* Log Analyticsにカスタムログ収集設定をします
* Azureポータルに戻り、Log Analytics画面より[詳細設定]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f931f2ad-bc92-3089-5030-434efd58d817.png)
<br>

* [Data] → [カスタムログ] → [追加+] の順に選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2e29ffed-1349-20f6-215e-503076fc6828.png)
<br>

* [ファイルを選択]をクリックして、事前に準備していたサンプルログを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0ae88f7b-25c6-33c1-52f2-0a84274ad696.png)
<br>

* 区切り文字を設定します。今回は1行1レコードなので[改行]のまま[次へ]を選択します
* 1レコードが2行以上のログの場合は、タイムスタンプを区切り文字にすることができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7aea5aa0-e2bc-2ae2-6340-13cd41d36430.png)
<br>

* 対象ログのフルパスを入力します。今回は「sample_YYYYMMDD-HH.log」がログ名ルールなので、[C:\log\sample*.log]と入力し[+]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3235ec3e-1c44-2bb7-7d6c-3a734d025986.png)
<br>

* ログが追加されたことを確認し、[次へ]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/23620503-611e-b047-ad1c-97f134267a75.png)
<br>

* ログ名称を入力し、[完了]を選択します。ここで設定した名前がLog Analyticsに収集されたときのログ名になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/28098cf7-ca12-3361-3de5-dbe856e443de.png)
<br>

* ログが追加されればOKです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/40d7a963-0a1c-94ad-a1e7-a7afe0128c28.png)
<br>

## ログ転送確認
* 設定したフォルダにログを配置してみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/68301873-c0df-c9fe-0a6d-ee37d832e2e9.png)
<br>

* Log Analytics画面より、[ログ検索]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ac2a0a55-d38d-54eb-f593-754527432b95.png)
<br>

* クエリ文を入力して、[実行]を選択する
```
search * | where ( Type == "[YOUR LOG NAME]_CL" )
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9bca45aa-712c-e94e-8719-3d0098d8beaa.png)
<br>

* 結果が表示されればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/baf327bf-648a-a354-f01e-f50246069acb.png)
<br>

  * 初回は少し時間が掛かります（15分くらい掛かりました）
  * いつまで待っても表示されない場合は、ポータルで別のサービスを選択し、再度Log Analyticsを開いてクエリ実行してみてください

<br>

* 表示結果を見てみると3点程気になる点がありました
  1. RawDataフィールドに1行全て取り込まれています。本来ならIPアドレスとかホスト名とかそれぞれ別フィールドとしたいですよね  
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0cf315a2-2c07-531c-4397-1bced68d7dc5.png)  
  これは後述するカスタムフィールドを設定することで対応可能です
  1. ログのヘッダー行も1レコードとして取り込まれています。これはソース側でヘッダーを消す処理をする必要がありそうです  
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b716f1f1-f00a-31f5-cafe-e0122856ead2.png)
  1. Log Analyticsの1レコードに、カスタムログの2レコード分が取り込まれているデータがありました  
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3b72ccfb-ec17-a2c3-6980-2fdab579190a.png)  
  これはサンプルログの最終行に改行コードが入っていないことが原因です  
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8bf7e0b5-6034-4d35-88ea-96ee082d18e0.png)  
  カスタムログの設定時に区切り文字を改行とした為ですね。このようなログの場合は、やはりソース側で改行を入れてあげる必要がありそうです


# カスタムフィールド設定
* Log Analytics検索結果に戻り、RawDataの左側の[・・・]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/22dd1bde-0cc9-a610-c971-944c41035dd9.png)
<br>

* [[YOUR LOG NAME]からフィールドを抽出する]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/aa3e63a7-e5ae-6207-c6cf-4424727605e9.png)
<br>

* カスタムフィールドページが開きます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/42239729-1bcd-d1b8-f953-f10cf8fa13b5.png)
<br>

* フィールドにしたいデータを選択すると、タイトル入力ボックスが表示されます。この例だと[192.168.0.1]を選択しています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f06e7fbb-59e8-23f1-d221-0a29fd1ad54c.png)
<br>

* フィールドタイトルとデータ種別を入力し、[抽出]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a928e2f1-3579-e682-4497-0bbf2d33b9d6.png)
<br>

* カスタムフィールド対象が表示されるので、確認して[抽出の保存]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/bdad10f1-1b85-5e2f-a4c5-38f9c335c3a1.png)
<br>

* これをフィールド数分繰り返します

# ログ収集
* 今度は以下のログを配置してみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/49f9720c-b545-2c97-2c2c-8debc88dfdbe.png)
<br>

* 先程作成したIP_CFカスタムフィールドが新たに追加されて収集されています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c0a8e3d6-dd22-900f-8a5e-8092910f5fa8.png)
<br>

# まとめ
独自フォーマットのログもLog Analyticsに収集することができました。
ただ、Log Analyticsに集めるだけではダメで、これをいかに上手く分析するかが重要です。
このあたりは追々書きたいと思います。

# 2018/04/10 追記 カスタムフィールドの注意点
色々試してみてますが、単純にCSVで区切ってほしい場合に使いづらい点がありました。
以下のようなログのケースです。
```
"192.168.0.1","host01","UNIX","HDD","/",268435456,"2018/04/10","01:52:32",67264512
"192.168.0.2","host02","Windows","CPU","CPU","2993","2018/04/10","18:45:20",39.2
```
このログはそれぞれディスク使用量とCPU使用量を表しています。
最後のカラムは同じフィールドにしたいところですが、桁が離れすぎているのでカスタムフィールドを設定すると違うフィールドだと認識されてしまいます。
カスタムフィールド設定時に、これも対象だと個別に認識させることは可能ですが、予期せぬメッセージが他にある可能性もあるため確実とはいえません。

このように単純にCSVで区切りたい場合には、カスタムフィールドだと予期せぬ結果になる可能性があるため注意が必要です。

ちなみにこれはAzure Feedbackにも挙がっていました。今後対応してもらえると嬉しいです！
[Azure Feedback Custom fileds with delimiters](https://feedback.azure.com/forums/267889-log-analytics/suggestions/19604164-custom-fileds-with-delimiters)

最終的にAzure Data Lakeを活用して可視化しました。
[Azure Data LakeとPower BIでログデータを可視化する](https://qiita.com/shingo_kawahara/items/adbfe943700e2d894c98)