Apacheのアクセスログを設定する方法|CustomLogとLogFormatの書き方とcombined形式の読み方

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Apache, Linuxtips, Webサーバー管理, サーバー管理 > Apacheのアクセスログを設定する方法|CustomLogとLogFormatの書き方とcombined形式の読み方
「Apacheのアクセスログを見たら、どのフォームの情報が書かれているのか分からない」
「CustomLogとLogFormatの設定が多くて、何をどう書けばいいのか整理できていない」
Webサーバーの運用では、アクセスログを正しく設定・読み解く能力が欠かせません。

この記事では、ApacheのCustomLogディレクティブとLogFormatディレクティブの設定方法、combined形式のログフォーマットの読み方を解説します。
ログローテーション連携、条件付きロギング、実サーバーのログ出力例まで、現場で必要な知識をまとめました。

【この記事でわかること】

・CustomLog でログファイルの保存先とフォーマット名を指定する
・LogFormat でフィールド構成(combined形式が業界標準)を定義する
・combined形式はIPアドレス・日時・リクエスト・ステータス・リファラー・UAの7フィールド
・本番環境ではパスを絶対パスで指定し、logrotate と組み合わせて管理する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

Apacheのアクセスログとは(何が記録されるのか)

Apacheのアクセスログは、Webサーバーに到達したすべてのHTTPリクエストを記録するファイルです。

デフォルトでは /var/log/httpd/access_log(RHEL/CentOS系)または /var/log/apache2/access.log(Debian/Ubuntu系)に保存されています。

いつ(日時):リクエストが来た時刻(タイムゾーン付き)
どこから(IPアドレス):クライアントのIPアドレス
何を(リクエスト行):HTTPメソッド・URL・プロトコルバージョン
結果(ステータスコード):200(成功)・404(未発見)・500(サーバーエラー)など
転送量(バイト数):レスポンスのバイト数
どこから来たか(リファラー):リンク元URL
何で見ているか(ユーザーエージェント):ブラウザ・クローラーの識別情報

アクセスログを分析することで、不正アクセスの検知、サービス障害の調査、アクセス数の集計などが可能になります。

LogFormatディレクティブ(ログフォーマットの定義)

LogFormat は、ログに記録する項目とその順番を定義するディレクティブです。httpd.conf またはインクルードされた設定ファイルに記述します。

1. LogFormatの基本構文

LogFormat "フォーマット文字列" フォーマット名

フォーマット名は任意の文字列で、後述の CustomLog で参照するエイリアスです。

2. combined形式(業界標準)

Apache のデフォルト設定では「combined(コンバインド)」と「common(コモン)」の2種類が定義されています。

# /etc/httpd/conf/httpd.conf(RHEL/CentOS系のデフォルト設定) LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common

combined形式は、common形式にリファラーとユーザーエージェントを加えた形式です。
Webサーバーの標準的なログ形式として広く使われており、ログ解析ツール(AWStats、GoAccess等)はcombined形式を前提としているものが多いです。

3. LogFormatで使う主なフォーマット文字列

フォーマット文字 記録される内容 出力例
%h クライアントのIPアドレス(ホスト名) 203.0.113.25
%l identd(RFC1413)によるクライアント識別子 -(通常は使用しない)
%u Basic認証のユーザー名 -(認証なし)または john
%t リクエストの受信日時(CLF形式) [07/Apr/2026:10:30:00 +0900]
%r リクエスト行(HTTPメソッド・URL・バージョン) GET /index.html HTTP/1.1
%>s 最終的なHTTPステータスコード 200
%b レスポンスのバイト数(ヘッダ除く) 4096
%{Referer}i リファラーURL(リンク元) https://www.google.com/
%{User-Agent}i ユーザーエージェント(ブラウザ情報) Mozilla/5.0 ...
%D リクエスト処理時間(マイクロ秒) 23456(23.456ミリ秒)
%T リクエスト処理時間(秒) 0
%v バーチャルホスト名(ServerName) www.example.com

CustomLogディレクティブ(ログファイルの指定)

CustomLog は、ログファイルの保存先と使用するフォーマット名を指定するディレクティブです。

1. CustomLogの基本構文

CustomLog "ログファイルのパス" フォーマット名

2. combined形式でアクセスログを設定する

# /etc/httpd/conf/httpd.conf # combined形式でアクセスログを記録する CustomLog "/var/log/httpd/access_log" combined

ログファイルのパスは絶対パスで指定してください。相対パスで指定した場合は ServerRoot からの相対パスとして解釈されます。

3. 実サーバーのアクセスログ出力例(combined形式)

実際のLinuxサーバーで出力されるcombined形式のアクセスログは以下のようになります。

[root@web01 ~]# tail -3 /var/log/httpd/access_log 203.0.113.xx - - [07/Apr/2026:10:28:43 +0900] "GET /index.html HTTP/1.1" 200 8421 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" 198.51.100.xx - - [07/Apr/2026:10:29:01 +0900] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" 10.0.1.xx - admin [07/Apr/2026:10:29:35 +0900] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 143 "https://www.example.com/wp-admin/" "Mozilla/5.0 ..."

combined形式のログの読み方(フィールド解説)

combined形式の1行を分解して説明します。

203.0.113.xx - - [07/Apr/2026:10:28:43 +0900] "GET /index.html HTTP/1.1" 200 8421 "https://www.google.com/" "Mozilla/5.0 ..." フィールド1: 203.0.113.xx → クライアントIP(%h) フィールド2: - → identd(%l)通常は "-" フィールド3: - → 認証ユーザー(%u)認証なしは "-" フィールド4: [07/Apr/2026:10:28:43 +0900] → 日時(%t) フィールド5: "GET /index.html HTTP/1.1" → リクエスト行(%r) フィールド6: 200 → ステータスコード(%>s) フィールド7: 8421 → レスポンスバイト数(%b) フィールド8: "https://www.google.com/" → リファラー(%{Referer}i) フィールド9: "Mozilla/5.0 ..." → ユーザーエージェント(%{User-Agent}i)

主なステータスコードの意味

200:リクエスト成功(正常応答)
301 / 302:リダイレクト(恒久 / 一時)
304:未変更(キャッシュを利用)
400:不正なリクエスト(Bad Request)
403:アクセス禁止(Forbidden)
404:ページが見つからない(Not Found)
500:サーバー内部エラー(Internal Server Error)
503:サービス利用不可(Service Unavailable)

応用・実務Tips

1. バーチャルホストごとにログファイルを分ける

複数のバーチャルホストを運用している場合、VirtualHost ブロック内に CustomLog を設定することで、ホストごとにログファイルを分けられます。

# /etc/httpd/conf.d/vhost.conf <VirtualHost *:80> ServerName www.example.com DocumentRoot /var/www/example # このバーチャルホスト専用のアクセスログ CustomLog "/var/log/httpd/example_access_log" combined ErrorLog "/var/log/httpd/example_error_log" </VirtualHost>

2. 処理時間を記録するカスタムフォーマット

レスポンスが遅いページを特定するには、処理時間(%D)をログに追加します。

# 処理時間(マイクロ秒)を末尾に追加したカスタムフォーマット LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined_time CustomLog "/var/log/httpd/access_log" combined_time

%D の値が 1000000(1秒 = 100万マイクロ秒)を超えているリクエストは、パフォーマンスに問題がある可能性があります。

3. 静的ファイルのログを除外する(条件付きロギング)

画像・CSS・JS などの静的ファイルへのアクセスをログから除外すると、ログファイルの肥大化を防げます。

# 環境変数を使った条件付きロギング # 拡張子が .jpg .gif .png .css .js のリクエストはログに記録しない SetEnvIf Request_URI "\.(jpg|gif|png|css|js)$" nolog CustomLog "/var/log/httpd/access_log" combined env=!nolog

4. logrotateとの連携

アクセスログはデフォルトで /etc/logrotate.d/httpd に設定されており、定期的にローテーションが行われます。

# /etc/logrotate.d/httpd(デフォルト設定) /var/log/httpd/*log { missingok notifempty sharedscripts delaycompress postrotate /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true endscript }

postrotatehttpd reload を実行しているのは、ローテーション後の新しいログファイルへの書き込みを切り替えるためです。

トラブルシュート・エラー対処

1. アクセスログにリクエストが記録されない

ログファイルには書き込み権限が必要です。Apache の実行ユーザー(通常は apache または www-data)がログファイルへの書き込み権限を持っているか確認してください。

# ログディレクトリの権限を確認する $ ls -la /var/log/httpd/ drwx--x--- 2 root apache 60 Apr 7 09:00 . -rw-r--r-- 1 apache apache 0 Apr 7 09:00 access_log # Apacheの実行ユーザーを確認する $ grep "^User " /etc/httpd/conf/httpd.conf User apache

2. ログファイルのパスが正しく認識されない

CustomLog の設定変更後は Apachectl による構文チェックと再起動が必要です。

# 構文チェック $ sudo apachectl configtest Syntax OK # 設定の反映(サービス再起動) $ sudo systemctl restart httpd # ログに書き込みが始まったか確認する $ sudo tail -f /var/log/httpd/access_log

3. ログが大きくなりすぎてディスクが満杯になった

ログファイルの容量が膨大になった場合は、以下の手順で対処します。

# ログファイルのサイズを確認する $ du -sh /var/log/httpd/* 2.3G /var/log/httpd/access_log 154M /var/log/httpd/error_log # 手動でlogrotateを実行してローテーションを強制する $ sudo logrotate -f /etc/logrotate.d/httpd

根本対処としては、条件付きロギングで不要なリクエストの記録を除外するか、logrotate の設定で保持世代数やファイルサイズ上限を見直してください。

本記事のまとめ(CustomLog / LogFormat 早見表)

やりたいこと 設定例
combined形式でアクセスログを設定する CustomLog "/var/log/httpd/access_log" combined
combined形式のフォーマットを定義する LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
バーチャルホストごとにログを分ける VirtualHostブロック内にCustomLogを設定
処理時間をログに記録する %D(マイクロ秒)をフォーマットに追加
静的ファイルのログを除外する SetEnvIfenv=!nologで条件付きロギング
ログを定期的に管理する /etc/logrotate.d/httpd でlogrotate連携
アクセスログの最新行を確認する sudo tail -f /var/log/httpd/access_log
設定変更後に構文チェックする sudo apachectl configtest

Apacheの設定で詰まったことはありませんか?

アクセスログの設定に限らず、Linuxサーバー構築では「設定した通りに動かない」「エラーの意味がわからない」といった壁に何度もぶつかります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。