ファイルが存在しない場合、Rsyslogはログメッセージを失います。

ファイルが存在しない場合、Rsyslogはログメッセージを失います。

記録中のファイルが存在しないときにrsyslogメッセージが失われる状況が発生しました。

これは私の設定です。

  • ログサーバー192.168.1.2の構成は次のとおりです。
module(load="imtcp")
input(type="imtcp" port="514")
$template MyRemoteLog1,"/nfs/some/dir/%FROMHOST-IP%/%programname%/%$year%-%$month%-%$day%.log"
$template MyRemoteLog2,"/nfs/other/dir/%FROMHOST-IP%/%syslogfacility-text%.%syslogseverity-text%.%programname%.log"
$template MsgOnly,"%msg:2:$:%\n"

if $FROMHOST-IP== ['192.168.1.3'] AND $SYSLOGFACILITY-TEXT== ['local5'] then ?MyRemoteLog1;MsgOnly
& stop

if $FROMHOST-IP== ['192.168.1.3'] then ?MyRemoteLog2
& stop
  • ログ 192.168.1.3 を送信するクライアントの構成は次のとおりです。
*.* @@192.168.1.2:514
  • また、192.168.1.3の設定をこれに変更しようとしましたが、問題は解決しません。
*.* action(type="omfwd"
           Target="192.168.1.2"
           Port="514"
           resendlastmsgonreconnect="on"
           action.resumeRetryCount="-1"
           queue.filename="queue"
           queue.size="100000"
           queue.saveonshutdown="on"
           Protocol="tcp" )

デフォルトではlocal5の場合は/nfs/some/dir/192.168.1.3/mytag/2022-03-15.logに保存し、local5以外の場合は/nfs/other/dir/192.168.1.3/userログサーバー.noticeに保存しますします。 mytag.ログイン

また、私の設定はnfsマウントディスクにログファイルを書き込みます(重要な場合)。

問題はこれである:

  1. システムはすでに実行中です(ログが記録されています)。
  2. 192.168.1.3(クライアント)で、次を実行します。date | logger -p local5.debug -t mytag
  3. 192.168.1.2(サーバー)で新しいファイル/nfs/some/dir/192.168.1.3/mytag/2022-03-15.logが作成されましたが、内容は空です。
  4. 192.168.1.3(クライアント)からdate | logger -p local5.debug -t mytag(再)実行します。
  5. 192.168.1.2(サーバー)から/nfs/some/dir/192.168.1.3/mytag/2022-03-15.logファイルに書き込みます(手順4のメッセージが記録されますが、手順2のメッセージは失われます)。
  6. 192.168.1.2(サーバー)からファイルを削除し、次のようにrsyslogローテーションスクリプトを実行します。rm /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log ; /usr/lib/rsyslog/rsyslog-rotate
  7. 192.168.1.3(クライアント)からdate | logger -p local5.debug -t mytag(再)実行します。
  8. 192.168.1.2(サーバー)で新しいファイル/nfs/some/dir/192.168.1.3/mytag/2022-03-15.logが作成されましたが、内容は空です。

この実験では、ファイルがまだ存在していないときは生成されますが、内容は記録されないことがわかります。なぜこれが起こるのですか?

最初は、通常のTCPを介したrsyslogが信頼できず、RELPを使用する必要がある可能性があるためと考えました。しかし、そのような実験を行った結果、ネットワークに問題があるわけではないようです。

これは私のnfsマウントです。 172.16.1.4:/some/dir/nfs_export on /nfs type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.16.1.4,mountvers=3,mountport=38559,mountproto=udp,local_lock=none,addr=172.16.1.4)

$DebugFile /tmp/rsyslogdebug.txtconfigとconfigを追加し$DebugLevel 1、メッセージをデバッグした後、次のコマンドを実行してrsyslogを開きます。

kill -USR1 `ps aux | grep rsyslog | tr -s ' ' | cut -d' ' -f2 | head -n1`

私は次のログを見つけました/tmp/rsyslogdebug.txt

7792.776708768:main Q:Reg/w0  : omfile.c: omfile: file to log to: /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log
7792.779333692:main Q:Reg/w0  : errmsg.c: Called LogMsg, msg: error during config processing: omfile: chown for file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' failed: Operation not permitted
7792.779415835:main Q:Reg/w0  : operatingstate.c: osf: MSG error during config processing: omfile: chown for file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' failed: Operation not permitted: signaling new internal message via SIGTTOU: 'error during config processing: omfile: chown for file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' failed: Operation not permitted [v8.2001.0 try https://www.rsyslog.com/e/2207 ]'
7792.779567477:main thread    : janitor.c: janitorRun() called
7792.779745372:main Q:Reg/w0  : errmsg.c: Called LogMsg, msg: error during config processing: Could not open dynamic file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' [state -3000] - discarding message
7792.779812889:main Q:Reg/w0  : operatingstate.c: osf: MSG error during config processing: Could not open dynamic file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' [state -3000] - discarding message: signaling new internal message via SIGTTOU: 'error during config processing: Could not open dynamic file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' [state -3000] - discarding message [v8.2001.0 try https://www.rsyslog.com/e/2207 ]'

答え1

メッセージからのプロンプトerror during config processing: omfile: chown for file

私はそのプロセスが次のように進むと仮定しています。

  1. rsyslogは、ファイルが存在しない場合に生成します(すでに存在する場合はステップ3にスキップ)。
  2. 次にchmodを実行し、設定ファイルに定義されているユーザーとグループが存在しない場合は、そのユーザーとグループにchownします。
  3. その後、rsyslog はファイルに書き込みまたは追加します。

手順2に達すると失敗し、所有者にファイルを残すsyslog:syslogため、後続のログメッセージが受信されたら手順3にジャンプしてメッセージを正常に作成します。これにより、最初のメッセージがすべて削除されます。

ただし、Ubuntu 20.04で提供される基本構成は次のとおりです。

$FileOwner syslog
$FileGroup adm

だからうんざりしようsyslog:adm

設定を次に変更すると

$FileOwner syslog
$FileGroup syslog

エラーはもう発生しません。

しかし、まだ解決されていない問題が1つあります。

  • このタイプのエラーは、記録中のディレクトリがnfsマウント内にあるときに発生します。
  • 記録するディレクトリが nfs マウント内にない場合、これらのエラーは発生しません。

関連情報