- ClickHouse がすでに起動して稼働していること
- Vector がインストールされていること
1
データベースとテーブルを作成する
ログイベントを保存するためのテーブルを定義します。- まず、
nginxdbという名前の新しいデータベースを作成します。
- ログイベント全体を1つの文字列として挿入します。これは明らかにログデータの分析には適したフォーマットではありませんが、この点については以下で materialized view を使って対応します。
現時点では主キーは不要なため、ORDER BY は tuple() (空のタプル) に設定されています。
2
Nginx を設定する
このステップでは、Nginx のログ出力を設定する方法を説明します。- 次の
access_logプロパティは、ログを combined フォーマットで/var/log/nginx/my_access.logに出力します。 この値は、nginx.confファイルのhttpセクションに記述します。
-
nginx.confを変更した場合は、必ず Nginx を再起動してください。 - Web サーバー上のページにアクセスして、アクセスログにログイベントをいくつか生成します。 combined フォーマットのログは、次のようになります。
3
Vector を設定する
Vector は、ログ、メトリクス、トレース (ソース と呼ばれます) を収集・変換・ルーティングし、ClickHouse を含むさまざまなベンダー (シンク と呼ばれます) に送信します。 ソースとシンクは、vector.toml という設定ファイルで定義します。- 次の vector.toml ファイルでは、my_access.log の末尾を追跡する file 型の ソース を定義し、さらに上で定義した access_logs テーブルを シンク として定義しています。
- 上記の設定を使用して Vector を起動します。ソースとシンクの定義について詳しくは、Vector のドキュメントを参照してください。
- 次のクエリを実行して、アクセスログが ClickHouse に挿入されていることを確認します。テーブルにアクセスログが表示されるはずです。
4
ログの解析
ClickHouse にログを保存できるのは便利ですが、各イベントを単一の文字列として格納するだけでは、データ分析に活用できる情報が限られてしまいます。 次に、materialized view を使用してログイベントをパースする方法を説明します。materialized view は、SQLのinsert triggerと同様の機能を持ちます。ソーステーブルにデータの行が挿入されると、materialized viewはそれらの行に変換処理を適用し、結果をターゲットテーブルに挿入します。 materialized viewは、access_logs 内のログイベントのパース済み表現を生成するように設定できます。 そのようなログイベントの例を以下に示します。splitByWhitespace 関数は、文字列を空白で分割し、各トークンを Array として返します。
動作を確認するには、次のコマンドを実行してください。Query
Response
splitByWhitespace と同様に、splitByRegexp 関数は正規表現に基づいて文字列をArrayに分割します。
以下のコマンドを実行すると、2つのStringが返されます。CREATE MATERIALIZED VIEW コマンドを確認する前に、データのクリーンアップに使用するいくつかの関数を見ておきましょう。
例えば、RequestMethod の値は "GET となっており、不要なダブルクォートが含まれています。
trimBoth (alias trim) 関数を使用すると、このダブルクォートを除去できます。[ があり、ClickHouse が日付としてパースできるフォーマットでもありません。
ただし、区切り文字をコロン (:) からカンマ (,) に変更すると、パースが正常に動作します:POPULATE が含まれており、access_logs 内の既存の行が即座に処理・挿入されます。
次のSQLステートメントを実行してください:上のレッスンではデータを2つのテーブルに保存しましたが、最初の
nginxdb.access_logsテーブルをNullテーブルエンジンに変更することもできます。
解析済みのデータは引き続きnginxdb.access_logs_viewテーブルに格納されますが、生データはテーブルには保存されません。シンプルなインストールと簡単な設定だけで導入できる Vector を使えば、Nginx サーバーのログを ClickHouse のテーブルに送信できます。materialized view を使うことで、それらのログをカラムにパースし、より簡単に分析できるようになります。