重複せずに特定のUnixソケットからrsyslogメッセージを別のログファイルにリダイレクトする方法は?

重複せずに特定のUnixソケットからrsyslogメッセージを別のログファイルにリダイレクトする方法は?

私はhaproxyに対して別々のロギングを実装しようとしてきました。ただし、最終的に重複したロギングが発生し、入力ソケットまたは機能のみに基づいてログを切り離すことはできません。

haproxyの構成例は次のとおりです。

グローバル構成:

log                           /dev/log len 1024 format local local0 debug

Frontend-1構成(Web要求用):

log                           /dev/request-log len 1024 format local local1 debug

Frontend-2構成(データベース要求用):

log                           /dev/db-log len 1024 format local local2 debug

だからここでは基本的にログを別のソケットにリダイレクトしようとしています。また、入力ソケットに基づいてメッセージをリダイレクトする方法がわからないため、各ソケットに異なる機能を使用しています。

rsyslog設定に以下を追加しました。

$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/haproxy.log
$AddUnixListenSocket /var/lib/haproxy/dev/request-log
local2.* /var/log/haproxy/requests.log
$AddUnixListenSocket /var/lib/haproxy/dev/db-log
local3.* /var/log/haproxy/db.log

ただし、上記のすべてのログファイルには同じログレコードがあります。つまり、Web要求ログレコード、データベースログレコード、および他のhaproxyログレコードがこれら3つのファイルで繰り返されます。そしてデフォルトの/var/log/messagesを含みます。

rsyslog.confを完了してください。

$ModLoad imuxsock
$ModLoad imjournal
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$SystemLogSocketName /run/systemd/journal/syslog
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
local1.* /var/log/keepalived.log
$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/haproxy.log
$AddUnixListenSocket /var/lib/haproxy/dev/request-log
local2.* /var/log/haproxy/requests.log
$AddUnixListenSocket /var/lib/haproxy/dev/db-log
local3.* /var/log/haproxy/db.log

注:上記の設定で述べたkeepalived.logにも同じ問題があります。

ツールを使用する代わりに、このようなものを使用すると、重複することなくロギングがうまく機能することがわかります。

:programname, startswith, "haproxy" {
  /var/log/haproxy/haproxy.log
  stop
}

ただし、これは入力ソケットまたは施設名に基づいてメッセージを簡単にフィルタリングできる場合には不要な追加処理です。重複が発生する理由を理解するのに役立つ人はいますか?重複のないcron、メール、authprivなどの他の基本部分では発生しません。または、ソケット入力に基づいてメッセージをリダイレクトする方法は?

答え1

処理制限は次のように行われます。ルールセット。これにより、フィルタセットをグループ化し、指定された入力にのみ適用できます。ルールセットの外側のフィルタは、通常どおり追加の入力を受け取ります。ルールセットの古い構文を使用できますが、RainerScriptスタイルを使用する方が簡単です。たとえば、次のようになります。

ruleset(name="rule1"){
  *.* action(type="omfile" file="output1")
}
ruleset(name="rule2"){
  *.* action(type="omfile" file="output2")
}
input(type="imuxsock" socket="/tmp/sock1" Ruleset="rule1")
input(type="imuxsock" socket="/tmp/sock2" Ruleset="rule2")
*.* -./output3

この設定はソケットを読み取り、すべての行に一致するルールセットを/tmp/sock1適用してファイルに保存します。同様にデータが入り、一般入力が入ります。rule1output1sock2output2output3

したがって、最後の6行を次に変更してください。

ruleset(name="rule1"){
  *.* action(type="omfile" file="/var/log/haproxy/haproxy.log")
}
input(type="imuxsock" socket="/var/lib/haproxy/dev/log" Ruleset="rule1")

など。とにかくその行だけを取得する必要があるため、local0などをフィルタリングする必要はありません。

関連情報