syslogプロトコルをfluentdで直接待ち受けてログを受信します。
ログの出力先はfluentdの動くホスト上のファイルとします。
最小の設定でとりあえずfluentdを起動
設定ファイルは以下のような感じです。
<source>
@type syslog
port 5140
bind 0.0.0.0
tag test
<parse>
@type none
</parse>
</source>
<match test.**>
@type file
format single_value
append true
path output.txt
<buffer>
chunk_limit_records 1
</buffer>
</match>
$ fluentd -c sample.conf
これでUDPの5140ポートでログを待ち受けます。
設定ファイルの説明
syslogで受け取るPriority(syslogにおいてfacilityとseverityを表すuser.info
とかsecurity.alert
みたいな文字列)はfluentdのタグに連結されます。この設定では tag test
と書いているので、user.info
というPriorityのログが来たら、fluentdでのタグは test.user.info
に変わります。したがって、設定ファイルのmatch
ではsyslogから来たログをすべて受け取るにはワイルドカードを使って test.**
のように書く必要があります。
chunk_limit_records 1
という記述は、動作検証しやすいように、ログをfluentdがバッファリングせずに1件ずつファイルに書き出してほしかったので書いたものです。
loggerコマンドで試してみる
logger
というコマンドでsyslogプロトコルを発することができます。fluentdをローカルで動かしていて5140ポートで待ち受けているので、以下のようにすればfluentdにログを手動で送信できます。
$ logger -n localhost -P 5140 -p user.info -t tagsample1 messagesample1
$ logger -n localhost -P 5140 -p user.info -t tagsample2 messagesample2
-p
オプションはsyslogのPriority、-t
オプションはsyslogのタグ、その後ろはログ本体です。このlogger
コマンドによりfluentdは次のようにファイルに出力します。
$ cat output.txt.20200515.log
1 2020-05-15T17:43:53.083565+09:00 0e495fc17308 tagsample1 - - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="589500"] messagesample1
1 2020-05-15T17:44:42.659572+09:00 0e495fc17308 tagsample2 - - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="614000"] messagesample2
parseの設定
<parse>
@type none
</parse>
fluentdの設定ファイルのこの<parse>
の部分がないと、logger
コマンドからログが届いたときに invalid input data
というエラーが発生して受け取ることができませんでした。
<parse>
の部分を以下のようにすると、logger
コマンドからの場合は日時などのメタ情報がいっさいなくて、ログ本体のみが出力されました。
<parse>
@type syslog
message_format auto
</parse>
$ logger -n localhost -P 5140 -p user.info -t tagsample3 messagesample3
$ cat output.txt.20200515.log
messagesample3
<parse>
のmessage_format
にはauto
のほかにrfc3164
またはrfc5424
という値も設定できます。rfc5424
にすればRFC5424でログをパースしてくれます。
RFC3164とRFC5424の違いを含むsyslogプロトコルの詳細は以下の記事がわかりやすいです。
syslogプロトコル再入門 ~フォーマット(BSD/IETF形式),Facility/Severity一覧,Ciscoの設定~│SEの道標
リンク
fluentdのsyslog Inputプラグインのドキュメント
syslog - Fluentd
fluentdのsyslog Parserプラグインのドキュメント
syslog - Fluentd
ソースコード
fluentd/in_syslog.rb at master · fluent/fluentd
fluentd/parser_syslog.rb at master · fluent/fluentd
以上。