はじめに
Linux環境で出力するログファイルの分析を行うにあたってシンプルな方法は、コマンドを使用する方法です。
しかし、大量のログファイルを効率的に分析する場合は、シェルスクリプトやPythonなどプログラミングの手段が必要になってきます。
LinuxではMultiTailやGoAccessなどコマンドラインで使用できる便利なツールが存在します。MultiTailについては、以前書いたMultiTailで効率的にログを見るをご参照ください。
本記事では効率的にログファイルの分析を可能とするlnavについて記載しています。
lnav
lnavは、ターミナル用のログファイルビューアです。
ログファイルを簡単にマージ、追跡、検索、フィルターできます。また、SQLクエリを使用した分析も可能です。セットアップも不要なため、パッケージをインストールするだけですぐに使用できます。
lnavのインストール
Linux環境(Debian/Ubuntu Linux)の場合は、以下のコマンドでインストールできます。
$ sudo snap install lnav
その他のOSについてはDownloadsをご確認ください。また、GitHubでも公開されているため、パッケージが取得できない環境でもダウンロードして使用できます。
使用方法
lnav
の引数にログファイルを渡すだけで、簡単に実行できます。
lnav <ログファイル名>
ログファイルは複数まとめて処理することができるため、globパターンであるワイルドカードを使用することができます。また、.gz
など圧縮したファイルも対応しているたため、圧縮ファイルの展開も不要です。
なお、大量のファイルを高速に開くにあたって、次の条件を満たすファイルは自動的に非表示になり、インデックスが作成されません。
- バイナリファイル
- 128KBを超えるプレーンテキストファイル
- 重複したログファイル
例として、syslogを分析する場合は以下の様なコマンドを実行します。
lnav /var/log/syslog
vi
の様なキーバインド感覚で実行できるため、ログファイルの先頭に移動したい場合はg
を押します。末尾に行きたい場合はshift + g
を押します。また、/
で検索やe
を押すことでエラーメッセージ(Error/error)に移動できます。
lnavはテキストファイルだけでなく、journalctlやdockerが出力するログなども処理することができます。
$ journalctl | lnav
$ docker logs -f <container-id> | lnav
SQLite
lnavは、SQLiteインターフェースを用いてSQLクエリも使用できます。
以下は、Webサーバで出力された複数のアクセスログを基にSQLクエリを使用して、特定のユーザーエージェントを抽出する例です。
アクセスログのファイル名は、access.log.1
の様なファイル名になっていますが、アクセスログの中のタイムスタンプを基にソートされるため、ログファイル名は気にすることなく処理できます。
$ lnav access.log*
;
を入力後、SQLが入力できます。カラムは構造化されたログのフィールドから抽出され、テーブル名はログファイル名となります。
特定のユーザーエージェントを抽出するために、where
句を使用しています。
select log_line, log_time, c_ip, cs_method, cs_uri_stem, cs_user_agent from access_log where cs_user_agent like '%GPT%'
ユーザーエージェントがGPTBotであるAIクローラーからのアクセスログを抽出しました。
AIクローラーのアクセスをブロックしているため、robots.txtファイル
のみのアクセスが確認できます。AIクローラーのアクセスをブロックする方法については以前書いたrobots.txtファイルを使用してAIクローラーをブロックする方法をご参考にください。
おわりに
lnavはトラブルシューティングやアクセスログ解析などさまざまな目的で使用することができます。
セキュリティの観点ではSIEMにも勝るとも劣らない機能によりインシデント対応の調査にも活用できると思います。