各デーモン毎の設定をlogrotateに書いた例です。/etc/logrotate.dに作成するファイル名を列挙しておきます。
- acpid
- cups
- cupsを使用しないならば不要
- httpd
- Apacheのログをlogrotateで処理する場合のみ
- mgetty
- ppp
- 不要
- proftpd
- ProFTPdのログをlogrotateで処理する場合のみ
- psacct
- rpm
- syslog
- up2date
- CentOSでup2dateを使わないならば不要
- yum
acpid
acpidのログローテーションです。この内容はデフォルトで用意されているものです。
/var/log/acpid {
missingok
notifempty
size=64k
postrotate
/etc/init.d/acpid condrestart >/dev/null || :
endscript
}
sizeが64kに達した際にローテーションされます。ローテーション後はacpidをリスタートします。世代はlogrotate.confの設定を引き継ぎます。
cups
cupsのログローテーションです。この内容はデフォルトで用意されているものです。ログファイルは/var/log/cups/以下に*_logという名前で保存されます。その全てを処理対象としています。
/var/log/cups/*_log {
missingok
weekly
rotate 64
notifempty
sharedscripts
postrotate
/etc/init.d/cups condrestart >/dev/null 2>&1 || true
endscript
}
cupsを使ってないならば、このファイルを削除してしまっても良いでしょう。
httpd
Apacheのログファイルをlogrotateを使ってローテーションする場合の例です。ファイルを/etc/logrotate.d/httpdとして作成します。
/var/log/httpd/access_log /var/log/httpd/error_log /var/log/httpd/ssl_request_log {
sharedscripts
nocompress
postrotate
/sbin/service httpd graceful > /dev/null 2>&1
endscript
lastaction
EXT=`/bin/date +%Y%m%d`
LOGDIR='/var/log/httpd'
OLDDIR='/var/log/httpd/archives'
/bin/gzip -9 ${LOGDIR}/access_log.1
/bin/gzip -9 ${LOGDIR}/error_log.1
/bin/gzip -9 ${LOGDIR}/ssl_request_log.1
/bin/mv -f ${LOGDIR}/access_log.1.gz ${OLDDIR}/access_log.${EXT}.gz
/bin/mv -f ${LOGDIR}/error_log.1.gz ${OLDDIR}/error_log.${EXT}.gz
/bin/mv -f ${LOGDIR}/ssl_request_log.1.gz ${OLDDIR}/ssl_request_log.${EXT}.gz
endscript
}
ここで処理対象としているApacheのログファイルは、下記の3つです。
- /var/log/httpd/access_log
- /var/log/httpd/error_log
- /var/log/httpd/ssl_request_log
これらのファイル名は環境によっても変わってきます。SSLを使用していない場合は、
ssl_request_logファイルは無いです。
ローテーション後にファイル名を *.日付.gz にリネームし、さらに過去ログ用ディレクトリに移動してあります。ローテーション後のファイルは全て /var/log/httpd/archives に置かれることになります。また、ローテーション処理後にhttpdのプロセスをgracefulで再起動しています。
ログファイルの場所移動にはlogrotateの olddir オプションを利用してもよいかもしれません。移動先のディレクトリ名を年月にしたり、そういった場合はolddirオプションでは対応できないので、上記のような書き方をします。
mgetty
#
# Rotate mgetty log files.
#
/var/log/mgetty.log.tty[^.]
/var/log/mgetty.log.tty[^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.][^.][^.]
/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.][^.][^.][^.]
/var/log/mgetty.log.unknown /var/log/mgetty.callback {
nocompress
missingok
}
これは何のログでしょう~!?普段は生成されていないのですが。
ppp
# Logrotate file for ppp RPM
/var/log/ppp/connect-errors {
missingok
compress
notifempty
daily
rotate 5
create 0600 root root
}
これはpppのログで/var/log/ppp以下に生成される。pppを使用していない場合は当然ながら記述不要である。
proftpd
ProFTPdのログファイルをlogrotateを使ってローテーションする場合の記述例です。次の3つのログファイルを対象としています。
/var/log/proftpd/extended.log /var/log/proftpd/proftpd.log /var/log/proftpd/transfer.log {
sharedscripts
nocompress
postrotate
if test -n "`/bin/ps acx | /bin/grep proftpd`";
then
/usr/bin/killall -HUP in.proftpd
fi
endscript
lastaction
EXT=`/bin/date +%Y%m%d`
LOGDIR='/var/log/proftpd'
OLDDIR='/var/log/proftpd/archives'
/bin/gzip -9 ${LOGDIR}/extended.log.1
/bin/gzip -9 ${LOGDIR}/proftpd.log.1
/bin/gzip -9 ${LOGDIR}/transfer.log.1
/bin/mv -f ${LOGDIR}/extended.log.1.gz ${OLDDIR}/extended.log.${EXT}.gz
/bin/mv -f ${LOGDIR}/proftpd.log.1.gz ${OLDDIR}/proftpd.log.${EXT}.gz
/bin/mv -f ${LOGDIR}/transfer.log.1.gz ${OLDDIR}/transfer.log.${EXT}.gz
endscript
}
ローテーション処理終了後にproftpdのプロセスを再起動させています。この記述はxinetd経由でproftpdを起動してる場合です。standaloneモードの場合はserviceを使って再起動させます。
また、ローテーション後にファイル名を日付でリネームし、過去ログ用のディレクトリに保存しています。
psacct
# Logrotate file for psacct RPM
/var/account/pacct {
# prerotate loses accounting records, let's no
#prerotate
# /usr/sbin/accton
#endscript
compress
delaycompress
notifempty
daily
rotate 31
create 0600 root root
postrotate
/usr/sbin/accton /var/account/pacct
endscript
}
これは何のログでしょう~!?普段は生成されていないのですが。
rpm
cron.dailyで実行されているrpmのログファイルをローテーションします。これはインストール済みRPMの一覧になります。dailyで生成されるのですが、取り立てて必要なものではないのでweeklyでローテーションするようにしています。
/var/log/rpmpkgs {
weekly
notifempty
missingok
nocompress
lastaction
EXT=`date +%Y%m%d`
ODATE=`/bin/date -d '3 week ago' +%Y%m%d`
/bin/mv -f /var/log/rpmpkgs.1 /var/log/rpmpkgs.${EXT}
if [ -f /var/log/rpmpkgs.${ODATE} ];
then
/bin/mv -f /var/log/rpmpkgs.${ODATE} /var/log/archives/rpmpkgs/
fi
endscript
}
直近の3ファイルだけを残し、古いデータは/var/log/archives/rpmpkgs/に移動しています。また、ファイル名に日付を入れています。
up2date
RedHatEnterpriseLinux系のup2dateのログをローテーションします。CentOSを使っていてup2dateを利用していない場合は記述不要です。
/var/log/up2date {
missingok
weekly
}
yum
CentOS/Fedoraのyumのログをローテーションする設定です。yumのログはアップデートが行われなかった場合は生成されないので、下記のような記述でよいでしょう。マッチするファイルが存在しなかった場合はlastactionスクリプトが実行されません。直前に実施されたアップデートのログをweeklyで退避するようなイメージです。
/var/log/yum.log {
missingok
nocompress
weekly
nocreate
lastaction
EXT=`date +%Y%m%d`
ODATE=`/bin/date -d '3 week ago' +%Y%m%d`
/bin/mv -f /var/log/yum.log.1 /var/log/yum.log.${EXT}
if [ -f /var/log/yum.log.${ODATE} ];
then
/bin/mv -f /var/log/yum.log.${ODATE} /var/log/archives/yum/
fi
endscript
}
また、古いログはarchivesディレクトリに移動させています。
syslog
最後にsyslog経由で生成されるログのローテーションの設定です。Linuxサーバを運用する上では最も基本となるログですので、きちんとローテーションして保存しておきましょう。
/var/log/messages /var/log/secure /var/log/maillog /var/log/boot.log
/var/log/cron {
sharedscripts
missingok
nocompress
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
lastaction
EXT=`/bin/date +%Y%m%d`
ODATE=`/bin/date -d '3 week ago' +%Y%m%d`
/bin/gzip -9 /var/log/messages.1
/bin/gzip -9 /var/log/secure.1
/bin/gzip -9 /var/log/maillog.1
/bin/gzip -9 /var/log/boot.log.1
/bin/gzip -9 /var/log/cron.1
/bin/mv -f /var/log/messages.1.gz /var/log/messages.${EXT}.gz
/bin/mv -f /var/log/secure.1.gz /var/log/secure.${EXT}.gz
/bin/mv -f /var/log/maillog.1.gz /var/log/maillog.${EXT}.gz
/bin/mv -f /var/log/boot.log.1.gz /var/log/boot.log.${EXT}.gz
/bin/mv -f /var/log/cron.1.gz /var/log/cron.${EXT}.gz
if [ -f /var/log/messages.${ODATE}.gz ];
then
/bin/mv -f /var/log/messages.${ODATE}.gz /var/log/archives/messages/
fi
if [ -f /var/log/secure.${ODATE}.gz ];
then
/bin/mv -f /var/log/secure.${ODATE}.gz /var/log/archives/secure/
fi
if [ -f /var/log/maillog.${ODATE}.gz ];
then
/bin/mv -f /var/log/maillog.${ODATE}.gz /var/log/archives/maillog/
fi
if [ -f /var/log/boot.log.${ODATE}.gz ];
then
/bin/mv -f /var/log/boot.log.${ODATE}.gz /var/log/archives/boot/
fi
if [ -f /var/log/cron.${ODATE}.gz ];
then
/bin/mv -f /var/log/cron.${ODATE}.gz /var/log/archives/cron/
fi
endscript
}
syslogが書きだす6つのログを処理対象とし、ローテート後に圧縮、ファイル名のリネーム、ログディレクトリへの移動を行っています。処理対象は下記のファイル。
- /var/log/messages
- /var/log/secure
- /var/log/maillog
- /var/log/boot.log
- /var/log/cron
また、ローテーションを行った後にpostrotateスクリプト内にてsyslogdをリスタートしています。続くlastactionスクリプト内がファイル名の処理です。
ログファイルの保存先
各種ログファイルの保存先ディレクトリを再度確認しておきます。
運用時の出力先一覧。
| サービス | ディレクトリ |
|---|---|
| acpid | /var/log |
| cups | /var/log/cups |
| httpd | /var/log/httpd |
| mgetty | /var/log |
| ppp | /var/log/ppp |
| proftpd | /var/log/proftpd |
| psacct | /var/account |
| rpm | /var/log |
| up2date | /var/log |
| yum | /var/log |
| syslog | /var/log |
※新しいログは常にここのファイルに書き込まれます。
古いログの保存先一覧。
| サービス | ディレクトリ |
|---|---|
| acpid | 無し |
| cups | 無し |
| httpd | /var/log/httpd/archive |
| mgetty | 無し |
| ppp | 無し |
| proftpd | /var/log/proftpd/archive |
| psacct | 無し |
| rpm | /var/log/archives/rpmpkgs |
| up2date | /var/log/archives/up2date |
| yum | /var/log/archives/yum |
| syslog | /var/log/archives |
※古いログはこちらのarchivesディレクトリに保存されます。