20.8. Rsyslog での構造化ロギング

大量のログデータを生成するシステムでは、ログメッセージを 構造化されたフォーマット で維持すると便利です。構造化メッセージは、特定情報の検索や統計情報の作成、メッセージ構造の変更およびその不整合への対応が容易になります。RsyslogJSON (JavaScript Object Notation) フォーマットを使ってログメッセージに構造を提供します。
以下の非構造化ログメッセージを
Oct 25 10:20:37 localhost anacron[1395]: Jobs will be executed sequentially
次の構造化メッセージと比較してください。
{"timestamp":"2013-10-25T10:20:37", "host":"localhost", "program":"anacron", "pid":"1395", "msg":"Jobs will be executed sequentially"}
鍵-値のペアを使った構造化データの検索は、正規表現によるテキストファイルの検索よりも速く、より正確です。構造化データでは、異なるアプリケーションで作成されたメッセージで同一エントリーを検索することもできます。また、JSON ファイルは、追加のパフォーマンスおよび分析機能を提供する MongoDB のようなドキュメントデータベースで保存することもできます。一方で、構造化メッセージは、非構造化メッセージよりも多くのディスクスペースを必要とします。
rsyslog では、メタデータを伴うログメッセージは、imjournal を使って Journal からプルされます。mmjsonparse モジュールでは、Journal やその他のソースからインポートしたデータを解析し、たとえばデータベース出力としてさらに処理することができます。解析が成功するには、mmjsonparse は入力メッセージが Lumberjack プロジェクトで定義された方法で構築されている必要があります。
Lumberjack プロジェクトは、後方互換性がある方法で構造化ロギングを rsyslog に追加することを目指しています。構造化メッセージを特定するために、Lumberjack は実際の JSON 構造の前に付く @cee: 文字列を指定します。Lumberjack はまた、JSON 文字列内のエントリーに使用する標準フィールド名の一覧も定義します。Lumberjack についての詳細情報は、20.12項「オンラインのドキュメント」 を参照してください。
以下は、lumberjack 形式のメッセージの例です。
 @cee: {"pid":17055, "uid":1000, "gid":1000, "appname":"logger", "msg":"Message text."} 
この構造を Rsyslog 内に構築するには、テンプレートを使用します。「構造化メッセージのフィルタリング」 を参照してください。アプリケーションおよびサーバーは、libumberlog ライブラリーを用いて lumberjack 準拠の形式でメッセージを生成できます。libumberlog についての詳細情報は、20.12項「オンラインのドキュメント」 を参照してください。

20.8.1. Journal からのデータのインポート

imjournal モジュールは Rsyslog の入力モジュールで、ネイティブに journal ファイルを読み取ります (「Rsyslog と Journal の相互作用」 を参照)。その後、Journal メッセージは、他の rsyslog メッセージのようにテキスト形式でログ記録されます。しかし、さらに処理することで、Journal が提供するメタデータを構造化メッセージに変換することが可能です。
Journal から Rsyslog にデータをインポートするには、/etc/rsyslog.conf で以下の設定を使用します。
$ModLoad imjournal

$imjournalPersistStateInterval number_of_messages
$imjournalStateFile path
$imjournalRatelimitInterval seconds
$imjournalRatelimitBurst burst_number
$ImjournalIgnorePreviousMessages off/on
  • number_of_messages では、journal データの保存頻度を指定できます。指定されたメッセージ数に達すると、毎回データが保存されます。
  • path は、state ファイルへのパスに置き換えます。このファイルは、最後に処理された journal エントリーを追跡します。
  • seconds では、レート制限の間隔を設定します。この間隔内に処理されるメッセージ数は、burst_number で指定して値を超えることはできません。デフォルト設定は、600 秒あたり 20,000 メッセージです。Rsyslog は、この指定された時間枠内で最大バースト後に届いたメッセージを破棄します。
  • $ImjournalIgnorePreviousMessages を使うと、現在 Journal にあるメッセージを無視して、新しいメッセージのみをインポートできます。このメッセージは、state ファイルが指定されていない場合に使用されます。デフォルト設定は、off です。この設定が off で、state ファイルがない場合、Journal 内の全メッセージは前の rsyslog セッションで処理されていても、処理されることに注意してください。

注記

imjournal は、従来のシステムログ入力である imuxsock モジュールと同時に使用できます。ただし、メッセージの重複を避けるために、imuxsock が Journal のシステムソケットを読み取らないようにする必要があります。これを行うには、$OmitLocalLogging ディレクティブを使用します。
$ModLoad imuxsock
$ModLoad imjournal

$OmitLocalLogging on
$AddUnixListenSocket /run/systemd/journal/syslog
Journal が保存したデータおよびメタデータはすべて、構造化メッセージに変換することができます。これらメタデータエントリーの一部は、例20.19「詳細な journalctl 出力」 に一覧表示されています。journal フィールドの全一覧については、systemd.journal-fields(7) man ページを参照してください。たとえば、kernel を元とするメッセージが使用する kernel journal fields にフォーカスすることができます。

20.8.2. 構造化メッセージのフィルタリング

rsyslog の解析モジュールで必要となる lumberjack 形式のメッセージを作成するには、以下のテンプレートを使用します。
template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n")
このテンプレートは @cee: 文字列を JSON 文字列の前に付加し、たとえば、omfile モジュールで出力ファイルを作成する際に適用することができます。JSON フィールド名にアクセスするには、$! 接頭辞を使用します。たとえば、以下のフィルター条件では、特定の hostnameUID のメッセージが検索されます。
($!hostname == "hostname" && $!UID== "UID")

20.8.3. JSON の解析

構造化メッセージの解析には、mmjsonparse モジュールが使用されます。これらのメッセージは Journal から来る場合もあれば、他の入力ソースから来る場合もあり、Lumberjack プロジェクトで定義された方法でフォーマットされている必要があります。これらのメッセージは @cee: 文字列の存在により識別されます。そして、JSON 構造が有効かどうかを mmjsonparse がチェックした後、メッセージが解析されます。
lumberjack 形式の JSON メッセージを mmjsonparse で解析するには、/etc/rsyslog.conf で以下の設定を使用します。
$ModLoad mmjsonparse

*.* :mmjsonparse:
この例では、mmjsonparse モジュールが最初の行で読み込まれ、その後にすべてのメッセージがそこに転送されます。現在は、mmjsonparse で使用可能な設定パラメーターはありません。

20.8.4. MongoDB でのメッセージの保存

Rsyslog は、ommongodb 出力モジュールで JSON ログの MongoDB ドキュメントデータベースでの保存をサポートします。
MongoDB にログメッセージを転送するには、/etc/rsyslog.conf で以下の構文を使用します (ommongodb 用の設定パラメーターは、新たな設定フォーマットでのみ利用可能です。「新規設定フォーマットの使用」 を参照してください)。
$ModLoad ommongodb

*.* action(type="ommongodb" server="DB_server" serverport="port" db="DB_name" collection="collection_name" uid="UID" pwd="password")
  • DB_server を MongoDB サーバーの名前もしくはアドレスに置き換えます。port を指定して、MongoDB サーバーから非標準ポートを選択します。port のデフォルト値は 0 で、通常はこのパラメーターを変換する必要はありません。
  • DB_name では、出力先となる MongoDB サーバー上のデータベースを特定します。collection_name をこのデータベース内のコレクション名で置き換えます。MongoDB ではコレクションはドキュメントのグループで、RDBMS テーブルと同等のものです。
  • UIDpassword を置き換えて、ログインの詳細を設定します。
テンプレートを使うと、最終的なデータベース出力の形式を形成できます。デフォルトでは、rsyslog は標準 lumberjack フィールド名をベースにしたテンプレートを使用します。