私は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
この動作を一貫して維持するよう努めています。
補足説明
ls -1 /var/log
実行ボードにsyslog
次のファイルを含めますmessages
。messages messages.1 messages.2 messages.2.gz messages.3 messages.4 messages.5 messages.6 messages.7
ls -1 /var/log
実行ボードにsyslog-ng
次のファイルを含めますmessages
(messages
通知がありません)。messages.1 messages.2 messages.3 messages.4 messages.5 messages.6 messages.7
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-ng
logrotate
サンプル/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
質問に表示される内容を含むファイルがあります。
今後新しいものが見つかったら、戻ってこの回答を更新します。