Apache のLogの名前について。
私はLogが大好きです。
なので、Logを破棄することってあんまりないんです。
結構システムロガーとかこだわる人多いのですが、今回の話題はApacheです。
思ったきっかけ
結構前から何台も何台もWEBサーバーを構築していると
- ApacheのLogをホストごとに変える
- 日付でログローテートする
って事は最低限するんですが ApacheのLogをホストごとに変える
って作業が超絶めんどくさい。
AWSでオートスケールとか使ったらもうアウト。
解析するときどのホストでのLogなのかわかりづらい。(俺の頭がわ… ry)
対処法
Apacheの Logの名前指定に変数でホスト名を当てる。
環境
- OS : CentOS 6.5
- Apache : 2.2.15 (yum install)
やり方
Apacheくんはyum でインストールされた場合は
/etc/sysconfig/httpd
に環境変数を当てることができる。OPTIONSとか
そこに自身のホスト名を入れてあげる。
(ソースから入れたら apache2/bin/envvars がそれに当たる)
そしてLogFormat呼び出しの際にホスト名を変数してあげる。
具体的には
- こんなコードを用意してあげる。(書き方は何でも良い。)
# !/bin/bash
DATE=`date`
CONFIG=/etc/sysconfig/httpd
MY_HOST=`hostname -s`
ADD_ENV='export HOSTNAME'
PUT_HOST="HOSTNAME=${MY_HOST}"
CHECK_HOST=`cat ${CONFIG} | grep "^HOSTNAME="`
CHECK_ENV=`cat ${CONFIG} | grep "${ADD_ENV}"`
MES="
APACHE に当てる HOSTNAME の重複もしくは以前のHOST情報が残っている可能性がありました。
この情報は削除され、新しい HOSTNAME へ書き換えられます。
旧情報 : ${CHECK_HOST}
新情報 : ${PUT_HOST}
実行時間 : ${DATE}
"
for hostname in ${CHECK_HOST}; do
if [ "${CHECK_HOST}" != '' ]; then
sed -i -e "/${hostname}/d" ${CONFIG}
echo ${MES}
fi;
done
echo ${PUT_HOST} >> ${CONFIG}
if [ "${CHECK_ENV}" != '' ]; then
sed -i -e "/${ADD_ENV}/d" ${CONFIG}
fi
echo ${ADD_ENV} >> ${CONFIG}
※適宜自身の環境に合わせて変更必要
2. Apache に変数で指定する。
log/httpd/access_log.%Y%m%d.${HOSTNAME}
等
3. Apache 再起動する。
以上!
ついでに
AWSのオートスケール用のAMIや、vagrant 使ってるならboxなどの
/etc/rc.d/rc.local
にさっきのスクリプトを仕込んでおくと起動時に勝手にやってくれるから、httpdConfigに変数を仕込むだけでいい。
※動作は個々で検証してからね!
更に追記
この書式綺麗にしてくれる人募集中!