logrotateでローテートされたファイルをWindows共有フォルダに自動的にコピーする設定
CentOS7.2にて動作を確認した。
2016/02/05追記:logrotateの定義ファイルにて、翌月1日にローテートされるときにファイル名の日付を間違えて生成してしまう問題を修正しました。
検証環境の概要
- host0とhost1という2つのホストからsyslogを受信している。
- syslog側の設定として、受信したsyslogデータ内のホスト名を見て、動的にホスト毎のディレクトリを生成する設定をしている。
- samba,cifs-util等のWindows共有フォルダへのアクセスに必要なパッケージ、設定は完了済み。
まずは適当に/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