logrotateでローテートされたファイルをWindows共有フォルダに自動的にコピーする設定

CentOS7.2にて動作を確認した。

2016/02/05追記:logrotateの定義ファイルにて、翌月1日にローテートされるときにファイル名の日付を間違えて生成してしまう問題を修正しました。

検証環境の概要

まずは適当に/etc/logrotate.d配下に定義ファイルを作る。

vim/etc/logrotate.d/syslog

以下のように記述する。

/var/log/rsyslog/syslog_host0.log # ローテートしたいログファイルを指定
/var/log/rsyslog/syslog_host1.log # 同じく
{
  daily
  rotate 365
  missingok
  notifempty
  dateext
  compress
  create
  sharedscripts
  postrotate
   /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
  lastaction
   year=`date +%Y`
   yesterday_year=`date +%Y -d '1 days ago'`
   month=`date +%m`
   yesterday_month=`date +%m -d '1 days ago'`
   today=`date +%d`
   yesterday=`date +%d -d '1 days ago'`
   for f in $*; do
     hostname=`echo $f| sed -E 's/(^\/var\/log\/rsyslog\/.*\/syslog_|\.log$)//g'`
     dir=/cifs/$hostname; [ ! -e $dir ] && mkdir -p $dir
     mv /var/log/rsyslog/$hostname/syslog_$hostname.log-$year$month$today.gz /var/log/rsyslog/$hostname/syslog_$hostname.log-$yesterday_year$yesterday_month$yesterday.gz
     cp -p /var/log/rsyslog/$hostname/syslog_$hostname.log-$yesterday_year$yesterday_month$yesterday.gz /cifs/$hostname/syslog_$hostname.log-$yesterday_year$yesterday_month$yesterday.gz
   done
  endscript
}
課題
  • ローテート対象のファイルを静的指定している。(ワイルドカードで指定したい。)
    • ワイルドカード指定するとlastaction ~ endscript内に渡される引数($*)の値がおかしくなった。(記憶曖昧なため、用再検証)
おまけ: rsyslog.conf

前述のホスト毎にディレクトリを分ける設定はrsyslog.conf内に以下のように記述した。

#Log message template
$template DynFile,"/var/log/rsyslog/%HOSTNAME%/syslog_%HOSTNAME%.log"
*.*                                                     -?DynFile