Buildroot: syslog-ng は、「/var/log/messages」の代わりに「/var/log/messages.1」ファイルに書き込みます。

Buildroot: syslog-ng は、「/var/log/messages」の代わりに「/var/log/messages.1」ファイルに書き込みます。

私はBuildrootを使って組み込みLinuxボードを構築しています(取扱説明書はこちら)。

私はそれをsyslog-ngボード上で実行しています。その設定ファイルはbuildrootに割り当てられます。https://github.com/buildroot/buildroot/blob/master/package/syslog-ng/syslog-ng.conf:

@version: 3.37

source s_sys {
    file("/proc/kmsg" program_override("kernel"));
    unix-stream ("/dev/log");
    internal();
};

destination d_all {
    file("/var/log/messages");
};

log {
    source(s_sys);
    destination(d_all);
};

ターゲットをとして指定します"/var/log/messages"が、ボード上のアクティビティログは存在しない/var/log/messages.1というファイルに移動されます。/var/log/messagesなぜそんなことですか?/var/log/messagesファイルにログインする方法はありますか?

過去にSyslogを使用してログインしており、/var/log/messagesこの動作を一貫して維持するよう努めています。

補足説明

  1. ls -1 /var/log実行ボードにsyslog次のファイルを含めますmessages
    messages
    messages.1
    messages.2
    messages.2.gz
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    
  2. ls -1 /var/log実行ボードにsyslog-ng次のファイルを含めますmessagesmessages通知がありません)。
    messages.1
    messages.2
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    
  3. syslog-ngボードは、「アクティブ」ファイルを使用しtail -f /var/log/messages.1ても予期しない記録されたメッセージを受信し続けていることを示しています。syslog/var/log/messages

答え1

解決しました!syslog-ng各ログを回転した後、ターゲットログファイルを強制的に再開する必要があります。

だから見つけました。 @Murray Jensenに感謝します。ここのヒント

logrotateファイルを回転するたびに、ファイル/var/log/messages名が/var/log/messages.1。次の手順を実行するにはsyslog-ng/var/log/messages/var/log/messages.1いいえsyslog-ngが書き込むファイル記述子が、名前付きファイルを指すようにファイル記述子を変更します/var/log/messages.1回避策は、ログファイルを強制的にsyslog-ng再開し、各ログの回転後に新しいファイル記述子をインポートすることです。したがって、現在存在する新しく作成されたターゲットログファイルの新しいファイル記述子を取得します/var/log/messages

これを行うには3つの方法があります。ここについて書いた。https://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-1270517815

syslog-ng-ctl reopenこれが推奨される方法であることがわかったところは、ここを参照してください。https://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-346624252

この3つの方法は次のとおりです。

# Option 0 (no longer recommended): call the heavier `reload` command after log
# rotation
syslog-ng-ctl reload

# Option 1 (RECOMMENDED): call the new `reopen` command after log rotation
syslog-ng-ctl reopen

# Option 2 (same thing as Option 1 above): send the `SIGUSR1` kill signal to the
# running `syslog-ng` process
pid="$(cat /var/run/syslog-ng.pid)" kill -SIGUSR1 $pid

したがって、logrotateすべてのログの回転後に上記の3つの方法のいずれかが自動的に呼び出されるようにするには、正しいコマンドをスクリプトとして設定ファイル(または同様の名前で指定できます)に追加する必要がありますpostrotate。これで、変更されたlogrotate構成ファイルは次のようになります。/etc/logrotate.d/syslog-nglogrotate

私のメモから:

サンプル/etc/logrotate.d/syslog-ng ログの回転構成ファイル:

/var/log/auth.log 
/var/log/user.log
/var/log/messages  
{
    rotate 7
    size 20M
    delaycompress
    missingok
    # Required for syslog-ng after each rotation, to cause it to reopen log
    # files so it can begin logging to the new log file under a new file
    # descriptor, rather than to the old log file which has now been rotated
    # and renamed. 
    postrotate
        # After rotating the log files, cause syslog-ng to reopen the
        # destination log files so it will log into the newly-created log files
        # rather than into the now-rotated and renamed ones.
        #
        # This ensures, for example, that syslog-ng will move its file
        # descriptor to begin logging into the main "/var/log/messages" log
        # file again, instead of into the now-rotated "/var/log/messages.1"
        # file, which the old file descriptor (fd) is now pointing to since
        # that fd's filename was just renamed from "/var/log/messages"
        # to "/var/log/messages.1" during the log rotation.

        # Option 1:
        syslog-ng-ctl reopen
        # OR, Option 2
        # pid="$(cat /var/run/syslog-ng.pid)" kill -SIGUSR1 $pid
    endscript
}

注:ここでも文書の変更を要求しました。https://github.com/syslog-ng/syslog-ng/issues/4166。今syslog-ng-ctl reopen、各ログを回転した後syslog-ng-ctl reload

以前の回答を試す(最初に試した回答)

ボードの上を走るsyslog-ngときrootfs(ルートファイルシステム)イメージを完全に更新します。マザーボードを再起動しました。/var/log/messagesファイルが再び表示されます。

部分出力ls -1 /var/log:

messages
messages.1
messages.2
messages.3
messages.4
messages.5
messages.6
messages.7

私はそれを説明できません。tail -f /var/log/messages期待どおりにファイルに入ってくるアクティビティログを表示し、ファイルが期待どおりにtail -f /var/log/messages.1新しいメッセージを受け取らず、静的な状態であることを示します。

syslog-ng次の出力を見ると、ボードが実際に実行されていることを証明できますps aux | grep syslog

# ps aux | grep syslog
  803 root      0:00 {syslog-ng} supervising syslog-ng
  804 root      0:02 /usr/sbin/syslog-ng
12571 root      0:00 grep syslog

...ボードで実行されたときに同じコマンドの出力とは反対ですsyslog

# ps aux | grep syslog
  789 root      0:19 /sbin/syslogd -n -n -s 0
 2993 root      0:00 grep syslog

繰り返しますが、何が起こったのか、なぜ起こったのかよくわかりません。

両方のボードが実行中であることをps aux | grep logrotate示しますlogrotate。前任者:

# ps aux | grep logrotate
 1299 root      0:00 runsv logrotate-periodically
14208 root      0:00 grep logrotate

両方のボードに同じ/etc/logrotate.confファイルがあり、syslog-ngボードにのみ/etc/syslog-ng.conf質問に表示される内容を含むファイルがあります。

今後新しいものが見つかったら、戻ってこの回答を更新します。

関連情報