久々に触ったら色々忘れていたのでメモ。本当にただのメモ。
INPUTプラグインによるデバッグ
syslogに吐かせて見る場合、syslogプラグインの設定を挟むため加工されているデータを見ることになりがちなので、stdoutで見た方が簡単かつ正確。
[OUTPUT]
Name stdout
Match kube.*
OUTPUTプラグインを複数書いても問題ないので、調べ物をしている最中は基本stdoutにも吐いておくとよい。
Parserの挙動
ログを構造化する。正規表現の場合、キャプチャーグループで利用する。
192.168.2.20 - test_user
というログがあった場合に以下の正規表現を適用すると、
Name apache
Format regex
Regex ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*)
以下のように仕分けられる。
host: 192.168.2.20
user: test_user
OUTPUTプラグインの項目
Syslog_Hostname_key
やSyslog_Appname_key
などSyslog_xxxx_key
となっている項目は、RFCに準拠したSyslogフォーマットに沿って値を渡している。
ここに渡す値はParser
やFilter
で分解した時のキャプチャーグループとマッピングする。
例えば前述のParserを通したデータであれば、
Syslog_Hostname_key user
と設定すると、syslogのhostnameの項目はtest_user
となる。(やらないけど)
FILTERプラグインnestの効果
入れ子構造について、入れ子を入れたり(nest)消したり(lift)出来る。
{"stream"=>"stderr", "logtag"=>"F", "message"=>"...", "kubernetes"=>{"pod_name"=>"vsphere-csi-controller-587b8f69db-qpk48", "namespace_name"=>"kube-system", ...
上のようなログがある時、
[FILTER]
Name nest
Match *
Operation lift
Nested_Under kubernetes
のFilterを通してやると、
{"stream"=>"stderr", "logtag"=>"F", "message"=>"...", {"pod_name"=>"vsphere-csi-controller-587b8f69db-qpk48", "namespace_name"=>"kube-system", ...
と"kubernetes"=>{}
が消えた状態になる。
OUTPUTプラグインで
Syslog_Appname_key pod_name
と書いても、"kubernetes"=>
部分が邪魔になって適切に値を渡せないので、そういう場合は上記のFILTERを利用する。
Kubernetes Filterを使ってsyslog出力する際に、
Syslog_Appname_key pod_name
Syslog_Procid_key container_name
としていた場合、nestプラグインによるliftなしでのvRLIの表示は以下。
適切にpod_nameやcontainer_nameが渡せていない。
liftありの表示は以下。
appnameやprocidに値が渡っていることが分かる。
ログのロスト対策
バッファリングレイヤはデフォルトだとメモリのみで動作するが、ストレージに出力することも出来る。
参考:https://docs.fluentbit.io/manual/administration/buffering-and-storage
以下も参考になった。
FluentBitのログ欠損調査&対策
クラスタ名の設定
TKG用に配布されている?Fluent Bitの設定ファイルに以下の項目がある。
Syslog_Hostname_key tkg_cluster
ただ、tkg_clusterは自分で設定しない限り設定されることはないので、自分で以下のように設定する。
[FILTER]
Name modify
Match kube.*
Set tkg_cluster <クラスタ名>
クラスタ名はWorkload Cluster内で取得するのは難しいと思われるので、自動設定しようと頑張るよりは、ハードコーディング的に書いてあげた方が楽かと思われる。
1行のサイズ
InputはBuffer_Chunk_Size
やBuffer_Max_Size
で制御するが、OUTPUT側も設定が必要な場合がある。syslog output pluginを使う場合はsyslog_maxsize
で設定する。デフォルトが2KBまでしか出力してくれないので、1行のサイズが大きい場合はこちらも大きく設定しておく。
[OUTPUT]
Name syslog
Match *
Host 10.41.78.83
Port 514
syslog_maxsize 16384