Apacheのaccess_logとssl_access_logをまとめる

※追記

この記事はssl_access_logとaccess_logをまとめたいという要望があったので、その方法を調べたメモと言う形でQiitaに記載しました。
しかし、現在は**個人的にはあまりこの形を推奨しません。**
理由は

- ログの形がデフォルトから変わってしまうのが嫌だ
- ログローテーションはなるべく`logrotate.d`に統一させ、個別にローテーション設定しないようにしたい
    - 設定が分散するため
- わざわざApacheの設定で統合する必要もなく、そのままどっかに収集すればよくない？

といった感じです。
一応こんなふうにログをカスタマイズすることもできるよ、ということで。

----

Apacheの、分かれている上にフォーマットも違うssl_access_logとaccess_logをまとめる方法メモ。
ついでに、HTTPかHTTPSかもわからないと困るので、それをわかるようにログを出力させる。
※下記を参考にさせてもらいました。フォーマット設定のカスタマイズで参考になりました。
http://qiita.com/tsumekoara/items/a9189fd1f27c49613577

# 結論だけ先に
端的に言ってしまうと

* cronologを使って同じ出力先を指定してあげる
* 出力フォーマットにapacheの環境変数の{HTTPS}を使う

で、実現しました。これだけで意味がわかってしまう人は以下は読まなくていいですｗ
わかってる人にはいらない説明もあるので適宜読み飛ばしてください。

# apacheのaccess_logとssl_access_logについて色々
ssl.confがない！という場合はそもそもmod_sslが入ってないかもしれないので、使うのであれば```yum install mod_ssl```で入れればいい感じみたいです。
Apacheのデフォルトのcombinedだとこんな感じ。（httpd.confの中身の話です。）
※本当にデフォルトだとcommonになってます。念のため。

```apache
LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
```
デフォルトの出力先はこんな感じ

```apache
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みたいに指定すると日付ごとに分割できます。

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

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

```apache
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
```
ログのフォーマットの指定とか何もしてないですが、きちんと設定すると普通のアクセスログ同様に指定することができます。
下記はssl_access_logに対しcombinedと同様の出力結果を指定した場合。

```apache
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を使うことにしたのがこちら。

```apache
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」の記載を追加します。
追加箇所は任意ですが、とりあえず後ろに追加する場合

```apache
LogFormat "%h - - %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{HTTPS}e"
```
これでログ出力内容の一番後ろに「on」があったらそれはHTTPSによるアクセス、「-」だったらHTTPによるアクセス、ということがログを見てわかるようになります。

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

```apache
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と設定しているログは全て同様に出力内容が変わります。
それが嫌な場合は適当な名前で出力フォーマットを定義して、その出力フォーマットを該当のログに設定しましょう。