LoginSignup
0
0

More than 5 years have passed since last update.

Apache Log の HOSTごとの切り分けをconfigへベタで書くのをやめてみる。

Last updated at Posted at 2013-12-24

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呼び出しの際にホスト名を変数してあげる。

具体的には

  1. こんなコードを用意してあげる。(書き方は何でも良い。)
#!/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に変数を仕込むだけでいい。
※動作は個々で検証してからね!

更に追記

この書式綺麗にしてくれる人募集中!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0