syslogアプリケーションについて質問があります。 syslog APIを使って簡単なプログラムを書いた。私はプログラムをコンパイルして起動しました。動作し、ログからログを表示できます。
ただし、リモートサーバーにログを送信するようにsyslogを再設定すると、プログラムはログを引き続きローカルに送信します。リモートsyslogサーバーが動作しており、logger -p daemon.info test: testing log
リモート側でメッセージを確認して表示できます。testing log
プログラムを再起動すると、動作し、ログがリモートサーバーに送信されます。
それでは、syslogデーモンが再起動したらsyslogアプリケーションを再起動する必要があると思いますか?
パスワード
#include <syslog.h>
#include <stdio.h>
#include <unistd.h>
int main(){
setlogmask (LOG_UPTO (LOG_NOTICE));
int i = 0;
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
while (1){
syslog (LOG_NOTICE, "Program started by User %d, msg numer %d", getuid (),++i);
sleep(2);
}
closelog ();
return 0;
}
コンパイルと実行
gcc test.c && ./a.out
また現れる
- リモート syslog サーバーが構成されていません。
- プログラムのコンパイルと起動
- リモート syslog サーバーの構成 => プログラムはリモート サーバーにログを送信しません。
- プログラムを再起動してください=>リモートサーバーにログがあります。
ローカルおよびリモート Distrib および rsyslog のバージョンは ubuntu-20.04 および rsyslogd 8.2001.0 です。
答え1
ついにchatGPTが私に答えを与えた。
syslog設定を変更するたびにプログラムを再起動したくない場合は、optionsの代わりにoptionsで
syslog()
関数を使用することを検討してください。このオプションを有効にすると、ログメッセージが送信されるたびにsyslog APIが設定ファイルを再度読み取ることができるため、syslog設定への変更がプログラムにすぐに反映されます。LOG_ODELAY
LOG_NDELAY
LOG_ODELAY
syslog
そしてマニュアルページの答えは明確ではありません。
LOG_ODELAY
逆に、
LOG_NDELAY
接続のオープンはsyslog()
呼び出されるまで遅延します。 (既定値なので指定する必要はありません.)
したがって、以下を変更してください。
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
到着
openlog ("exampleprog", LOG_CONS | LOG_PID, LOG_LOCAL1);