2014年3月13日木曜日

Apacheのログ出力先を変更し日次でrotateする設定

Apacheのログはデフォルトでは、/etc/logrotate.conf と /etc/logrotate.d/httpd の
設定により週次でローテートされ4世代のバックアップを保持します。およそ1か月以上前のログは
参照できなくなります。大規模サイト等では長期間のログを保持する必要があるためこの設定は
不都合になることがあります。

一般的にApacheのログ出力先とWebサイトコンテンツは別ボリュームに分けたほうがよいと
考えられます。Apacheのログ出力先を変更(/log/ 以下)して日次で出力する設定をまとめます。

また、ログは削除せず、任意のタイミングでアーカイブするシェルスクリプトも準備します。

OS: RedHat EL 6.4(64-bit)
Apache: 2.2.15
仮ドメイン名: domain1.com、domain2.com


■Apacheのログを日次で出力
httpd.confの下記個所を変更します。
ログファイル名に日付を付与し、1日(=86400秒)ごとに出力します。
VirtualHost別のログ出力先を考慮して /log/httpd/[ドメイン名]/ 以下に変更します。
[root@dcf-web ~]# grep -B 1 rotatelogs /etc/httpd/conf/httpd.conf
#ErrorLog logs/error_log
ErrorLog "| /usr/sbin/rotatelogs -l /log/httpd/domain1.com/error_log-%Y%m%d 86400"
--
#CustomLog logs/access_log combined
CustomLog "| /usr/sbin/rotatelogs -l /log/httpd/domain1.com/access_log-%Y%m%d 86400" combined
[root@dcf-web ~]#
※domain2.comの設定は省略。
※/log/httpd/domain1.com-access_log-%Y%m%d と /log/httpd/domain2.com-access_log-%Y%m%d
 のようにして、ファイル名でドメインを区別する方法もアリです。

⇒ログ出力状況(以下のhttpdlog_archive.shを実行済み)
[root@dcf-web ~]# ll /log/httpd/domain1.com/ | head
合計 1045260
-rw-r--r-- 1 root root    40813  1月  1 23:59 2014 access_log-20140101
-rw-r--r-- 1 root root    40698  1月  2 23:59 2014 access_log-20140102
-rw-r--r-- 1 root root    43786  1月  3 23:59 2014 access_log-20140103
-rw-r--r-- 1 root root    40418  1月  4 23:59 2014 access_log-20140104
-rw-r--r-- 1 root root    52147  1月  5 23:59 2014 access_log-20140105
-rw-r--r-- 1 root root    40623  1月  6 23:59 2014 access_log-20140106
-rw-r--r-- 1 root root    40426  1月  7 23:59 2014 access_log-20140107
-rw-r--r-- 1 root root    42826  1月  8 23:59 2014 access_log-20140108
-rw-r--r-- 1 root root    40254  1月  9 23:59 2014 access_log-20140109
[root@dcf-web ~]#

■3ヵ月前のhttpdログをアーカイブするシェルスクリプト
シェルスクリプトファイル名: httpdlog_archive.sh
#!/bin/sh
#######################################################################
# << 機能概要 >>
# 3ヵ月前のApacheのログファイル1か月分をアーカイブ後、生ログ削除
# ログ出力先: /log/httpd/domain1.com/
#           /log/httpd/domain2.com/
#
# << 変更履歴 >>
# Version  変更日       変更者        変更内容
# --------+------------+-----------+----------------------------------
#     1.0  2014/03/06   tanyao    New
#
#######################################################################

# 対象月を取得(yyyymm)
TARGET_MONTH=`date -d '3 months ago' '+%Y%m'`

# ログ保存先ディレクトリパス
LOG_DIR=/log/httpd

# 対象ディレクトリへ移動
cd ${LOG_DIR}

# 出力対象ファイルが既に存在する場合は終了
if [ -f domain1.com_${TARGET_MONTH}.tar.gz ] || [ -f domain2.com_${TARGET_MONTH}.tar.gz ]; then
    echo "tar file already exit."
    exit 1
fi

# 対象ログファイルアーカイブ
tar -zcf domain1.com_${TARGET_MONTH}.tar.gz domain1.com/*_log-${TARGET_MONTH}*
tar -zcf domain2.com_${TARGET_MONTH}.tar.gz domain2.com/*_log-${TARGET_MONTH}*

# 生ログは削除
rm -rf domain1.com/*_log-${TARGET_MONTH}*
rm -rf domain2.com/*_log-${TARGET_MONTH}*

cd -

exit 0

■crontabに登録
[root@dcf-web ~]# crontab -l | tail -2
# httpd log archive
22 2 2 * * (/opt/private/batch/httpdlog_archive.sh > /dev/null 2>&1)
[root@dcf-web ~]#
⇒ログアーカイブ状況
[root@dcf-web ~]# ll /log/httpd/
合計 272
drwxr-xr-x 2 root root  20480  3月 12 15:01 2014 domain1.com
-rw-r--r-- 1 root root     45  2月  2 22:00 2014 domain1.com_201311.tar.gz
-rw-r--r-- 1 root root 189336  3月  2 22:01 2014 domain1.com_201312.tar.gz
drwxr-xr-x 2 root root  20480  3月 12 14:59 2014 domain2.com
-rw-r--r-- 1 root root   8780  2月  2 22:01 2014 domain2.com_201311.tar.gz
-rw-r--r-- 1 root root  23253  3月  2 22:01 2014 domain2.com_201312.tar.gz
[root@dcf-web ~]#

こちらの情報が何かのお役に立てましたら幸いです。サイト継続のご協力ありがとうございます。m(_ _)m

0 件のコメント:

コメントを投稿