ログ回転のトラブルシューティング

ログ回転のトラブルシューティング

質問

logrotate同じ設定を実行し、カスタムログファイルを循環する複数の同じサーバーがあります。 1 つ以上のサーバーでマイログが正しく循環しません。

私はこの問題を解決するために数週間努力しましたが、成功しませんでした。ここに私がこれまでに取ったステップと、より詳細な情報を示します。どんな助けでも大変感謝します。

基本的に、この問題を解決するためのアイデアが不足しており、ここで何が間違っているかを確認するためのいくつかのアイデアが必要です。

私が試したこと

(構成ファイルは次のとおり)

  1. logrotate基本ファイルの構成と権限を確認してください。私はそこにすべてが大丈夫だと思います。
  2. logrotate に必要な権限で宛先ディレクトリの権限を設定しますderp(ディレクトリは誰にも書き込めません)。AFAIK)。
  3. logrotate次のコマンドを強制的に実行します。

    logrotate --force /etc/logrotate.d/derp
    

    このコマンドはログを正しく循環しますが、翌日は実行されません。

  4. 手動で日付を過去の特定の時刻に変更し、次回の起動時にログが/var/lib/logrotate/status正しく実行されることを確認するか、次を使用します。logrotate

    logrotate -vv /etc.logrotate.d/derp
    

    これにより、ログは一度回転しますが、次回ログが回転するときは回転しません。成功した手動回転の結果は次のとおりです。

    rotating pattern: /derp/*.log  after 1 days (14 rotations)
    empty log files are not rotated, old logs are removed
    considering log /derp/access.log
    log needs rotating
    considering log /derp/php_errors.log
    log does not need rotating
    rotating log /derp/access.log, log->rotateCount is 14
    dateext suffix '-20150814'
    ...
    files getting renamed and moved
    ...
    running prerotate script
    renaming /derp/access.log to /derp/access.log.1
    creating new /derp/access.log mode = 0774 uid = 0 gid = 4
    running postrotate script
    

    人生は美しくないですか?唯一の問題は、翌日回転する必要があるとき(つまり、常にデータがあり、決して空ではない)、何も起こらないことです。

  5. 私はSEU問題を含む多くの問題についてコンサルティングを行ってきました。この問題これは、過去に他のlogrotate問題を処理するのに役立ちました。

構成

システムは最新のDebian 7を実行しています。ログファイルを生成するプロセスは root として実行されます。ログファイルを生成するプロセスはphpアプリケーションであり、複数の子プロセスを生成します。

関連する構成は次のとおりです。derp私のカスタムログファイルの場所は次のとおりです。

/etc/logrotate.d/derp

構成ファイル権限:

-rw-r--r-- 1 root root 265 Jul 9 2014 derp

/derp/*.log {
                daily
                missingok
                rotate 14
                compress
                delaycompress
                notifempty
                create 774 root adm
                sharedscripts
                postrotate
                                nohup /derp/daemonrestart.sh > /dev/null 2>&1
                endscript
                prerotate
                                killall -9 php > /dev/null 2>&1
                endscript
}

prerotateスクリプトはpostrotateデフォルトでプロセス(ソケットサーバー)を起動または停止し、他のすべてのサーバーでうまく機能します。私はそこに問題がないと確信しています。

/var/lib/logrotate/status

(関連情報を表示するように編集)

logrotate state -- version 2
"/var/log/kern.log" 2015-7-20
...
"/derp/php_errors.log" 2015-8-11
...
"/derp/access.log" 2015-8-14
...

/derp/

ターゲットディレクトリの権限:

drwxr-xr-x 2 root root 4096 Jun 18 10:05 derp

関連ログは次の場所にあります\derp\

-rwxrwxr-- 1 root adm 3755558 Aug 14 07:57 access.log

答え1

あなたは次のように書きました:

次のコマンドを使用してlogrotateを強制します。logrotate --force /etc/logrotate.d/derp。このコマンドはログを正しく回転させますが、翌日は実行されません。

ここでの問題は、daily属性が実際に「24時間」を意味することです。したがって、cronログファイルを手動で置き換えた後にエントリが24時間を超えない限り、その日以降はログファイルは置き換えられません。logrotate/etc/cron.d/daily

私のDebianシステムでは、エントリは/etc/cron.daily毎日06:25に実行されているため、通常の勤務日中に行われた手動ログの回転により、2日後にログの回転が発生しない可能性があります。

答え2

まあ、私はこの問題を修正する努力をあきらめました。クローネが救助に来ます。

sudo crontab -e

次に、スーパーユーザーのcrontabに次の行を追加します。

# Logrotate they said...
3 6 * * *               /usr/sbin/logrotate -f /etc/logrotate.d/derp &> /dev/null

この-fフラグは、ログロテートがログを回転させることを強制します。見つかったファイルは、/etc/logrotate.d/derp私のアプリケーションに対応するlogrotate構成です。

不器用ですが、これがこのエラーを解決する唯一の方法です。

関連情報