Volumioのログをローテートする

何年もログの始末が放置されてたのでこの記事を書いたのですが、とたんに本家でほぼ似た内容(ログファイル名も変更があったこととローテート頻度が違う)で修正が入ったのでこの記事の前半はもはや存在意味が失われています。

お家の音楽再生にはRaspberry Pi Zero W+Volumioを使っている。SDカードが壊れたとか更新したら新しい版のバグで動かなくなったとかはあったけど、そういう突発的な事故以外は基本的には調子が良い。メンテナンスもほぼ不要なので「管理」もほぼ不要。
気に入らないのは、ログの処理が手抜きになっているので使い続けるとログでファイルシステムが溢れてしまうこと。家のRaspberry Pi Zero Wの環境だと/var/logは21MBしか割り当てられていないので使い方によっては数日程度で溢れることも。

Volumioの監視グラフ 1
Prometheus+Node Exporterで監視しているVolumioの状況。右下のグラフが気になる。(次)

Volumioの監視グラフ 2
Volumioを再起動して翌日からウェブラジオを5日以上連続視聴していたときのディスクスペースの監視グラフ。
紫色が /var/log の使用状況。5日で8%から24%まで16%増加している。つまり、このままこのウェブラジオの視聴というか再生を続けたら1ヶ月ほどで /var/log は溢れてしまうことになる。

Volumioでは幾つかのログが記録されるが、特に肥大し易いのは /var/log/volumio.log 。
このログファイルにはVolumioで操作した内容やそれに伴う処理がバカスカ書き込まれる。統計情報にも使えるので要らないというものではない。このログが適切に処理されずに放置されているのでファイルシステムが溢れる。以前はログがいっぱいになるとVolumioが動かなくなった記憶があるが、最近はそれで動かなくなるということは無いみたい。ただし、ログが追記できない状態のままになる。一応、Volumioを再起動するとログファイルは消えるので問題は解消されるのだが、正しくログを出力したければ、ある程度使い続けたら必ず再起動しなければならない。これはスマートじゃない。

VolumioはLinuxなので、システムのlogrotate(ログローテート)を使ってログファイルを管理すれば良いんじゃね?ということになるよね?
残念なことにVolumioではログローテート用の設定ファイルの一部は存在するようだけどlogrotateの実体が存在しない。
そこで、今回はログローテートのインストールと設定。

logrotateのインストール

$ apt-cache search logrotate              ←リポジトリに存在するlogrotateというキーワードを含むパッケージを検索
erlang-lager - logging framework for Erlang
logrotate - Log rotation utility             ←これをインストールしたい

パッケージにlogtotateが含まれるようなのでそれをインストールする。

$ sudo apt install logrotate

設定

logrotateのメインの設定ファイルは /etc/logrotate.conf だが、 /etc/logrotate.d ディレクトリの中の設定ファイルもインクルードされるということになっているので、 /etc/logrotate.conf は触らず、 /etc/logratate.d の下にvolumioというファイルを作成してそこに設定を書く。

/etc/logrotate.d/volumio (新規作成)
1
2
3
4
5
6
7
8
/var/log/volumio.log {
  daily            #←毎日ローテートする
  missingok            #←ファイルが無くてもエラーにしない
  rotate 1             #←ローテートする世代数 この場合は1世代だけ残す
  copytruncate         #←新しいファイルを作るのではなく既存ファイルを空にする
  nocompress           #←ローテーションしたファイルを圧縮しない
  notifempty           #←ログが空ならローテートしない
}
$ sudo logrotate -dv /etc/logrotate.conf

確認の実行でvolumioのログについてエラーにならないこと。

手動実行

$ sudo logrotate /etc/logrotate.conf

実際にログがローテートするので注意。
-fオプションを付けて強制実行してみるのもアリ。

確認

$ cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/dpkg.log" 2019-9-23-6:0:0
"/var/log/apt/term.log" 2019-9-23-6:0:0
"/var/log/apt/history.log" 2019-9-23-6:0:0
"/var/log/samba/log.smbd" 2019-9-23-6:0:0
"/var/log/alternatives.log" 2019-9-23-6:0:0
"/var/log/wtmp" 2019-9-24-0:26:42
"/var/log/volumio.log" 2019-9-24-0:26:42         ←volumio.logがあることを確認
"/var/log/btmp" 2019-9-24-0:26:42
"/var/log/exim4/paniclog" 2019-9-23-6:0:0
"/var/log/samba/log.nmbd" 2019-9-23-6:0:0
"/var/log/exim4/rejectlog" 2019-9-23-6:0:0
"/var/log/exim4/mainlog" 2019-9-23-6:0:0
"/var/log/samba/log.winbindd" 2019-9-23-6:0:0

ログのあるディレクトリを見てみる。

$ ls -l /var/log
total 44
-rw-r--r-- 1 root    root        5560 Sep 24 00:53 boot.log
-rw-rw---- 1 root    utmp           0 Sep 24 01:22 btmp
-rw------- 1 root    utmp           0 Sep 24 00:53 btmp.1
-rw-r--r-- 1 root    root         428 Sep 24 01:15 mpd.log
-rw-r--r-- 1 volumio volumio        0 Sep 24 01:22 volumio.log          ←volumio.logは空になる
-rw-r--r-- 1 volumio volumio 11526898 Sep 24 01:22 volumio.log.1       ←volumio.logの1世代前が作られている
-rw-rw-r-- 1 root    utmp           0 Sep 24 01:22 wtmp
-rw-rw-r-- 1 root    utmp        1920 Sep 24 00:57 wtmp.1

volumioを操作(楽曲再生・停止など)してから再度ファイルサイズを確認する。

$ ls -l /var/log
total 44
-rw-r--r-- 1 root    root        5560 Sep 24 00:53 boot.log
-rw-rw---- 1 root    utmp           0 Sep 24 01:22 btmp
-rw------- 1 root    utmp           0 Sep 24 00:53 btmp.1
-rw-r--r-- 1 root    root         428 Sep 24 01:15 mpd.log
-rw-r--r-- 1 volumio volumio        15031 Sep 24 01:22 volumio.log          ←volumio.logのファイルサイズが増えること
-rw-r--r-- 1 volumio volumio 11526898 Sep 24 01:22 volumio.log.1
-rw-rw-r-- 1 root    utmp           0 Sep 24 01:22 wtmp
-rw-rw-r-- 1 root    utmp        1920 Sep 24 00:57 wtmp.1

ログをローテートした後に/var/log/volumio.logにログが書き込まれなければ失敗。これだけはしっかり確認した方が良いでしょう。
一応、logrotateの設定でcopytruncateを指定しているので正しく動作する筈。

自動実行

手動で実行してログがローテートできても、これが毎日自動的に行われなくては意味がない。
でも、Volumioのlogrotateパッケージはlogrotateをサービスとして登録してくれない。

参考までにarmbianのlogrotateサービス用ファイルを以下。(2つ)
/lib/systemd/system/logrotate.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
#  details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
#  no ProtectHome for userdir logs
#  no PrivateNetwork for mail deliviery
#  no ProtectKernelTunables for working SELinux with systemd older than 235
#  no MemoryDenyWriteExecute for gzip on i686
PrivateDevices=true
PrivateTmp=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true
/lib/systemd/system/logrotate.timer
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=12h
Persistent=true

[Install]
WantedBy=timers.target

これで systemctl enable logrotate とでもすればよいのでしょうか?(試していない)
ただ、cronをインストールしていれば、logrotateをサービスとして登録する必要は無いので、今回はcronを使うことに。
なお、Volumioではcronも標準ではインストールされていないので別途インストールが必要。

[参考] cronのインストール

$ sudo apt-cache search cron    ←リポジトリにある「cron」の文字列が含まれるパッケージを検索
anacron - cron-like program that doesn't go by time
python-apscheduler - In-process task scheduler with Cron-like capabilities
python3-apscheduler - In-process task scheduler with Cron-like capabilities
apticron - Simple tool to mail about pending package updates - cron version
apticron-systemd - Simple tool to mail about pending package updates - systemd version
bcron - Bruce cron system
cron - process scheduling daemon                                       ←これをインストールする
cron-apt - automatic update of packages using apt-get
cron-deja-vu - filter for recurring cron mails
cronic - Bash script for wrapping cron jobs to prevent excess email sending
cronolog - Logfile rotator for web servers
後略

$ sudo apt install cron        ←cronのインストール 依存パッケージについて何か聞かれたら y 
/etc/crontab (1行追加)
0  0  * * *   root    logrotate /etc/logrotate.conf  >/dev/null 2>&1

毎日0:00にログローテートを実行する場合。

少なくとも日付が変わった後に正しくログローテートが実行されていることを確認する。

Volumioのタイムゾーン設定を変更していない場合は、初期値はUTCなので0:00のイベントは日本時間では9:00に実行されます。 タイムゾーンの変更は以下。
$ sudo  dpkg-reconfigure tzdata

少し待たされてメニューが2画面表示されるのでそれぞれAsiaとTokyoを選択する。

Current default time zone: 'Asia/Tokyo'
Local time is now:      Thu Sep 26 20:10:24 JST 2019.
Universal Time is now:  Thu Sep 26 11:10:24 UTC 2019.

こんな感じ。
一応、cat /etc/timezoneで内容が Asia/Tokyo になっていることを確認しておく。
Volumioのシステムを再起動する。

$ ls -l /var/log
total 380
-rw-r--r-- 1 volumio volumio    423 Sep 28 00:23 albumart.log
-rw-r--r-- 1 root    root      5692 Sep 27 09:56 boot.log
-rw------- 1 root    utmp       384 Sep 28 10:27 btmp
-rw-r--r-- 1 root    root       670 Sep 27 10:49 mpd.log
-rw-r--r-- 1 volumio volumio 311037 Sep 28 10:26 volumio.log
-rw-r--r-- 1 volumio volumio 950230 Sep 28 00:00 volumio.log.1   ←ファイルの時刻が00:00ならOK
-rw-rw-r-- 1 root    utmp      2688 Sep 28 10:27 wtmp

Volumioの監視グラフ 3
ログローテートを仕掛けてVolumioでウェブラジオを1週間連続再生したときのファイルシステムの使用状況グラフ。(7日間)
毎日0時に/var/logを示すピンクのグラフが下がって鋸刃の形になっている。Volumio.logを非圧縮で1世代残しているので容量が下がってもゼロにはならない。およそ半分に下がるのでこれで正常。

おまけ
Volumioのサーバは以前から帯域制限をしているので転送速度がとても遅かったが、最近は遅いだけでなく繋がりにくい。パッケージのインストールもVolumioのサーバーに接続できなくて失敗することがある。失敗した場合は成功するまで繰り返す。

関連記事: