Categories

Last updated September 17, 2020

A Heroku アプリのログは、その実行プロセス、システム コンポーネント、およびバック サービスのすべての出力ストリームから集約されます。 Heroku の Logplex は、これらの多様なソースすべてからのログ ストリームを単一のチャネルにルーティングし、包括的なログの基礎を提供します。

ログの種類

Runtime logs

Heroku は展開したアプリの次のカテゴリーのログを集約します:

  • アプリ ログ – アプリケーション自体からのログ出力です。 これには、アプリのコードと依存関係によって生成されたログが含まれます。 (Filter: --source app)
  • System logs – Heroku platform infrastructure on behalf of your app によって実行されたアクションに関するメッセージ。 (Filter: --source heroku)
  • API logs – あなたやあなたのアプリで働く他の開発者によって行われた管理アクションに関するメッセージです:新しいコードのデプロイ、プロセス形成のスケール、メンテナンスモードのトグルなど。 (フィルター: --source app --dyno api)
  • アドオン ログ – アドオン サービスからのメッセージ。 詳細については、アドオンの Dev Center の記事を参照してください。 (フィルタはアドオンによって異なります)

Build logs

アプリの構築およびデプロイ中に生成されるログは、アプリのランタイムログとは別のものです。 成功したビルドと失敗したビルドの両方のログは、Heroku ダッシュボードのアプリの Activity タブから利用できます。

のスクリーンショット

Activity Feed で任意のビルド イベントの View build log をクリックして、ログを確認します。

のスクリーンショット

Log history limits

Logplex はログ メッセージを照合およびルーティングするために設計されており、保存するためのものではありません。 これは、統合されたログの最新の 1,500 行を保持し、1 週間後に失効します。

ログをより本番環境で持続させるには、Heroku プラットフォームの利用可能なログ記録アドオンのいずれかをアプリに追加することができます。 これらのアドオンのほとんどは、開始するための無料プランを提供しています。

あるいは、ログに何が起こるかを完全に制御するために、独自のログ ドレインを実装することができます。

Ruby では、次のようなものを使用できます:

puts "Hello, logs!"

Java:

System.err.println("Hello, logs!");System.out.println("Hello, logs!");

同じことが Heroku がサポートする他のすべての言語についても当てはまります。 たとえば、Ruby では、以下を config.ru ファイルに追加します:

$stdout.sync = true

いくつかのフレームワークは、デフォルトで stdout 以外の場所にログ出力を送信します。 これらは特別な設定を必要とするかもしれません。 たとえば、ActiveSupport 社の Ruby on Rails TaggedLogger を使用する場合、以下をアプリの設定に追加して stdout のログを取得する必要があります。

config.logger = Logger.new(STDOUT)

Log retrieval via CLI

View logs

アプリの最新のログを取得するには、heroku logsコマンドを使用します。

$ heroku logs2010-09-16T15:13:46.677020+00:00 app: Processing PostController#list (for 208.39.138.12 at 2010-09-16 15:13:46) 2010-09-16T15:13:46.677023+00:00 app: Rendering template within layouts/application2010-09-16T15:13:46.677902+00:00 app: Rendering post/list2010-09-16T15:13:46.678990+00:00 app: Rendered includes/_header (0.1ms)2010-09-16T15:13:46.698234+00:00 app: Completed in 74ms (View: 31, DB: 40) | 200 OK 2010-09-16T15:13:46.723498+00:00 heroku: at=info method=GET path="/posts" host=myapp.herokuapp.com" fwd="204.204.204.204" dyno=web.1 connect=1ms service=18ms status=200 bytes=9752010-09-16T15:13:47.893472+00:00 app: 2 jobs processed at 16.6761 j/s, 0 failed ...

この例では、アプリの Web dynos、Heroku HTTP ルーター、アプリのワーカーの 1 つからのログ行が出力されています。

logsコマンドは、デフォルトで100行のログを取得します。

$ heroku logs -n 200

Real-time tail

は、tail -fと同様に最近のログを表示し、リアルタイムのログが流れてくるまでセッションを開いたままにします。 アプリケーションからのログのライブストリームを表示することで、ライブアプリケーションの動作を把握し、現在の問題をデバッグできます。

ログは、--tail (または -t) を使用してテールできます。

$ heroku logs --tail

終了したら、Ctrl+C キーを押して、プロンプトに戻ります。

リアルタイムtailセッションは、1時間操作がないと自動的に終了します。

Log format

heroku logsコマンドの出力形式は次のとおりです:

timestamp source: message
  • Timestamp – ログラインがダイノまたはコンポーネントで生成された時点で記録される日付と時刻です。 タイムスタンプはRFC5424で指定された形式で、マイクロ秒の精度を含みます。
  • ソース – アプリのすべてのダイノ(Webダイノ、バックグラウンドワーカー、cron)は、appというソースを持ちます。 Herokuのすべてのシステムコンポーネント(HTTPルーター、ダイノマネージャー)のソースは、herokuです。
  • Dyno – ログ行を書き込んだダイノまたはコンポーネントの名前です。 例えば、ワーカー #3 は worker.3 と表示され、Heroku HTTP ルーターは router.
  • Message – ログ行の内容です。 10000バイトを超えるダイノによって生成された行は、余分な末尾の改行がない10000バイトのチャンクに分割されます。 各チャンクは個別のログ行として送信されます。

Filtering

特定のソース、特定のダイノ、またはその両方を含むログのみを取得したい場合、--source (または -s) および --dyno (または -d) filtering 引数を使用できます:

$ heroku logs --dyno router2012-02-07T09:43:06.123456+00:00 heroku: at=info method=GET path="/stylesheets/dev-center/library.css" host=devcenter.heroku.com fwd="204.204.204.204" dyno=web.5 connect=1ms service=18ms status=200 bytes=132012-02-07T09:43:06.123456+00:00 heroku: at=info method=GET path="/articles/bundler" host=devcenter.heroku.com fwd="204.204.204.204" dyno=web.6 connect=1ms service=18ms status=200 bytes=20375$ heroku logs --source app2012-02-07T09:45:47.123456+00:00 app: Rendered shared/_search.html.erb (1.0ms)2012-02-07T09:45:47.123456+00:00 app: Completed 200 OK in 83ms (Views: 48.7ms | ActiveRecord: 32.2ms)2012-02-07T09:45:47.123456+00:00 app: 1 jobs processed at 23.0330 j/s, 0 failed ...2012-02-07T09:46:01.123456+00:00 app: Started GET "/articles/buildpacks" for 4.1.81.209 at 2012-02-07 09:46:01 +0000$ heroku logs --source app --dyno worker2012-02-07T09:47:59.123456+00:00 app: Article#record_view_without_delay completed after 0.02212012-02-07T09:47:59.123456+00:00 app: 5 jobs processed at 31.6842 j/s, 0 failed ...

ダイノでフィルタリングするとき、ベース名(例:, --dyno web) または完全な名前 (例,

また、フィルタリングスイッチを --tail と組み合わせると、フィルタリングされた出力のリアルタイムストリームを取得できます。

$ heroku logs --source app --tail

Log message ordering

ログを取得するとき、特に複数のコンポーネントが関与する場合、それらが常に正確な時間順ではないことに気付くかもしれません。 ログは多くのソース (ルーター ノード、ダイノなど) から発信され、Logplex によって 1 つのログ ストリームに組み立てられます。 Logplex 自体は、高可用性を確保するために分散アーキテクチャを使用します。つまり、ログ メッセージは複数の Logplex ノードにわたって収集され、したがって、順番通りに配信されない場合があります。

ウェブ ダッシュボードによるログ取得

View logs

自分の Heroku ダッシュボードにログインして、ウェブでログを表示することができます。 見たいアプリ(例:https://dashboard.heroku.com/apps/<app-name>)に移動します。 このページで「その他」を選択すると、ドロップダウンメニューが表示されます:

このメニューで「ログを表示」を選択します。

Leave a Reply