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