Linuxサーバーを運用していると、こんな警告を見ることがあります。
「ディスク使用率が90%を超えています」
原因を調べてみると、/var/log
ディレクトリが数GBにも膨れ上がっていた…
「ログファイルって削除していいの?」
「どうやって古いログだけを安全に消すの?」
「自動的に削除する方法はないの?」
この記事では、Linuxの古いログファイルを削除する方法について、初心者の方にも分かりやすく、基礎から実践的なテクニックまで詳しく解説していきます。
ログファイルとは?システムの「日記帳」
ログファイルの役割
ログファイルとは、システムやアプリケーションが動作の記録を残すファイルです。
いつ何が起きたか、エラーが発生したか、誰がアクセスしたかなど、様々な情報が記録されています。
簡単に言えば、システムの「日記帳」や「航海日誌」のようなものだと考えてください。
なぜログが増え続けるのか
システムが動作している限り、ログは増え続けます。
ログが増える要因:
- システムの起動・停止
- ユーザーのログイン・ログアウト
- アプリケーションの動作
- エラーや警告
- ネットワーク通信
- セキュリティイベント
特に、Webサーバーやデータベースサーバーでは、アクセスが多いほどログも大量に生成されます。
ログを削除する理由
放置すると、以下のような問題が発生します:
ディスク容量の圧迫:
ログファイルが肥大化して、ディスクがいっぱいになります。
パフォーマンスの低下:
ディスクの空き容量が不足すると、システム全体が遅くなります。
バックアップの肥大化:
不要なログまでバックアップされ、時間とストレージを無駄に消費します。
主要なログファイルの場所
どこにログが保存されているか理解しましょう。
/var/logディレクトリ
ほとんどのログファイルは、/var/log
ディレクトリに保存されます。
確認方法:
ls -lh /var/log/
主要なログファイル一覧
システム全般:
/var/log/syslog
:システム全般のログ(Debian/Ubuntu系)/var/log/messages
:システム全般のログ(RedHat系)/var/log/kern.log
:カーネルログ
認証関連:
/var/log/auth.log
:認証ログ(Debian/Ubuntu系)/var/log/secure
:認証ログ(RedHat系)
サービス別:
/var/log/apache2/
:Apacheウェブサーバー/var/log/nginx/
:Nginxウェブサーバー/var/log/mysql/
:MySQLデータベース/var/log/ufw.log
:UFWファイアウォール
systemd関連:
/var/log/journal/
:systemdのジャーナルログ
ログファイルのサイズ確認
特定のディレクトリの合計サイズ:
sudo du -sh /var/log/
各ファイルのサイズを一覧表示:
sudo du -h /var/log/ | sort -h
サイズ順にソートされて表示されます。
大きなファイルトップ10:
sudo du -h /var/log/ | sort -rh | head -10
古いログを手動で削除する方法
基本的な削除方法を見ていきましょう。
ログファイルを直接削除
特定のファイルを削除:
sudo rm /var/log/syslog.1
sudo rm /var/log/syslog.2.gz
注意点:
- 現在使用中のログファイル(.1や.gzが付いていないもの)は削除しない
- 削除前に本当に不要か確認する
- バックアップを取っておくと安全
圧縮されたログだけを削除
拡張子が.gzのファイルをすべて削除:
sudo find /var/log/ -type f -name "*.gz" -delete
圧縮されているログは古いものなので、比較的安全に削除できます。
一定期間より古いログを削除
7日以上前のログを削除:
sudo find /var/log/ -type f -name "*.log.*" -mtime +7 -delete
-mtime +7
:7日より前に変更されたファイル-delete
:削除を実行
30日以上前の圧縮ログを削除:
sudo find /var/log/ -type f -name "*.gz" -mtime +30 -delete
削除前にプレビュー
実際に削除する前に、対象ファイルを確認しましょう。
sudo find /var/log/ -type f -name "*.gz" -mtime +30
-delete
を付けずに実行すれば、削除されるファイルの一覧が表示されます。
ログファイルを空にする(削除せずクリア)
現在使用中のログファイルを削除すると、問題が起きることがあります。
そんな時は、内容だけを消す方法が有効です。
sudo truncate -s 0 /var/log/syslog
または:
sudo > /var/log/syslog
ファイル自体は残るため、アプリケーションは正常に書き込みを続けられます。
logrotate:自動的にログをローテーションするツール
手動削除は面倒なので、自動化しましょう。
logrotateとは
logrotateは、ログファイルを自動的にローテーション(切り替え)するツールです。
ローテーションの流れ:
1. 現在のログファイル(syslog)をリネーム(syslog.1)
2. 古いログを順番にずらす(syslog.1 → syslog.2)
3. 最も古いログを削除
4. 新しい空のログファイルを作成
5. 必要に応じて圧縮(.gz)
logrotateの設定ファイル
メイン設定ファイル:
/etc/logrotate.conf
個別設定ファイル:
/etc/logrotate.d/
このディレクトリ内に、各サービス用の設定ファイルがあります。
logrotateの基本設定例
例:/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily # 毎日ローテーション
rotate 7 # 7世代保持(7日分)
compress # 古いログを圧縮
delaycompress # 最新の世代は圧縮しない
missingok # ファイルがなくてもエラーにしない
notifempty # 空のログはローテーションしない
create 0640 www-data www-data # 新しいファイルの権限とオーナー
}
主要なオプション:
ローテーション頻度:
daily
:毎日weekly
:毎週monthly
:毎月
保持世代数:
rotate 7
:7世代保持(それより古いものは削除)
圧縮:
compress
:古いログを圧縮nocompress
:圧縮しないdelaycompress
:最新の世代は圧縮しない
サイズベース:
size 100M
:100MBに達したらローテーションmaxsize 1G
:1GBを超えたら強制的にローテーション
実用的な設定例
Apacheのログ(30日保持):
/var/log/apache2/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
大容量ログ(サイズベース):
/var/log/application/*.log {
size 100M
rotate 5
compress
missingok
notifempty
create 0644 appuser appuser
}
logrotateの手動実行
設定を変更した後、テストしたい場合:
ドライラン(実際には実行しない):
sudo logrotate -d /etc/logrotate.conf
強制的に実行:
sudo logrotate -f /etc/logrotate.conf
特定の設定だけ実行:
sudo logrotate /etc/logrotate.d/apache2
logrotateの動作確認
状態ファイルを確認:
cat /var/lib/logrotate/status
各ログファイルの最終ローテーション日時が記録されています。
systemdジャーナルログの管理
systemdが管理するログは、特別な方法で扱います。
journalctlでのログ確認
すべてのログを表示:
sudo journalctl
ディスク使用量を確認:
sudo journalctl --disk-usage
ジャーナルログの削除
時間指定で削除:
# 2日より古いログを削除
sudo journalctl --vacuum-time=2d
# 1週間より古いログを削除
sudo journalctl --vacuum-time=7d
# 1ヶ月より古いログを削除
sudo journalctl --vacuum-time=1month
サイズ指定で削除:
# 100MB以下になるまで削除
sudo journalctl --vacuum-size=100M
# 1GB以下になるまで削除
sudo journalctl --vacuum-size=1G
世代数指定で削除:
# 最新5ファイルだけ残して削除
sudo journalctl --vacuum-files=5
ジャーナルログの自動削除設定
設定ファイル:
sudo nano /etc/systemd/journald.conf
推奨設定例:
[Journal]
SystemMaxUse=500M # 最大500MBまで使用
SystemKeepFree=1G # 常に1GB以上の空きを確保
MaxRetentionSec=2week # 2週間より古いログを削除
設定を反映:
sudo systemctl restart systemd-journald
ログ削除のベストプラクティス
安全で効果的なログ管理の方法です。
削除前の確認事項
1. 重要なログは保管しておく
セキュリティインシデントの調査などに必要になるかもしれません。
# バックアップを取る
sudo tar -czf logs_backup_$(date +%Y%m%d).tar.gz /var/log/
2. 法的要件を確認
業界や地域によっては、一定期間のログ保持が義務付けられている場合があります。
3. 現在使用中のログは削除しない
番号や拡張子が付いていない現在のログファイルは、削除ではなくtruncate
で空にします。
推奨されるローテーション設定
一般的なサーバー:
- システムログ:30日保持
- アプリケーションログ:7〜14日保持
- アクセスログ:14〜30日保持
- エラーログ:90日保持
ストレージに余裕がない場合:
- システムログ:7日保持
- アプリケーションログ:3日保持
- 圧縮を有効にする
定期的なメンテナンス
月次タスク:
# ディスク使用量をチェック
df -h
# ログの使用量をチェック
sudo du -sh /var/log/
# 非常に古い手動作成ファイルを探す
sudo find /var/log/ -type f -mtime +90
cronでの自動化
週次でクリーンアップ:
sudo crontab -e
以下を追加:
# 毎週日曜日の深夜2時に実行
0 2 * * 0 find /var/log/ -type f -name "*.gz" -mtime +30 -delete
トラブルシューティング
ログ削除に関する問題の解決方法です。
ログを削除してもディスク容量が増えない
原因:
削除したファイルが、まだプロセスに開かれています。
確認方法:
sudo lsof | grep deleted
対処法:
関連サービスを再起動します。
sudo systemctl restart apache2
# または
sudo systemctl restart nginx
logrotateが動作していない
原因1:cronが動作していない
確認方法:
sudo systemctl status cron
対処法:
sudo systemctl start cron
sudo systemctl enable cron
原因2:設定ファイルに文法エラー
確認方法:
sudo logrotate -d /etc/logrotate.conf
エラーメッセージを確認します。
誤って重要なログを削除してしまった
対処法:
バックアップがあれば復元します。
バックアップがない場合、削除直後であれば、一部のデータ復旧ツールで回復できる可能性があります。
sudo apt install extundelete
ただし、確実に復旧できるとは限りません。
予防策:
定期的にバックアップを取る習慣をつけましょう。
ログ管理の自動化スクリプト
実用的なスクリプト例です。
ログクリーンアップスクリプト
#!/bin/bash
# ログディレクトリ
LOG_DIR="/var/log"
# 保持日数
KEEP_DAYS=30
echo "=== ログクリーンアップ開始 ==="
echo "日時: $(date)"
echo ""
# 削除前のサイズ
BEFORE=$(du -sh $LOG_DIR | awk '{print $1}')
echo "削除前のサイズ: $BEFORE"
# 古い圧縮ログを削除
echo "古い圧縮ログを削除中..."
find $LOG_DIR -type f -name "*.gz" -mtime +$KEEP_DAYS -delete
# 古い番号付きログを削除
echo "古い番号付きログを削除中..."
find $LOG_DIR -type f -name "*.log.[0-9]*" -mtime +$KEEP_DAYS -delete
# systemdジャーナルをクリーンアップ
echo "systemdジャーナルをクリーンアップ中..."
journalctl --vacuum-time=${KEEP_DAYS}d
# 削除後のサイズ
AFTER=$(du -sh $LOG_DIR | awk '{print $1}')
echo ""
echo "削除後のサイズ: $AFTER"
echo "=== クリーンアップ完了 ==="
使い方:
- ファイルに保存:
sudo nano /usr/local/bin/cleanup_logs.sh
- 実行権限を付与:
sudo chmod +x /usr/local/bin/cleanup_logs.sh
- 実行:
sudo /usr/local/bin/cleanup_logs.sh
cronに登録
sudo crontab -e
毎週日曜日の深夜3時に実行:
0 3 * * 0 /usr/local/bin/cleanup_logs.sh >> /var/log/cleanup.log 2>&1
監視とアラート
ディスク容量を監視して、問題を早期発見しましょう。
ディスク使用率の監視スクリプト
#!/bin/bash
THRESHOLD=80
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
echo "警告: ディスク使用率が ${USAGE}% です" | mail -s "Disk Alert" admin@example.com
fi
簡易的な監視
# 使用率をチェック
df -h | grep -E "Filesystem|/$"
# ログディレクトリのサイズをチェック
du -sh /var/log/
まとめ:定期的なログ管理でシステムを健全に保とう
Linux古いログの削除方法について、重要なポイントをおさらいしましょう。
ログファイルの主な場所:
/var/log/ # ほとんどのログ
/var/log/journal/ # systemdジャーナル
手動削除の基本コマンド:
# 古い圧縮ログを削除
sudo find /var/log/ -type f -name "*.gz" -mtime +30 -delete
# systemdジャーナルを削除
sudo journalctl --vacuum-time=7d
# ログファイルを空にする
sudo truncate -s 0 /var/log/syslog
logrotateでの自動化:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
}
ベストプラクティス:
- 定期的にディスク使用量を確認
- logrotateで自動ローテーション設定
- 重要なログは長期保持
- バックアップを取ってから削除
- 現在使用中のログは削除せずtruncate
監視ポイント:
df -h # ディスク全体
du -sh /var/log/ # ログディレクトリ
journalctl --disk-usage # systemdログ
推奨される保持期間:
- システムログ:7〜30日
- アプリケーションログ:7〜14日
- アクセスログ:14〜30日
- エラーログ:30〜90日
ログ管理は、システム運用において地味ですが重要なタスクです。
放置するとディスク容量不足でシステムが停止する可能性もあるため、定期的なメンテナンスを習慣化しましょう。
logrotateを適切に設定すれば、ほぼ自動的に管理できるようになります。
まずは現在のログ状況を確認することから始めて、自分の環境に合った設定を見つけてくださいね!
コメント