Show Table of Contents
22.8. Rsyslog での構造化ロギング
大量のログデータを生成するシステムでは、ログメッセージを 構造化されたフォーマット で維持すると便利です。構造化メッセージは、特定情報の検索や統計情報の作成、メッセージ構造の変更およびその不整合への対応が容易になります。Rsyslog は JSON (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 についての詳細情報は、「オンラインのドキュメント」 を参照してください。
以下は、lumberjack 形式のメッセージの例です。
@cee: {"pid":17055, "uid":1000, "gid":1000, "appname":"logger", "msg":"Message text."}
この構造を Rsyslog 内に構築するには、テンプレートを使用します。「構造化メッセージのフィルタリング」 を参照してください。アプリケーションおよびサーバーは、
libumberlog ライブラリーを用いて lumberjack 準拠の形式でメッセージを生成できます。libumberlog についての詳細情報は、「オンラインのドキュメント」 を参照してください。
22.8.1. Journal からのデータのインポート
imjournal モジュールは Rsyslog の入力モジュールで、ネイティブに journal ファイルを読み取ります (「Rsyslog と Journal の相互作用」 を参照)。その後、Journal メッセージは、他の rsyslog メッセージのようにテキスト形式でログ記録されます。しかし、さらに処理することで、Journal が提供するメタデータを構造化メッセージに変換することが可能です。
Journal から Rsyslog にデータをインポートするには、
/etc/rsyslog.conf で以下の設定を使用します。
module(load=”imjournal”
PersistStateInterval=”number_of_messages”
StateFile=”path”
ratelimit.interval=”seconds”
ratelimit.burst=”burst_number”
IgnorePreviousMessages=”off/on”)- number_of_messages では、journal データの保存頻度を指定できます。指定されたメッセージ数に達すると、毎回データが保存されます。
- path は、state ファイルへのパスに置き換えます。このファイルは、最後に処理された journal エントリーを追跡します。
- seconds では、レート制限の間隔を設定します。この間隔内に処理されるメッセージ数は、burst_number で指定した値を超えることはできません。デフォルト設定は、600 秒あたり 20,000 メッセージです。Rsyslog は、この指定された時間枠内で最大バースト後に届いたメッセージを破棄します。
IgnorePreviousMessagesで、現在ジャーナルにあるメッセージを無視し、新しいメッセージのみをインポートできます。指定された状態ファイルがない場合に使用されます。デフォルト設定はoffです。この設定がオフで状態ファイルが存在しない場合、前回の rsyslog セッションで処理されたものであっても、ジャーナルのすべてのメッセージが処理されます。
注記
imjournal を従来のシステムログ入力である imuxsock モジュールと同時に使用できます。ただし、メッセージの重複を避けるために、imuxsock がジャーナルのシステムソケットを読まないようにする必要があります。そのために、SysSock.Use ディレクティブを使用します。
module(load”imjournal”)
module(load”imuxsock”
SysSock.Use=”off”
Socket="/run/systemd/journal/syslog")
Journal が保存したデータおよびメタデータはすべて、構造化メッセージに変換することができます。これらメタデータエントリーの一部は、例22.19「詳細な journalctl 出力」 に一覧表示されています。journal フィールドの全一覧については、
systemd.journal-fields(7) man ページを参照してください。たとえば、kernel を元とするメッセージが使用する kernel journal fields にフォーカスすることができます。
22.8.2. 構造化メッセージのフィルタリング
rsyslog の解析モジュールで必要となる lumberjack 形式のメッセージを作成するには、以下のテンプレートを使用します。
template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n")
このテンプレートは
@cee: 文字列を JSON 文字列の前に付加し、たとえば、omfile モジュールで出力ファイルを作成する際に適用することができます。JSON フィールド名にアクセスするには、$! 接頭辞を使用します。たとえば、以下のフィルター条件では、特定の hostname と UID のメッセージが検索されます。
($!hostname == "hostname" && $!UID== "UID")
22.8.3. JSON の解析
構造化メッセージの解析には、
mmjsonparse モジュールが使用されます。これらのメッセージは Journal から来る場合もあれば、他の入力ソースから来る場合もあり、Lumberjack プロジェクトで定義された方法でフォーマットされている必要があります。これらのメッセージは @cee: 文字列の存在により識別されます。そして、JSON 構造が有効かどうかを mmjsonparse がチェックした後、メッセージが解析されます。
lumberjack 形式の JSON メッセージを
mmjsonparse で解析するには、/etc/rsyslog.conf で以下の設定を使用します。
module(load”mmjsonparse”) *.* :mmjsonparse:
この例では、
mmjsonparse モジュールが最初の行で読み込まれ、その後にすべてのメッセージがそこに転送されます。現在は、mmjsonparse で使用可能な設定パラメーターはありません。
22.8.4. MongoDB でのメッセージの保存
Rsyslog は、ommongodb 出力モジュールで JSON ログの MongoDB ドキュメントデータベースでの保存をサポートします。
MongoDB にログメッセージを転送するには、
/etc/rsyslog.conf で以下の構文を使用します (ommongodb 用の設定パラメーターは、新たな設定フォーマットでのみ利用可能です。「新規設定フォーマットの使用」 を参照してください)。
module(load”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 テーブルと同等のものです。
- UID と password を置き換えて、ログインの詳細を設定します。
テンプレートを使うと、最終的なデータベース出力の形式を形成できます。デフォルトでは、rsyslog は標準 lumberjack フィールド名をベースにしたテンプレートを使用します。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.