Logging エージェントからアップストリームの Fluentd に移行する際に、構成の非互換性が発生し、起動エラーを回避するために回避策が必要になることがあります。このドキュメントでは、構成の非互換性を解決する方法について説明します。
以前の Logging エージェントとアップストリーム Fluentd の構文の変更
以前の Logging エージェントは Fluentd v0.12 構文に依存していますが、アップストリームの Fluentd は v1 標準を採用しています。この移行では、さまざまなパラメータが非推奨となり、以前使用されていたフラットな構成構造に代わって、コア機能を処理するための新しいネストされたディレクティブが導入されます。
起動の失敗を防ぎ、ログが正しく処理されるようにするには、非推奨のパラメータを削除または置き換える必要があります。以降のセクションでは、非推奨のパラメータを更新する方法について説明します。
出力プラグインの構成
次の表に、エラーを回避するために出力プラグインの構成で更新する必要があるパラメータを示します。
| 以前の Logging エージェントの構文 | アップストリーム Fluentd の構文 | メモ |
|---|---|---|
| なし | <buffer> |
Fluentd 出力プラグインは、<match> セクションの下に <buffer> セクションをサポートし、イベントのバッファリングを構成します。詳細については、Fluentd のドキュメントの Config: Buffer Section をご覧ください。 |
buffer_type |
@type |
|
buffer_path |
path |
|
buffer_chunk_limit |
chunk_limit_size |
|
disable_retry_limit |
retry_forever |
|
retry_limit |
retry_max_times |
|
max_retry_wait |
retry_max_interval |
|
num_threads |
flush_thread_count |
|
partial_success |
なし | このパラメータを削除します。アップストリームの Fluentd では、デフォルトで部分的な成功が永続的に有効になり、無効な行のみがドロップされます。 |
以下は、以前の Logging エージェントの google-cloud 出力プラグイン構成の例です。
<match **>
@type google_cloud
buffer_type file
buffer_path /var/log/google-fluentd/buffers
buffer_chunk_limit 512KB
flush_interval 5s
disable_retry_limit false
retry_limit 3
retry_wait 10
max_retry_wait 300
num_threads 8
</match>
更新後の構成は次のようになります。
<match **>
@type google_cloud
<buffer>
@type file
path /var/log/google-fluentd/buffers
chunk_limit 512KB
flush_interval 5s
retry_forever false
retry_max_times 3
retry_wait 10
retry_max_interval 300
flush_thread_count 8
</buffer>
</match>
入力プラグインの構成
次の表に、エラーを回避するために入力プラグインの構成で更新する必要があるパラメータを示します。
| 以前の Logging エージェントの構文 | アップストリーム Fluentd の構文 | メモ |
|---|---|---|
format |
<parse> |
詳細については、構成: 解析セクションの Fluentd ドキュメントをご覧ください。 |
protocol_type |
<transport> |
syslog 転送のプロトコル(udp、tcp,、tls のいずれか)を示します。 |
auto_typecast |
json 解析プラグイン内で使用する場合は、このパラメータを削除します。 |
以下は、以前の Logging エージェントの入力プラグイン構成の例です。
<source>
@type tail
path /var/log/my-app.log
format json
</source>
更新後の構成は次のようになります。
<source>
@type tail
path /var/log/my-app.log
<parse>
@type json
</parse>
</source>
Ruby Time オブジェクトのシリアル化
アップストリームの Fluentd では、<record> フィルタ内で使用される未加工の Ruby Time オブジェクト(record_transformer など)の明示的なキャストが必要です。明示的なキャストがないと、これらのオブジェクトが原因でバッファ フラッシュ中に致命的なシリアル化エラーが発生します。
構成で enable_ruby true を含む ${time} を使用している場合は、オブジェクトをプリミティブ型(整数または文字列)に明示的にキャストする必要があります。
以下に、以前の Logging エージェントのフィルタ プラグイン構成の例を示します。
<filter foo.bar>
@type record_transformer
enable_ruby true
<record>
raw_timestamp ${time}
</record>
</filter>
更新後の構成は次のようになります。
<filter foo.bar>
@type record_transformer
enable_ruby true
<record>
raw_timestamp ${time.to_i}
</record>
</filter>
gRPC トランスポートと圧縮のデフォルト設定
google_cloud 出力プラグインを使用すると、Cloud Logging API との通信で REST/JSON の代わりに gRPC を使用するかどうかを構成できます。
パフォーマンスを向上させるには、gRPC トランスポートを有効にして grpc_compression_algorithm gzip を構成することをおすすめします。この組み合わせにより、特に大量のログを処理する場合に、ネットワーク オーバーヘッドと CPU 使用率を最小限に抑えることができます。
これらの最適化を実装するには、次の構成を使用します。
<match **>
@type google_cloud
use_grpc true
grpc_compression_algorithm gzip
</match>
また、gRPC はポート 443 の HTTP/2 ストリーミングに依存しているため、ネットワーク インフラストラクチャで gRPC/HTTP/2 トラフィックが許可されていることを確認する必要があります。gRPC が制限されている環境では、標準の HTTP/REST 通信に戻すために use_grpc false を明示的に定義する必要があります。
RabbitMQ の正規表現パターン
以前の Logging エージェントが RabbitMQ ログの取り込みに使用する正規表現パターンは、最新の RabbitMQ バージョンの出力形式と互換性がないことがよくあります。このような不一致があると、ログが誤って処理されたり、収集プロセス中にサイレントに破棄されたりする可能性があります。
最新の RabbitMQ ログには、YYYY-MM-DD HH:MM:SS.L などのタイムスタンプにミリ秒単位の精度が組み込まれており、[info] <0.213.0> などの特定の重大度と PID マーカーが含まれています。以前の正規表現では、これらのマーカーを照合できませんでした。
Fluentd エージェントが RabbitMQ ログを収集するように構成されている場合は、現在のログ形式を正しく処理するように <parser> セクションを更新する必要があります。
以下は、以前の Logging エージェントの RabbitMQ 入力プラグイン構成の例です。
<source>
@type tail
path /var/log/rabbitmq/*.log
pos_file /var/lib/google-fluentd/pos/rabbitmq.pos
tag rabbitmq
format multiline
format_firstline /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/
format1 /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[(?<severity>\w+)\] (?<message>.*)/
time_format %Y-%m-%d %H:%M:%S
</source>
更新後の構成は次のようになります。
<source>
@type tail
path /var/log/rabbitmq/*.log
pos_file /var/log/fluentd/pos/rabbitmq.pos
read_from_head true
tag rabbitmq
<parse>
@type multiline
format_firstline /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}/
format1 /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) \[(?<severity>[^\]]+)\] <(?<pid>[^>]+)> (?m:(?<message>.*))$/
time_format %Y-%m-%d %H:%M:%S.%L
</parse>
</source>