Webサーバのログ解析ツールであるGoAccessを、GoAccessが提供しているリポジトリを使ってUbuntu24.04へインストールする方法です。
GoAccessってどんなツール?
GoAccessは、NginxやApacheといったWebサーバーのアクセスログを、コマンドラインやブラウザで解析・可視化できるツールです。
使い方は非常にシンプルで、ログファイルのパスを指定するだけで、以下のようなデータを直感的に表示してくれます。
- 日別、時間別のアクセス数
- リクエストされたURLのトップ10
- 訪問者のOSやブラウザ
- HTTPステータスコードの分布
- 参照元(リファラー)
これらをグラフや表で確認できるため、Webサイトの状況をひと目で把握することが可能です。
GoAccessの魅力とメリット
- 圧倒的な手軽さ
-
GoAccessの最大の魅力はその手軽さにあり、複雑な設定やデータベースは不要で、コマンドひとつで手軽に解析を始められます。
- リアルタイムでの解析
-
ログファイルに新しいアクセスが記録されると、GoAccessの解析レポートもリアルタイムで更新することもできるので、異常なアクセスがあった場合にもすぐに気づけます。
- 豊富な出力形式
-
HTML、JSON、CSV、そしてターミナル上での表示に対応しています。
特にHTML形式はグラフが豊富で見やすく、これをWebサーバーの公開用ディレクトリに置いておくと、いつでもブラウザでログ解析レポートを確認することもできます。
GoAccessのデメリットと注意点
GoAccessは非常に便利で手軽なツールですが、万能ではありません。
以下の注意点も理解しておくことが重要です。
- 大規模なログ解析には不向き
-
ログファイルを直接読み込んで解析するため、非常に大規模なログ(テラバイト単位など)を扱うと、メモリやCPUリソースを大量に消費してしまい、処理に時間がかかったり、システムが不安定になる可能性があります。
- ログフォーマットのカスタマイズが必要な場合がある
-
一般的なログフォーマット(Combined、Commonなど)にはデフォルトで対応していますが、独自のログフォーマットを使っている場合は、設定ファイル(.goaccessrc)でログフォーマットを明示的に定義する必要があります。
- 長期的な分析は工夫が必要
-
基本的な使い方は、指定されたログファイルを解析してレポートを生成するだけです。
過去のデータを永続的に保存して長期的なトレンド分析をしたい場合は、別途スクリプトを作成するなどして、自分で仕組みを構築する必要があります。
インストール手順
インストールするためのコマンド内でsudoを使用するため、最初にsudoで適当なコマンドを実行してパスワードの認証を先に行っておきます。
$ sudo ls
GoAccessの公開鍵とリポジトリ情報をシステムに追加します。
このコマンドは、GoAccessのリポジトリが信頼できるものであることをシステムに認識させるための鍵を追加しています。
$ wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
aptがGoAccessのパッケージを見つけられるように、リポジトリ情報を追加します。
$ echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
リポジトリ情報を追加したら、aptのパッケージリストを更新し、GoAccessをインストールします。
$ sudo apt update $ sudo apt install goaccess
GoAccessの使い方
基本的な使い方(ターミナルで解析)は、以下のコマンドを実行するだけです。(ログファイルを複数指定することもできます)
$ sudo goaccess ログファイル $ sudo goaccess ログファイル1 ログファイル2 ...
コマンドを実行すると、解析するログの形式を指定する画面が表示されます。
矢印キーでログのフォーマット選択し、スペースキーで確定、Enterキーで決定します。
ちなみに、Nginxのログ形式は、個別で設定していない場合「/etc/nginx/nginx.conf」の「log_format」部分で設定されています。
下記は、UbuntuにNginxが提供している公式リポジトリを追加して、インストールしたNginxの初期設定です。
この場合は、ログフォーマットの名前は「main」となっていますが、形式としては「Common Log Format」を選択してください。
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main;
以下のように、ログフォーマットの指定を行っていない場合は、Nginxはcombined形式のフォーマット使用しますので、その場合は「NCSA Combined Log Format」を選択してください。
access_log /var/log/nginx/access.log
ログの解析が終わると、ターミナル上に以下のような解析結果の画面が表示されます。
「Tab」キーを押下することで次の項目を表示することができ、「Enter」キーで詳細情報があれば表示することができます。
GoAccessの画面を閉じたい場合は「q」キーを押下してください。
Webブラウザで解析結果を確認する(HTMLレポート)
GoAccessは、「-o 出力ファイル名.html」または「--output=出力ファイル名.html」オプションを使用することで、HTML形式でもログの解析レポートを出力することができます。
$ sudo goaccess ログファイル -o 出力ファイル名.html --log-format=ログフォーマット
実際にログの解析結果をHTML形式で出力してみます。
$ sudo goaccess /var/log/nginx/html_converter.access.log -o report.html --log-format=common [PARSING /var/log/nginx/html_converter.access.log] {1} @ {0/s} Cleaning up resources...
作成されたhtmlファイル(report.html)をWebブラウザで開くと、以下のような解析結果が表示されます。
リアルタイムでログを解析する
GoAccessは、リアルタイムでログの解析を行うことも出来ます。
ターミナルでリアルタイムログ解析
「tail -f」コマンドと組み合わせることで、新しいログが追記されるたびに解析レポートをリアルタイムで更新させることが出来ます。
$ sudo tailf -f ログファイル | goaccess --log-format=ログ形式
実際にリアルタイムでログの解析を行ってみます。
$ sudo tail -f /var/log/nginx/html_converter.access.log | goaccess --log-format=common
分かりづらいですが、ヒット数の数がリアルタイムで増加しています。
HTML形式でリアルタイムにログ解析を行う方法
「--real-time-html」オプションを使用すると、HTML形式のレポートもリアルタイムでログの解析結果を表示してくれるようになります。
$ sudo goaccess ログファイル -o 出力ファイル名.html --log-format=ログフォーマット --real-time-html
実際にログのリアルタイム解析を行ってみます。
$ sudo goaccess /var/log/nginx/html_converter.access.log -o report.html --log-format=common --real-time-html [PARSING /var/log/nginx/html_converter.access.log] {5} @ {0/s} クライアントからのWebSocket接続を待っています
作成されたhtmlファイルをブラウザで開いていみると、リアルタイムで情報が更新されることが確認できます。
解析を終了したい場合は、ターミナル上で「Ctrl」+「c」を押下してください。
gzip形式で圧縮されているログを解析する
Webサーバーのログは、ディスク容量を節約するためにgzip形式で圧縮されていることが多いです。
そんなログも、zcatコマンドと組み合わせれば問題なく解析できます。
$ sudo zcat ログファイル.gz | goaccess --log-format=ログ形式
実際に圧縮されたログファイルを解析してみます。
$ date 2025年 9月 2日 火曜日 16:45:24 JST $ sudo zcat /var/log/nginx/html_converter.access.log.20.gz | goaccess --log-format=common
圧縮されていたログも問題なく解析できました。
日時を指定してログ解析
zgrepと組み合わせることで、複数の圧縮済みのログファイルから日時を指定して、ログを解析することも出来ます。
下記は複数の圧縮されたものを含むログファイルから、zgrepで8月分のログを検索してGoAccessに渡して解析を行っています。
$ sudo zgrep -h "\[*/Aug" /var/log/nginx/html_converter.access.log* | goaccess --log-format=COMMON
このように、8月分のログ解析レポート画面を表示することができました。
コメント