日々溜まっていくログファイルを定期的に自動で削除する(Linux編)


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

以前書いた記事「LinuxOSにログインしたユーザーの操作ログを自動記録してみる」の続きです。LinuxOSで操作ログを取得する構築をしましたが、いくつか欠点がありました。

 

欠点の一つは"ログファイルが溜まり続ける"です。

 

ログがたまり続けると、ストレージを圧迫したり、運用監視のパフォーマンスを下げたり、と望ましくない状況を招きます。

 

今回の記事では、日々溜まっていくログファイルを定期的に自動で削除する構築を紹介します。

 

 

ログファイルを自動で削除しよう

LinuxOSではログファイルを定期的に自動で削除していく方法はいくつかあります。わたしは今回、"cron"と"find"の組み合わせを選択しました。

 

 

■cronとは

cronについて調べてみると、

 

cronは/etc/passwdにあるアカウントをファイル名に持つcrontabファイルを/var/cron/tabsから探し、見つけたcrontabファイルをメモリに読み込む。またcronは/etc/crontabも見る(このファイルのフォーマットは少々異なっている:crontab(5)を参照)。

 

cronは1分ごとに起きて、読み込まれたcrontabファイルを評価し、それぞれのコマンドを今起動すべきかどうかチェックする。コマンドを実行すると、全ての出力をcrontabファイルの所有者にメールする(またはMAILTO環境変数がcrontabファイルにあれば、そこで指定されたユーザーに送る)。(linuxjm.osdnより)

 

 

cronは定期的にcrotabファイルを参照し、書かれている内容にしたがって実行するということですね。crotabファイルの例は、以下です。

 

# (/etc/passwd の指定に関らず) コマンド実行に /bin/sh を使用する。
SHELL=/bin/sh
# (この crontab の所有者に関らず) あらゆる出力を `paul' にメールする。
MAILTO=paul
#
# 毎日、日付変更の 5 分後に実行する
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# 毎月初日の 2:15pm に実行する -- 出力は paul にメールされる
15 14 1 * *     $HOME/bin/monthly
# 平日の午後 10 時に実行してジョーを心配させる
0 22 * * 1-5 mail -s "午後10時だ" joe%ジョー、%%お前の子どもはどこだい?%
23 0-23/2 * * * echo "毎日 0,2,4..時 23 分に実行する"
5 4 * * sun     echo "日曜 4 時 5 分に実行する"

 

 

■findとは

findはディレクトリ階層内のファイル検索するコマンドです。

 

findは、指定された検索開始ポイント(starting-point)を基準にして、ディレクトリツリーを検索します。そして優先規則に従って(「オペレーター」のセクション参照)、指定された式(expression)を左から右の順で評価していきます。

 

たとえば、and演算で左辺がfalseになった場合や、or演算で左辺がtrueになった場合のように、式の結果が確定すると、findは次のファイル名を処理対象とします。検索開始ポイントが指定されていない場合は、`.’が指定されたものとみなします。(linuxjm.osdnより)

 

findでは"-delete"オプションを指定することで、検索したファイルを削除してくれます。

 

 

■構築

ログファイルを定期的に自動で削除する構築を行っていきます。

 

 

↓rootで作業します。

 

[ec2-user@ip-172-31-22-63 ~]#sudo su -

 

↓削除対象ファイルがあるディレクトリの中を確認しておきます。

 

[root@ip-172-31-22-63 ~]# ll /var/log/scripts/opelog/
total 80
-rw-rw-r-- 1 ec2-user ec2-user   708 Feb 17 07:23 ec2-user_202302170723.log
-rw-rw-r-- 1 ec2-user ec2-user 43429 Feb 17 07:41 ec2-user_202302170724.log
-rw-rw-r-- 1 ec2-user ec2-user  2392 Feb 17 07:43 ec2-user_202302170742.log
-rw-rw-r-- 1 ec2-user ec2-user   703 Feb 17 07:45 ec2-user_202302170745.log
-rw-rw-r-- 1 ec2-user ec2-user 22241 Feb 17 07:54 ec2-user_202302170748.log

 

↓"/etc/crontab"ファイルを編集します。

 

[root@ip-172-31-22-63 ~]# vi /etc/crontab
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

 

↓"/etc/crontab"ファイルの最終行に、以下のスクリプトを挿入しましょう。

 

55 7 * * * root /bin/find /var/log/scripts/opelog/ -name '*.log' -mmin +10 -delete

 

挿入するスクリプトは、毎日7時55分にroot権限で/var/log/scripts/opelog/ディレクトリを対象にfindを実行し、".log"と名前が付いたファイルを見つけ、そのファイルの最終更新時間が10分以上前なら削除してくれます。

 

↓最終行に追加すると、

 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
55 7 * * * root /bin/find /var/log/scripts/opelog/ -name '*.log' -mmin +10 -delete

 

↓追記が完了しましたら、ファイルを保存して、cronを再起動します。

 

ESC
:wq
[root@ip-172-31-22-63 ~]# systemctl restart crond

 

構築は以上です。

 

※1,実行時間を変えたい場合は、こちらを参照してください。
※2,削除対象のファイルを変更したい場合は、こちらを参照してください。

 

 

■動作確認

削除される前のディレクトリの状況を確認します。

 

[root@ip-172-31-22-63 ~]# ll /var/log/scripts/opelog/
total 80
-rw-rw-r-- 1 ec2-user ec2-user   708 Feb 17 07:23 ec2-user_202302170723.log
-rw-rw-r-- 1 ec2-user ec2-user 43429 Feb 17 07:41 ec2-user_202302170724.log
-rw-rw-r-- 1 ec2-user ec2-user  2392 Feb 17 07:43 ec2-user_202302170742.log
-rw-rw-r-- 1 ec2-user ec2-user   703 Feb 17 07:45 ec2-user_202302170745.log
-rw-rw-r-- 1 ec2-user ec2-user 22241 Feb 17 07:54 ec2-user_202302170748.log

 

↓7時55分になったので、ディレクトリを見てみると、

 

[root@ip-172-31-22-63 ~]# ll /var/log/scripts/opelog/
total 28
-rw-rw-r-- 1 ec2-user ec2-user   703 Feb 17 07:45 ec2-user_202302170745.log
-rw-rw-r-- 1 ec2-user ec2-user 22718 Feb 17 08:03 ec2-user_202302170748.log

 

ファイルが5つから2つに減っていますね。7時55分にcronデーモンが動き、ファイル最終更新時間が現時刻より10分以前のファイルが消されたことが確認できました。

 

 

ちなみにわたしは最初、/etc/crontabファイルのuser-nameフィールドをec2-userで記述していました。

 

55 7 * * * ec2-user /bin/find /var/log/scripts/opelog/ -name '*.log' -mmin +10 -delete

 

この場合、"/var/log/scripts/opelog/"ディレクトリはrootにしか読み取り権限を与えていないからなのかログファイルが削除されず、以下のメールが来ていました。

 

From ec2-user@ip-172-31-22-63.ap-southeast-1.compute.internal  Fri Feb 17 06:40:01 2023
Return-Path: <ec2-user@ip-172-31-22-63.ap-southeast-1.compute.internal>
X-Original-To: root
Delivered-To: root@ip-172-31-22-63.ap-southeast-1.compute.internal
Received: by ip-172-31-22-63.localdomain (Postfix, from userid 1000)
        id 450BD858A23; Fri, 17 Feb 2023 06:40:01 +0000 (UTC)
From: "(Cron Daemon)" <ec2-user@ip-172-31-22-63.ap-southeast-1.compute.internal>
To: root@ip-172-31-22-63.ap-southeast-1.compute.internal
Subject: Cron <ec2-user@ip-172-31-22-63> /bin/find /var/log/scripts/opelog/ -name '*.log' -mmin +10 -delete
Content-Type: text/plain; charset=ANSI_X3.4-1968
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=18>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/1000>
X-Cron-Env: <SHELL=/bin/bash>
X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin>
X-Cron-Env: <MAILTO=root>
X-Cron-Env: <HOME=/home/ec2-user>
X-Cron-Env: <LOGNAME=ec2-user>
X-Cron-Env: <USER=ec2-user>
Message-Id: <20230217064001.450BD858A23@ip-172-31-22-63.ap-southeast-1.compute.internal>
Date: Fri, 17 Feb 2023 06:40:01 +0000 (UTC)

/bin/find: '/var/log/scripts/opelog/': Permission denied

 

 

まとめ:日々溜まっていくログファイルを定期的に自動で削除する

プロジェクトやサービスを円滑に運用していくためにはログが欠かせません。しかし、必要以上に溜まったログファイルは、運用のパフォーマンスを下げます。

 

定期的に自動で削除し、パフォーマンスを維持していきましょう。

 

 

参考リンク:cron,crontab,find

 

 

↓ほかの協栄情報メンバーもLinuxに関する記事を公開しています。ぜひ参考にしてみてください。

 

■Linuxコマンド紹介-「grep」(dapeng)
https://cloud5.jp/linux-grep/

 

■AWS EC2 (Redhat linux 8)にSSHログインユーザの追加手順(小林 剛)
https://cloud5.jp/aws-ec2-redhat-linux-8-ssh/

 

■EC2(RHEL)でSELinuxを無効化するハンズオン(INAMURA)
https://cloud5.jp/invalid-selinux-on-ec2/

 

Last modified: 2023-02-25

Author