記録中のファイルが存在しないときに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マウントディスクにログファイルを書き込みます(重要な場合)。
問題はこれである:
- システムはすでに実行中です(ログが記録されています)。
- 192.168.1.3(クライアント)で、次を実行します。
date | logger -p local5.debug -t mytag
- 192.168.1.2(サーバー)で新しいファイル/nfs/some/dir/192.168.1.3/mytag/2022-03-15.logが作成されましたが、内容は空です。
- 192.168.1.3(クライアント)から
date | logger -p local5.debug -t mytag
(再)実行します。 - 192.168.1.2(サーバー)から/nfs/some/dir/192.168.1.3/mytag/2022-03-15.logファイルに書き込みます(手順4のメッセージが記録されますが、手順2のメッセージは失われます)。
- 192.168.1.2(サーバー)からファイルを削除し、次のようにrsyslogローテーションスクリプトを実行します。
rm /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log ; /usr/lib/rsyslog/rsyslog-rotate
- 192.168.1.3(クライアント)から
date | logger -p local5.debug -t mytag
(再)実行します。 - 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.txt
configと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
私はそのプロセスが次のように進むと仮定しています。
- rsyslogは、ファイルが存在しない場合に生成します(すでに存在する場合はステップ3にスキップ)。
- 次にchmodを実行し、設定ファイルに定義されているユーザーとグループが存在しない場合は、そのユーザーとグループにchownします。
- その後、rsyslog はファイルに書き込みまたは追加します。
手順2に達すると失敗し、所有者にファイルを残すsyslog:syslog
ため、後続のログメッセージが受信されたら手順3にジャンプしてメッセージを正常に作成します。これにより、最初のメッセージがすべて削除されます。
ただし、Ubuntu 20.04で提供される基本構成は次のとおりです。
$FileOwner syslog
$FileGroup adm
だからうんざりしようsyslog:adm
設定を次に変更すると
$FileOwner syslog
$FileGroup syslog
エラーはもう発生しません。
しかし、まだ解決されていない問題が1つあります。
- このタイプのエラーは、記録中のディレクトリがnfsマウント内にあるときに発生します。
- 記録するディレクトリが nfs マウント内にない場合、これらのエラーは発生しません。