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

Heroku からのログの収集

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

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

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

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) を使用して _sourceName の名前をドレイン UUID からアプリケーション名に変更できます。FER に関する全般的な情報については、「フィールド抽出ルールの作成」を参照してください。

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

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

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

  1. [Manage Data (データの管理)] > [Settings (設定)] > [Field Extraction Rules (フィールド抽出ルール)] に移動します。
  2. Rule Name (ルール名): FER の名前を入力します。
  3. Scope (範囲): Heroku アプリケーション ログを転送するソースについて定義された _sourceCategory を指定します。たとえば、_sourceCategory が「heroku」の場合、以下を入力します。
      
    _sourceCategory=heroku
  4. Parse Expression (パース式): 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 ソースでは、複数行のメッセージ機能をすべて利用できます。しかし、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 ページを参照してください。
  • この記事は役に立ちましたか?