Posted at

Apacheのaccess_logとssl_access_logをまとめる

More than 3 years have passed since last update.

Apacheの、分かれている上にフォーマットも違うssl_access_logとaccess_logをまとめる方法メモ。

ついでに、HTTPかHTTPSかもわからないと困るので、それをわかるようにログを出力させる。

※下記を参考にさせてもらいました。フォーマット設定のカスタマイズで参考になりました。

http://qiita.com/tsumekoara/items/a9189fd1f27c49613577


結論だけ先に

端的に言ってしまうと


  • cronologを使って同じ出力先を指定してあげる

  • 出力フォーマットにapacheの環境変数の{HTTPS}を使う

で、実現しました。これだけで意味がわかってしまう人は以下は読まなくていいですw

わかってる人にはいらない説明もあるので適宜読み飛ばしてください。


apacheのaccess_logとssl_access_logについて色々

ssl.confがない!という場合はそもそもmod_sslが入ってないかもしれないので、使うのであればyum install mod_sslで入れればいい感じみたいです。

Apacheのデフォルトのcombinedだとこんな感じ。(httpd.confの中身の話です。)

※本当にデフォルトだとcommonになってます。念のため。

LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined

デフォルトの出力先はこんな感じ

CustomLog logs/access.log combined

この状態でもいいんですが、デフォルトだときちんとログローテーションしないと/var/log/httpd/access.logに、サーバにアクセスがある度にバンバン書き込まれていってファイルが肥大化するので、ログのローテーションをします。

ログのローテーションの仕方はいくつかありますが、下記が参考になりました。

http://xn--u9j0md1592aqmt715c.net/linux-apache-log-rotate/

他にはcronologやrotatelogsを使用するパターンもあります。

今回はcronologを使います。cronologはインストールが必要、rotatelogsはapacheのバージョンが1.3だと機能が少ないとからしいですが、どっちのほうがいいかはちょっとわかりません。

(あと、rotatelogsでは今回やることは試してないです…。)

combinedのフォーマットでアクセスログをcronologで出力する設定

例えば出力先ディレクトリを%Y%m%dみたいに指定すると日付ごとに分割できます。

CustomLog "| /usr/sbin/cronolog /var/log/httpd/%Y%m%d/access_log" combined env=!nolog

一方、ssl.confのデフォルトだとこんな感じ

ErrorLog logs/ssl_error_log

TransferLog logs/ssl_access_log
LogLevel warn

ログのフォーマットの指定とか何もしてないですが、きちんと設定すると普通のアクセスログ同様に指定することができます。

下記はssl_access_logに対しcombinedと同様の出力結果を指定した場合。

ErrorLog logs/ssl_error_log

LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D"
TransferLog logs/ssl_access_log
LogLevel warn


実際のまとめ方

さて、面倒なのでアクセスログを統一したい、ということだったんですが、デフォルトの出力のさせかたでssl.confのTransferLogとhttpd.confのアクセスログの出力先を同じにするとエラーになって困ったことになりました。

そこでcronologで指定してみたところ、エラーにならずにログを統一することができました!

ssl.confもcronologを使うことにしたのがこちら。

ErrorLog "| /usr/sbin/cronolog /var/log/httpd/%Y%m%d/error_log"

LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D"
TransferLog "| /usr/sbin/cronolog /var/log/httpd/%Y%m%d/access_log"
LogLevel warn

特に言及しませんでしたが、こんな感じにErrorLogにもcronologを使うことができる…はず(sslのほうはまだちゃんと確認できてないですが、とりあえずエラーにはなってません。)

これでデフォルトの指定方法だとSyntax Errorとなっていたのを回避し、access_logとssl_access_logを同一の出力先(access_log)に統一できました。

ただし、これだとHTTPのアクセスなのか、HTTPSのアクセスなのか、判別できません。

そこで調べてみたら、Apacheの(正確にいうとmod_sslの?)環境変数に{HTTPS}という、HTTPSでのアクセスだったら「on」、それ以外だと「-」となる変数があったので、それをログフォーマットに含めることで判別しました。

httpd.conf、ssl.conf両方の(片方でもいいですが、形を統一するため)、LogFormat指定の箇所に「%{HTTPS}e」の記載を追加します。

追加箇所は任意ですが、とりあえず後ろに追加する場合

LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{HTTPS}e"

これでログ出力内容の一番後ろに「on」があったらそれはHTTPSによるアクセス、「-」だったらHTTPによるアクセス、ということがログを見てわかるようになります。

つまり、最終的にはssl.confはこんな感じ

ErrorLog "| /usr/sbin/cronolog /var/log/httpd/%Y%m%d/error_log"

LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{HTTPS}e"
TransferLog "| /usr/sbin/cronolog /var/log/httpd/%Y%m%d/access_log"
LogLevel warn

httpd.confはこの設定だとcombinedのフォーマットをいじれば、combinedと設定しているログは全て同様に出力内容が変わります。

それが嫌な場合は適当な名前で出力フォーマットを定義して、その出力フォーマットを該当のログに設定しましょう。