Linuxログの管理:溜まり続けるログファイルを自動で削除する方法

Linux,Tech

ブログ運営者
さいとう

閲覧いただきありがとうございます!"さいとう"と申します。わたしは異業種・未経験からIT業界に転職し、現在インフラエンジニアとしてクラウド環境の設計や構築・運用の支援を行っています。


以前書いた記事「Linuxにログインしたユーザーの操作を完全記録!効率的なログ取得方法を徹底解説」の続編となる今回の記事では、操作ログの記録に関するさらなる改善について紹介します。


前回の記事では、LinuxOSでユーザーの操作ログを自動的に取得する方法を構築しましたが、実際に運用してみるといくつかの欠点が浮かび上がりました。


その中でも特に大きな問題が“ログファイルが溜まり続ける"という点です。操作ログは日々増え続け、気づかないうちに膨大な量に達することがあります。


ログが大量に溜まると、ストレージの容量を圧迫し、他のシステムリソースを消費するだけでなく、運用監視のパフォーマンスにも悪影響を及ぼす可能性があります。特に、ログを長期間にわたって保存し続ける場合、その影響はより顕著になります。


今回の記事では、こうした問題に対処するため、ログファイルを定期的に自動で削除する方法を紹介します。この自動削除の仕組みを導入することで、ストレージの無駄遣いを防ぎ、運用のパフォーマンスを向上させることができます。また、システム管理者にとって、ログ管理はセキュリティやトラブルシューティングにも重要な役割を果たすため、適切な管理が求められます。


この記事を通じて、ログファイルの自動管理の手法を理解し、システム運用をより効率的にするためのヒントを得ていただければ幸いです。


↓【PR】今回参考にした書籍です。発行年は古いですが、考え方やLinuxとの向き合い方がわかる良書です。



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

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

↓【PR】今回参考にした書籍です。発行年は古いですが、考え方やLinuxとの向き合い方がわかる良書です。