それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rsyslog で受信したログもローテーションする。

ログをローテーションする

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

なるほど、できなくはない。ログ・ローテーションは本当に最高ですね。

linuxKVM仮想マシンを突っ込んだだけのときに、定期的にバックアップとって3世代バックアップを取っておいて、ついでにqcow2のメンテナンスとかできそうですね。

logrorotate しかない極限状態でなら役に立ちそう。ふつうの仮想マシンなら、python とかでSystemd Time units を書いたほうが確実だろうね。シャットダウン待ちとかローテーションとか設定を変数にしたいとか、いろいろやりたいことを調べるより、脳死で、書いた方がいい。

参考資料

https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/747logrotatecmd.html