はじめに
CPU使用率が高いプロセスを特定するために、topコマンドの出力を定期的に取得したい。
-
以下の設定ファイルを作成していきます。
-
topコマンドの出力を保存する為のログ・ファイル
/var/log/toplog/toplog
-
topコマンドを定期的に実行するcronの設定ファイル
/etc/cron.d/toplog
-
topコマンドの出力ログを定期的にローテションする為の設定ファイル
/etc/logrotate.d/toplog
-
設定手順 1. 「toplog」ディレクトリの作成
実際に、topコマンドのログを保存していくディレクトリを作成します。
mkdir /var/log/toplog/
設定手順 2. cronファイルの作成
cron.dディレクトリ配下に、クローンを実行する設定ファイル「toplog」を新規作成します。
vi /etc/cron.d/toplog
*/5 * * * * root /bin/date >> /var/log/toplog/toplog; /usr/bin/top -b -n 10 -d 30 >> /var/log/toplog/toplog
- 設定内容について
- topコマンドを30秒間隔で10回実行する(topコマンドを 5分間実行する)ことを、cronで5分毎に実行する。
- topコマンド実行前に、dateコマンドで日付取得。
- ログの出力先ファイルは、「/var/log/toplog/toplog」
設定手順 3. ローテション設定ファイルの作成
/var/log/toplog/ディレクトリ配下に作成されるログファイルのtoplogを、ローテションする設定を作成します。
vi /etc/logrotate.d/toplog
/var/log/toplog/toplog {
missingok
dateformat _%Y-%m-%d
dateext
daily
compress
rotate 30
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
-
各項目の設定内容については、以下をご参考ください。
記載内容 効果 missingok ログファイルが存在しなくてもエラーを出さずに処理を続行する dateformat _%Y-%m-%d ファイルをローテションする際に、古いファイルの末尾に付ける日付のフォーマットを設定する。今回の場合は、ファイル末尾が例えば「_2020-02-02」の形になる。 dateext ファイルをローテションする際に、古いファイルの末尾に日付8桁(-YYYYMMDD)を付ける。 daily 日次でローテションを実行。週次でローテション を設定する場合は、「weekly」。月次でローテションを設 定する場合、「monthly」。 compress ローテションしたファイルをgzで圧縮。(解凍 は、gunzipコマンド) rotate 30 保存する世代数を指定する。今回の例では、 30世代(約1か月分)を保存している。 postrotate ~ endscript ローテション実行後に~内 のコマンドを実行する。 /bin/kill -HUP cat /var/run/syslogd.pid 2> / dev/null
2> /dev/nulltrue ローテート後に syslogを再起動する。(この設定はコピペでOK。) -
上記設定内容の注意点
-
「dateext」無しで「deteformat」だけ指定すると、 dateformatが効かないので注意。
-
「missingok」が無いと、ファイルがない場合にエラー を吐いて終了する
-
「cat /var/run/syslogd.pid 2> /dev/null` 2> / dev/null || true」が無いとローテション後のログファ イルに書き込めなくなることがあるらしい。
-
以下のように米印でコメントアウト行を追加することも できるが、上手くローテションされない原因になる場合も あるので省いたほうが無難。
/var/log/toplog/toplog { daily # コメント行 compress # コメント行 rotate 30 # コメント行 }
-
設定手順 4. ログ・ローテション実行の設定確認
-
ログ・ローテションのテスト(ドライラン)を実行する。 (実際にはログのローテションはされません。)
logrotate -dv /etc/logrotate.d/toplog
-
成功例の出力
reading config file /etc/logrotate.d/toplog Allocating hash table for state file, size 15360 B Handling 1 logs rotating pattern: /var/log/toplog/toplog after 1 days (30 rotations) empty log files are rotated, old logs are removed considering log /var/log/toplog/toplog log does not need rotating (log has been already rotated)
-
エラーになっている例
(以下のエラーは、rotate 項目の後にコメントアウト文言を入れた為エラーになっている。)
reading config file /etc/logrotate.d/toplog error: /etc/logrotate.d/toplog:7 bad rotation count '30 # 30世代(約1か月分)保存' error: found error in /var/log/toplog/toplog , skipping removing last 1 log configs Allocating hash table for state file, size 15360 B Handling 0 logs
-
その他備考:
- ログを強制的にローテションする方法。
logrotate -f /etc/logrotate.d/toplog
- ログ保存ディレクトリにローテションされたログファイルが作成されればOK.
[root@centos]# ls -l /var/log/toplog/ total 24 -rw-r--r-- 1 root root 23596 Apr 6 16:49 toplog_2020-04-06.gz
- なお、上記のように「logrotate -f」コマンド実行時にlogrotate.d配下のファイルを直接指定して実行した場合、logrotate.confに書いた設定内容は反映されません。
- ログ保存ディレクトリにローテションされたログファイルが作成されればOK.
ローテションが上手くいかないときの対処
ローテションが上手くいかない原因は、様々な要因が考えられる為、ローテションの動作を理解して各設定を確認していきましょう。
ローテションを実行するlogrotateコマンドは、cronから起動され、順次設定ファイルが読み込まれていきます。
-
動作1: cronのlogrotegが実行される。
対象: /etc/cron.daily/logrotate -
動作2: logrotateの設定ファイルが読み込まれる
対象: /etc/logrotate.conf -
動作3: /etc/logrotate.conf が各設定ファイルを読み込む
対象: /etc/logrotate.d/ 配下にある各ファイル
ローテーションが設定どおりに動作しているかをログから確認できます。
-
cronのログ
/var/log/cron -
最後にログローテションが実行された日時が記載されているログ
/var/lib/logrotate/logrotate.status
(あるいは、/var/lib/logrotate.status)
実際にあった原因・解決策
- /etc/logrotate.confの設定ファイルが無かった/消されていた。
- logrotateのプロセスが残っていた。
- /etc/logrotate.d/ 配下にある各ログ個別の設定ファイルに全角文字列が入っていた。あるいは、全角スペースが入っていた。
- 一度、「logrotate -f」コマンドを使って強制的にローテションを行ったら次回から正常に動作した。
参考サイト
https://users.miraclelinux.com/support/?q=node/218
https://qiita.com/Esfahan/items/a8058f1eb593170855a1
https://qiita.com/zom/items/c72c7bac63462225971b
https://open-groove.net/linux/logrotate-test/
https://www.atmarkit.co.jp/flinux/rensai/linuxtips/747logrotatecmd.html