syslogを再構成すると、私のアプリケーションログは新しい設定に従わなくなります。

syslogを再構成すると、私のアプリケーションログは新しい設定に従わなくなります。

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_ODELAYLOG_NDELAYLOG_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);

おすすめ記事