banner
niracler

niracler

长门大明神会梦到外星羊么?
github
email
steam_profiles
douban
nintendo switch
tg_channel
twitter_id

logrotateを使用してログのローテーションと自動アーカイブを行う

logrotate はログファイルのローテーション、圧縮、古いログファイルの削除を行うことができ、ほとんどの Linux ディストリビューションにはデフォルトで logrotate がインストールされており、毎日自動的に実行されます。

logrotate の設定ファイル#

ファイル /etc/logrotate.d/app を作成して編集します。一般的に、/etc/logrotate.conf には include /etc/logrotate.d という設定があり、これにより /etc/logrotate.d ディレクトリ内の設定ファイルが自動的に読み込まれます。

/root/app/log/app.log {
    daily          # 毎日ローテーション
    missingok      # ログファイルが存在しなくてもエラーを報告しない
    rotate 100     # 100 個のログファイルを保持
    compress       # 古いログファイルを圧縮
    delaycompress  # 次回のローテーションまで圧縮を遅延
    notifempty     # ログファイルが空でない場合のみローテーション
    dateext        # 現在の日付をログファイルのサフィックスとして使用
    dateformat -%Y%m%d  # 日付フォーマットを設定
    olddir /root/app/log/old # 古いログファイルの保存ディレクトリを設定、このディレクトリは事前に作成する必要があります
    sharedscripts  # スクリプトはすべてのログローテーション後に一度だけ実行され、各ファイルごとに実行されるわけではありません
    postrotate     # ログローテーション後に実行されるスクリプト
        /usr/bin/docker restart app
    endscript      # スクリプトの終了
}

注意:サービスを再起動する際、ネットワークが切断される可能性があるため、注意が必要です。この方法を使用して、再起動プロセス中にネットワークが切断されるかどうかをテストできます。

for i in {1..1000}; do { curl -I https://example.com/; sleep 0.3; } ; done

テスト#

ここでは logrotate コマンドを直接使用してテストします。-d はデバッグモードを示し、-f は強制実行を示し、-v は詳細モードを示します。実行プロセスを見ることができます。デバッグモードでは実際には実行されず、実行プロセスが表示されるだけで、テストに使用できます。

logrotate -dfv /etc/logrotate.d/app

デバッグモードを解除した後、結果は以下の通りです。

$ tree
.
├── app.log
└── old
    ├── app.log-20231116.gz
    └── app.log-old

1 ディレクトリ, 3 ファイル

可能性のある問題#

  1. 権限: 現在、root ユーザーを直接使用しているため、権限の問題には直面していませんが、他のユーザーの場合は権限の問題が発生する可能性があるため、注意が必要です。
  2. 再起動: postrotate 内のスクリプトはログローテーション後に実行されるため、サービスを再起動する場合、ネットワークが切断される可能性があるため、注意が必要です。
  3. ファイルサイズによるローテーション: ファイルサイズによるローテーションの場合、ログファイルが切り捨てられる可能性があるため、注意が必要です。ここではファイルサイズによるローテーションを使用していないため、この問題には直面していません。

参考資料#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。