Ubuntu 26.04 講座 / ジャーナル・ファイルログ・ログのローテーションと保存設定

Ubuntuのログ管理は、journaldの保存・保持と一般的なファイルログのローテーションを区別して設定します。まず実際の収集状況を確認し、保持期間を短くすると既存の記録が削除される可能性があるため、保管するログを確保したうえでポリシーを変更します。

実際のログ収集経路の確認

systemctl status systemd-journald rsyslog --no-pager
journalctl --disk-usage
journalctl --list-boots
ls /var/log

rsyslogがインストールされていないシステムには、馴染みのある/var/log/syslogが存在しない場合があります。journalのバイナリファイルをlogrotateで直接ローテーションしたり、ファイルを強制的に削除したりしません。アプリが独自のファイルに書き込むか、journalに書き込むかも該当サービス設定とともに確認します。

検索条件と実際のログ生成の確認

logger -t ubuntu-course-log 'retention-lab-marker'
journalctl -t ubuntu-course-log --since '5 minutes ago' --no-pager
journalctl -b -p warning --no-pager

新しいマーカーが実際に見つかるかを確認し、起動・時間範囲・unit・優先度を必要に応じて絞り込みます。出力がないという事実は、ログ生成の失敗と検索条件の不一致の両方の可能性があるため、別途調査します。一般ユーザーに対してシステム全体のログ閲覧権限を不必要に広げません。

journalの保持ポリシーは別のファイルで管理します

専用VMでポリシーをテストするには、既存の設定をバックアップし、/etc/systemd/journald.conf.d/60-lab-retention.conf のような新しいファイルを確認します。以下の値は小さな演習環境の例であり、法的・組織の保存基準の代わりにはなりません。元の保存量より減らすと、古い記録が失われる可能性があります。

[Journal]
Storage=persistent
SystemMaxUse=200M
RuntimeMaxUse=50M
MaxRetentionSec=7day

persistent ストレージの準備と適用は systemd の文書に従って確認し、計画したタイミングで journald を再起動した後、journalctl --flush と disk-usage・新しいマーカーの確認を行います。表示される使用量には書き込み中のファイルも含まれます。容量制限による削除はローテーション済みのファイルを対象とするため、設定値と表示値が常にぴったり一致するわけではありません。

journald.conf の文書は、永続保存と保存容量・期間の適用条件を説明しています。

journal 設定の適用と元の状態の復元

保存する記録を独立した場所に確保した新しい専用VMでのみテストします。以下のコードは既存の lab ファイルがある場合に停止し、他の管理者の drop-in を上書きしません。前述の 200M・50M・7day は小さな演習例であり、すでに削除された記録は設定復元によって戻りません。

(
set -eu
lab_conf=/etc/systemd/journald.conf.d/60-lab-retention.conf
if sudo test -e "$lab_conf" || sudo test -L "$lab_conf"; then
    printf 'Existing lab file: inspect it instead of overwriting.\n' >&2
    exit 1
fi
backup_dir=$(sudo mktemp -d /root/journal-before-lab.XXXXXX)
sudo cp -a /etc/systemd/journald.conf "$backup_dir/"
if sudo test -d /etc/systemd/journald.conf.d; then
    sudo cp -a /etc/systemd/journald.conf.d "$backup_dir/"
fi
sudo install -d -m 0755 /etc/systemd/journald.conf.d
sudo sh -c 'set -C; cat > "$1"' sh "$lab_conf" <<'EOF'
[Journal]
Storage=persistent
SystemMaxUse=200M
RuntimeMaxUse=50M
MaxRetentionSec=7day
EOF
sudo systemd-analyze cat-config systemd/journald.conf
printf 'Review configuration and backup: %s\n' "$backup_dir"
)

cat-configで期待した4つの値と、後で上書きする他の設定がないかを確認した後にのみ、次の適用を進めます。サービス再起動はログファイルを直接削除する作業とは異なります。Storage=persistentと--flushの結果、マーカー記録と再起動履歴の保持をそれぞれ確認します。

sudo systemctl restart systemd-journald.service && sudo journalctl --flush && sudo journalctl --disk-usage
logger -t ubuntu-course-log 'after-retention-change'
sudo journalctl -t ubuntu-course-log --since '5 minutes ago' --no-pager

復元は今回新しく作成した60-lab-retention.confの1ファイルのみが対象です。その後、他の編集がなく、かつそのファイルが今回の内容であることを確認した上で次を実行します。既存ファイルを上書きしていないため、それを削除すると以前の設定の組み合わせに戻り、過去のログが再生成されることはありません。

sudo rm -- /etc/systemd/journald.conf.d/60-lab-retention.conf && sudo systemctl restart systemd-journald.service && sudo journalctl --flush
sudo systemd-analyze cat-config systemd/journald.conf

別の練習ファイルでlogrotateを実行する

logrotateがインストールされた環境で、以下のコードは一般ユーザーのホームの新しい一時フォルダと別のステータスファイルのみを使用します。システムのlogrotate状態や実際のアプリログには触れません。Bashでブロック全体を実行し、出力されたフォルダパスを記録します。

work=$(mktemp -d "$HOME/logrotate-lab.XXXXXX")
for i in {1..200}; do printf 'lab line %04d\n' "$i"; done > "$work/app.log"
cat > "$work/logrotate.conf" <<EOF
"$work/app.log" {
    size 1k
    rotate 2
    compress
    missingok
    notifempty
    create 0600
}
EOF
logrotate -d -s "$work/state" "$work/logrotate.conf"
logrotate -s "$work/state" "$work/logrotate.conf"
ls -l "$work"
printf 'Lab folder: %s\n' "$work"

debugの実行は計画を表示し、実際のローテーションは2番目のコマンドで行います。新しいapp.logと圧縮保存ファイルを確認し、gzip -cd "$work/app.log.1.gz"に練習内容が残っているかを確認します。実際のアプリはファイルディスクリプタを保持する可能性があるため、postrotate・reloadの動作はアプリのドキュメントに合わせて別途設計する必要があります。

復元と保持結果の確認

journalのポリシー実習を終えたら、今回のdrop-inだけ元の状態に戻して再度適用します。すでに削除された過去のログは設定を復元しても戻らないため、別途保管資料が必要です。練習フォルダは位置と内容を確認した後、自分が作成したファイルだけ整理します。

ログポリシーには保存容量・期間・閲覧主体・個人情報の取り扱い・失敗検知も一緒に記録します。サービス正常応答とログの生成・検索・ローテーション後の読み取り可能かどうかをそれぞれ検証しなければ、必要な記録が実際に保持されているか判断できません。