ブログ

Armadillo-X1, Armadillo-IoT G3/G3L: ログファイルの容量制限をする方法

at_keitaro.takahashi
2018年9月3日 13時11分

Armadillo-X1, Armadillo-IoT G3/G3L(以下Armadillo)で、ログファイルの容量を制限する方法を紹介します。

概要

 ログファイルは、logrotateによって管理することができます。logrotateを利用すると、ログの周期や、 容量制限などを設定することが可能です。
 出荷状態のArmadilloソフトウェアでもlogrotateが動作していますが、運用状況により、ログファイルがストレージを圧迫する可能性があります。 logrotateはcronによって自動的に実行されており、デフォルトでは日ごとの実行となっています。そのため、ログファイルが1日よりも短い期間で大量に出力されると、logrotateによる管理が追いつかず、問題になる場合があります。
 例えば、Armadillo-IoTゲートウェイ G3 製品マニュアル「22.2.1. 保護機能の使用方法」 のようにoverlayfsを使用してeMMCの保護機能を使用した際、上記のようにログファイルが大量に生成されると、RAMを圧迫し、容量が不足する可能性があります。
 そこで、本記事では、logrotateの設定方法と、logrotateの実行間隔を短くする方法について解説します。

logrotateの設定方法

 cronによって実行されるlogrotateの設定ファイルは、/etc/logrotate.d/* 及び /etc/logrotate.conf です。 例として、/etc/logrotate.d/apt を見てみましょう。

/var/log/apt/term.log {
    rotate 12
    monthly
    compress
    missingok
    notifempty
}

/var/log/apt/history.log {
    rotate 12
    monthly
    compress
    missingok
    notifempty
}

 上記の/var/log/* はlogrotateの管理対象であるログファイルを表しています。

logrotateの主な設定の一覧

 logrotateにおける主な設定の一覧を以下に示します。

設定 説明
rotate rotateされたログファイルを保存する個数(古いログファイルをいくつ残すか)を設定する
compress rotateされたログファイルをgzipで圧縮して保存する
hourly, daily, weekly, monthly, yearly ログファイルがrotateされる周期を設定する
create rotateが行われたときに、新規ログファイルを生成する
missingok 対象のログファイルが存在しない場合でもエラーを発行せず、処理を続行する
notifempty 対象のログファイルが空の場合、rotateを行わない
size ログファイルがこの項目で設定したサイズ(バイト)よりも大きければdailyなどの周期に関係なくrotateを行う。k、M、G(キロ、メガ、ギガ)の接頭辞を利用することができる
minsize ログファイルが指定したサイズより大きく、かつdailyなどの周期の条件を満たしているときにrotateを行う

その他の設定については、logrotateのマニュアルページを参照してください。

[Armadillo]$ man logrotate

logrotateの設定例

 例として、/var/log/aaa.log というファイルに対し、
・1週間以上経過するとrotateを行う
・ファイルサイズが2メガバイトを超えたときにrotateを行う
・過去のログファイルを4世代分まで保管する
・過去のログファイルをgzipで圧縮する
という設定のlogrotateのファイル内容を以下に示します。

/var/log/aaa.log {
    weekly
    size 2M
    rotate 4
    compress
} 

 以上のように設定したファイルを /etc/logrotate.d/ に配置することで、cronにより自動実行されるlogrotateの実行対象となります。しかし、デフォルトでは、cronによるlogrotateの自動実行は1日に1回しか行われません。そのため、1日の間にログファイルのサイズが設定した値を超えてしまっても、1日が経過するまでlogrotateが実行されず、ログファイルが想定しないサイズになる可能性があります。
 そこで、以下のように、/etc 内のcron.dailyにあるlogrotateをcron.hourlyにコピーすることで、logrotateを1時間毎に実行させることができます。

[Armadillo]$ ls /etc/cron.daily/logrotate
/etc/cron.daily/logrotate
[Armadillo]$ cp /etc/cron.daily/logrotate /etc/cron.hourly/
[Armadillo]$ ls /etc/cron.hourly/logrotate
/etc/cron.hourly/logrotate

 また、logrotateを手動で実行するには、-f オプションをつけてlogrotateを実行します。

実行例

[Armadillo]$ logrotate -f /etc/logrotate.d/apt