ログをローテーションする
rsyslog で リモートからのログ(リモート・ログ)をローテーションする
/etc/logrotate.d/xxx-takuya.conf
リモート用に作った設定はこれ
/var/log/remote/*.log { rotate 4 daily missingok notifempty compress compresscmd /usr/bin/pigz compressext .gz delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
設定の細かい部分は、後半で。
動作チェック
sudo logrotate --debug /etc/logrotate.conf
ちゃんと計画された。
considering log /var/log/rsyslog/pi-zero.log Creating new state Now: 2022-09-05 21:48 Last rotated at 2022-09-05 21:00 log does not need rotating (log has already been rotated) considering log /var/log/remote/pizero-otg.log
logrotate の設定を確認
takuya@raspi-ubuntu:~$ sudo systemctl cat logrotate.timer logrotate.service
なるほど、systemd経由で、logrotate が動いていて、oneshot で定期的に実行されるわけだな。
/etc/logrotate.d/rsyslog
実際の設定例を見ておく
/var/log/syslog /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
これは次のようにログが管理されていて、順番にローテーションする。
ls -l /var/log/*.log* /var/log/alternatives.log /var/log/alternatives.log.1 /var/log/alternatives.log.2.gz /var/log/alternatives.log.3.gz /var/log/alternatives.log.4.gz /var/log/apport.log /var/log/apport.log.1 /var/log/apport.log.2.gz /var/log/auth.log /var/log/auth.log.1 /var/log/auth.log.2.gz /var/log/auth.log.3.gz /var/log/auth.log.4.gz /var/log/boot.log /var/log/boot.log.1 /var/log/cloud-init-output.log /var/log/cloud-init.log /var/log/dpkg.log /var/log/dpkg.log.1 /var/log/dpkg.log.2.gz /var/log/dpkg.log.3.gz /var/log/dpkg.log.4.gz /var/log/dpkg.log.5.gz /var/log/dpkg.log.6.gz /var/log/dpkg.log.7.gz /var/log/fontconfig.log /var/log/kern.log /var/log/kern.log.1 /var/log/kern.log.2.gz /var/log/kern.log.3.gz /var/log/kern.log.4.gz /var/log/ubuntu-advantage-timer.log /var/log/ubuntu-advantage-timer.log.1 /var/log/ubuntu-advantage-timer.log.2.gz /var/log/ubuntu-advantage-timer.log.3.gz /var/log/ubuntu-advantage-timer.log.4.gz /var/log/ubuntu-advantage-timer.log.5.gz /var/log/ubuntu-advantage-timer.log.6.gz /var/log/ubuntu-advantage.log /var/log/ubuntu-advantage.log.1 /var/log/ubuntu-advantage.log.2.gz
logrotate の設定ファイルを見てみる
### /etc/logrotate.d/rsyslog /var/log/syslog... /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
全体構造
ファイル名(列挙する) ファイル名(列挙する) ファイル名(列挙する) ファイル名(または、ワイルドカード使用可能) ( 設定 )
設定の部分について
{ # 名前 値 rotate 4 }
設定項目について
{ # 世代 rotate 4 # 週次(書き換えサイクル) weekly # ログファイルがない場合は無視 missingok # ログが空なら何もしない notifempty # ローテーションは圧縮する compress # 圧縮は2世代後 delaycompress # この設定で一回だけ呼ばれる。 # 未指定の場合はファイルごとに呼ばれる、 sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
などとなっており、べつにログファイルじゃなくてもローテーションしたいものなら何でもローテーションできそうである。たとえば、バックアップを世代別に名前をつけて保存しておくとか。
シンタックスチェックと、動作チェック
sudo logrotate --debug /etc/logrotate.conf
実際に処理を行わず、記述内容に従って処理の予定・計画を表示する。
設定項目
マニュアルを見れば書いてある。 - man logrotate.conf
設定例。KVMの仮想マシンをバックアップする。
ローテーションするものは何でもいい。
ええんかこれ。って思うかもしれないけど。動くんだよねぇ。
仮想マシンのHDDローテーションしてやる。
/var/lib/libvirt/images/d02.qcow2.back { rotate 4 hourly missingok notifempty compress compresscmd /usr/bin/pigz compressext .gz prerotate virsh destroy d02 while [ -n "$(sudo virsh list | grep d02 )" ] ; do sleep 1 ; done cp /var/lib/libvirt/images/d02.qcow2 /var/lib/libvirt/images/d02.qcow2.back virsh start d02 endscript }
ログ・ローテーションで仮想HDDをバックアップ・ローテーション(世代別バックアップ)してみる
sudo logrotate --verbose --force /etc/logrotate.d/xxx-takuya-vm.conf
実行結果
running prerotate script Domain 'd02' is being shutdown Domain 'd02' started renaming /var/lib/libvirt/images/d02.qcow2.back to /var/lib/libvirt/images/d02.qcow2.back.1 compressing log with: /usr/bin/pigz
ファイルが作成された。
takuya@:~$ sudo ls -alt /var/lib/libvirt/images/ 合計 5275416 -rw-r--r-- 1 libvirt-qemu libvirt-qemu 1752039424 9月 5 22:37 d02.qcow2 drwxr-x--x 2 root libvirt-qemu 194 9月 5 22:32 . -rw-r--r-- 1 root root 582343243 9月 5 22:18 d02.qcow2.back.1.gz
なるほど、できなくはない。ログ・ローテーションは本当に最高ですね。
linux にKVMで仮想マシンを突っ込んだだけのときに、定期的にバックアップとって3世代バックアップを取っておいて、ついでにqcow2のメンテナンスとかできそうですね。
logrorotate しかない極限状態でなら役に立ちそう。ふつうの仮想マシンなら、python とかでSystemd Time units を書いたほうが確実だろうね。シャットダウン待ちとかローテーションとか設定を変数にしたいとか、いろいろやりたいことを調べるより、脳死で、書いた方がいい。
参考資料
https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/747logrotatecmd.html