Azure LogAnalyticsのカスタムログで収集した「RawData」を扱いやすくする(クエリ実行時のデータ解析)

Azure LogAnalyticsワークスペースに様々なログを取り込んでみます。他にも色々とやってますので下記エントリも確認お願いします!

今回は、以前、「カスタムログ」の機能を使って取り込んだApacheのログを解析しやすい形にしたいと思います。カスタムログで取り込む部分に関しては下記のエントリを参照して下さい。

さて、取り込んだログを見てみると「RawData」という列にカスタムログの1行がすべて入っている状況です。これをより扱いやすい状態にしたいと思います。

やり方は大きく2種類あって「収集時にデータを解析して新しいプロパティを「カスタムフィールド」を使って定義する」か、「クエリを実行するときにそのクエリ内でデータを複数のフィールドに分けてあげる」かです。今回は後者の方法を試してみます。

LogAnalyticsワークスペースのログの検索、解析にはKustoという言語が使えます。

今回は正規表現でRawDataの中身から値を抽出することにします。すべてのレコードはスペースで区切られており、時間の部分は[]で囲まれていて、リクエストとリファラーとエージェントがダブルクオーテーション(“”)で囲まれている状況です。これを正規表現で表現します。

@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.*)"""

あとは、extendで列を追加し、RawDataの中身をもとに順番に抽出してあげればよいですね。下記のようなクエリにしてみました。

httpd_access_log_CL
| extend
host=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 1, RawData), ident=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 2, RawData),
user=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 3, RawData), timeInLog=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 4, RawData),
request=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 5, RawData), status=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 6, RawData),
bytes=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 7, RawData), referer=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.)""", 8, RawData),
agent=extract(@"^(.) (.) (.) [(.)] ""(.)"" (.) (.) ""(.)"" ""(.*)""", 9, RawData)

実行すると、きちんと狙ったところが狙ったプロパティとして抽出されていることがわかります。

もっと良いやり方もあると思います。おすすめのやり方がある方は是非コメントでお知らせ下さい!

今回は以上です!

Azure LogAnalyticsワークスペースに様々なログを取り込んでみます。他にも色々とやってますので下記エントリも確認お願いします!

コメントを残す