トップ  »  Tech  »  CentOS

各デーモン毎の設定を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ディレクトリに保存されます。