メインコンテンツまでスキップ
Sumo Logic Japanese

Heroku からのログの収集

Heroku ログ ドレインを HTTP Source の URL にポイントすることで、データを Heroku アプリケーションから Sumo Logic に直接アップロードする方法について説明します。

Heroku ログ ドレインで HTTP Source の URL を参照することで、データを Heroku アプリケーションから Sumo Logic に直接アップロードできます。ログ ドレインは、データのバッチを HTTP Source に直接転送します。

最初に、次の前提作業を実行します。

Heroku からのアプリケーション データのアップロード

Heroku コマンド ラインから、アプリケーションがチェックアウトされる Heroku ディレクトリに移動し、以下を入力します。

heroku drains:add
https://collectors.sumologic.com/rec...ourceURLtoken]

セットアップに成功すると、次のメッセージが表示されます。

Successfully added drain
https://collectors.sumologic.com/rec...ourceURLtoken]

ログ データが生成されると Heroku によって転送されるようになります。これは、Heroku の LogPlex システムの挙動によるものです。

(省略可能) アプリケーション名の FER のセットアップ

このステップは省略可能ですが、Sumo で Heroku アプリケーション ログのクエリが容易になるため、実行することをお勧めします。 

Sumo が Heroku アプリケーション ログを取り込むと、_sourceName メタデータ フィールドをデータに追加します。Sumo が割り当てる _sourceName はアプリケーションによって異なります。その値は、アプリケーションに割り当てられた Logplex ドレインの一意の識別子です。 

ログ データを理解しやすくするため、FER (Field Extraction Rules) を使用して _sourceName の名前をドレイン UUID からアプリケーション名に変更できます。FER に関する全般的な情報については、「FER (Field Extraction Rules) の作成」を参照してください。

アプリケーションについて heroku drains コマンドを実行すれば、ドレイン識別子を判断できます。識別子は、次のようになっています。 

d.98ee476d-d2d8-46bf-afc2-740f6f7e5b2a

続いて、Sumo で FER を定義します。

  1. [Manage Data (データの管理)] > [Settings (設定)] > [FER (Field Extraction Rules)] に移動します。
  2. Rule Name (ルール名): FER の名前を入力します。
  3. Scope (範囲): Heroku アプリケーション ログを転送する Source について定義された _sourceCategory を指定します。たとえば、_sourceCategory が「heroku」の場合、以下を入力します。
      
    _sourceCategory=heroku
  4. Parse Expression (parse 式): Sumo にデータをレポートする各 Heroku アプリケーションについて、_sourceName の名前をドレイン ID からアプリケーション名に変更するステートメントを入力します。たとえば、次のようになります。

    if (_sourceName="Drain_ID", "Application_Name", _sourceName) as _sourceName

    以下の FER は 2 つのアプリケーションの _sourceName の値を変更します。最初の行は _sourceNamed.98ee476d-d2d8-46bf-afc2-740f6f7e5b2a から CustApp に変更します。2 行目は _sourceNamed.00870f28-53f9-4680-b2ab-2287ec9d8637 から VendorApp に変更します。

    if (_sourceName="d.98ee476d-d2d8-46bf-afc2-740f6f7e5b2a", "CustApp", _sourceName) as _sourceName
    | if (_sourceName="d.00870f28-53f9-4680-b2ab-2287ec9d8637", "VendorApp", _sourceName) as _sourceName

Heroku Logplex に関する既知の問題

HTTP ベースの Heroku Logplex との統合は、単一行の順不同ログ メッセージでは問題ありません。

Sumo Logic HTTP Source では、複数行のメッセージ機能をすべて利用できます。しかし、Sumo Logic に送信される前の複数行のメッセージに対する Logplex の処理が原因で、複数行の機能の効果が大幅に制限されます。

影響を受ける使用事例として最も一般的なのは、Logplex を使用してスタック トレースを送信する場合です。スタック トレースの範囲は、単一行のカスタム アプリケーション ログとは異なり複数行に及びます。メッセージは次のように処理されます。

  • 複数行のログ メッセージが Logplex システムに送信されると、各行が個別のメッセージとして処理されます。
  • 各行の先頭に Heroku 固有の文字列が付きます。文字列には、ログ行に含まれるバイト数を示す整数があり、タイムスタンプ、優先度、ログ行を生成した Heroku コンポーネントが含まれる syslog スタイルの接頭辞が続きます。
  • このキューは順不同であるため、Logplex はメッセージの順序が変わらないことを保証しません。複数行のスタック トレースが Logplex に取り込まれた場合、同じ順序で送信されることは保証されません。

この挙動のため、以下の問題が発生する可能性があります。

  • 複数のシステムからのログ行が交互に配置される場合がある。スタック トレースの分解された行がたまたま正しい順序のままだったとしても、別のコンポーネントまたはインスタンスのログ行がスタック トレースのログ行と混在している可能性もあります。Sumo のお客様の体験から、このような交互配置は頻繁にあるわけではありませんが、可能性はあることがわかっています。
  • Logplex HTTP ログ ドレインを使用する場合、ログ行が一連の HTTPS POST 本文にまとめられる。スタック トレースの複数行が POST 本文で分割され、HTTP POST アクションが異なる Sumo Logic API ホスト間で負荷分散される可能性もあります。

次のオプションのいずれかが、こうした複数行のメッセージの順序に関する問題を解決するのに役立つ可能性があります。

  • 各行の接頭辞追加を回避する複数行の RegEx の境界を作成できます。ただし、交互配置、並べ替え、負荷分散の問題が発生すると、複数行の RegEx が失敗する可能性があります。
  • アプリケーション ロギング ライブラリを Sumo Logic アペンダと組み合わせて使用することで、Logplex インフラストラクチャをバイパスできます。こうしたライブラリの例として、Log4J と Sumo Logic Log4J アペンダの組み合わせがあります。この手法を使用すると、ログ行は Sumo Logic に直接送信され、元の形式が保持されます。Sumo Logic が提供するアペンダのリストについては、Sumo GitHub ページを参照してください。
  • この記事は役に立ちましたか?