better done than better said

困ったときに調べた結果

apache access_logのファイル名を可変にする方法

access_logのファイル名を10分単位で任意のファイル名に変更したい場合どうすれば良いか調べた結果。

1. VirtualHost

<VirtualHost *:80>
  ServerName xxx.xxx
  SetEnvIf Request_URI \/favicon.ico$ no_log
  Logformat "%{%Y-%m-%d %T}t %A %{Client-Ip}i %{Referer}i %{User-Agent}i %D" common
  CustomLog "|/usr/local/bin/log.sh" common env=!no_log
</VirtualHost>

2. log.sh

#!/usr/bin/env bash
hostname=$(hostname)

while read line; do
  timestamp=$(date '+%s')
  prefix=$(($timestamp / 600))
  echo $line >> /var/log/access/${prefix}_foo_${hostname}
done

最初1つのログを処理してコマンドが終了する書き方をしていたら処理は動くけど以下のようなエラーが出るようになってしまったので上記のような継続的に標準入力を処理する方法に書き換える必要がありました。 apacheのログ出力は継続的にログを読み込むプロセスでなければいけないようですね。

AH00106: piped log program '/usr/local/bin/log.sh' failed unexpectedly

単純に10分単位でログを出したいだけであればrotatelogsを使えば簡単。

CustomLog "|/usr/bin/rotatelogs /var/log/access/%s_foo.log 600" common