Webサーバのログ解析ツールであるGoAccessを、GoAccessが提供しているリポジトリを使ってUbuntu24.04へインストールし、Nginxのアクセスログを解析する方法について解説します。
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のログフォーマットに独自のものを使用していないのであれば、「NCSA Combined Log Format」を選択してください。
下記のように、事前にログフォーマットの指定を行うこともでき、この場合ログのフォーマット選択画面は表示されず、直接解析結果の画面が表示されます。
$ sudo goaccess /var/log/nginx/access.log --log-fromat=COMBINEDログの解析が終わると、ターミナル上に以下のような解析結果の画面が表示されます。

「Tab」キーを押下することで次の項目を表示することができ、「Enter」キーで詳細情報があれば表示することができます。

GoAccessの画面を閉じたい場合は「q」キーを押下してください。
Nginxでログの形式でmainフォーマットを使用している場合
多くのNginxの標準的なインストール(Ubuntuのaptなど)では、「/etc/nginx/nginx.conf」設定されているログ部分の設定は以下のようになっていて、アクセスログにmainという独自のフォーマットが設定されています。
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;
ここで設定されている「main」というログのフォーマットは、「combined」フォーマットに「"$http_x_forwarded_for"」の情報が追加されたものになります。
この形式で記録されたログを解析する場合、「NCSA Combined Log Format」では「$http_x_forwarded_for」部分は解析されないので、この部分も解析させたい場合は手動でカスタムフォーマットを定義する必要があります。
色々と方法があるのですが、一番お手軽な方法は「"$http_x_forwarded_for"」の部分を、GoAccessで別の集計パネルに割り当てるという方法です。
下記の例では、「"$http_x_forwarded_for"」の部分を「%v」(バーチャルホスト)としてGoAccessに認識させています。
$ sudo goaccess /var/log/nginx/access.log \ --log-format='%h %^[%d:%t %^] "%r" %s %b "%R" "%u" "%v"' \ --date-format=%d/%b/%Y \ --time-format=%H:%M:%S
「"$http_x_forwarded_for"」の解析結果は、このように「Virtual Hosts」として表示されます。
$http_x_forwarded_for部分を無視する
「$http_x_forwarded_for」部分の情報が必要ないのであれば、「NCSA Combined Log Format」を選択して解析を行わないという方法もあります。
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月分のログ解析レポート画面を表示することができました。
コメント