ログ記録
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年06月14日(水)
Heroku アプリのログは、実行中プロセス、システムコンポーネント、およびバッキングサービスすべての出力ストリームから受け取ります。Heroku の Logplex は、すべてのソースからのログストリームを単一のチャネルにルーティングし、包括的なログ記録の基盤を提供します。
Shield Space の Private Space Logging では Logplex は使用されません。詳細は、「Private Space Logging」を参照してください。
ランタイムログ
Heroku は、デプロイされたアプリの次のカテゴリのログを集約します。
- アプリログ - アプリのコードおよび依存関係によって生成されるログを含む、アプリケーション自体からのログ出力。(フィルター:
--source app
) - システムログ - クラッシュしたプロセスの再起動、Web dyno のスリープまたはスリープ解除、アプリでの問題によるエラーページの表示など、アプリの代わりに Heroku プラットフォームインフラストラクチャが行った操作に関するメッセージ。(フィルター:
--source heroku
) - API ログ - 新しいコードのデプロイ、プロセス構成のスケーリング、メンテナンスモードの切り替えなど、ユーザーまたはアプリを操作している他の開発者が行った管理操作に関するメッセージ。(フィルター:
--source app --dyno api
) - アドオンログ - アドオンサービスからのメッセージ。詳細については、アドオンの Dev Center 記事を参照してください。(フィルターはアドオンによって異なります)
ビルドログ
アプリのビルドおよびデプロイ中に生成されたログは、アプリのランタイムログから切り離されます。成功および失敗した両方のビルドのログは、Heroku Dashboard のアプリの Activity
(アクティビティ) タブから使用できます。
アクティビティフィードでいずれのビルドイベントに対して View build log
(ビルドログの表示) をクリックします。
ログ履歴の制限
Logplex は、保管用ではなく、ログメッセージを照合してルーティングするように設計されています。最新の 1,500 行の統合されたログを保持し、1 週間後に期限切れになります。
ログの本番準備完了の持続性を高めるために、Heroku プラットフォームの使用可能なログ記録アドオンのいずれかをアプリに追加します。これらのアドオンのほとんどには、開始するための無料プランが用意されています。
または、ログに行われる操作を完全に制御するために、独自のログドレインを実装します。
ログへの書き込み
アプリが標準出力 (stdout
) または標準エラー (stderr
) に書き込むものすべてがログに取得されます。単純な出力文で、アプリケーションコードのどこからでもログ記録できます。
Ruby では、次のように使用できます。
puts "Hello, logs!"
Java の場合は次のようになります。
System.err.println("Hello, logs!");
System.out.println("Hello, logs!");
Heroku がサポートする他のすべての言語に同じことが当てはまります。
リアルタイムのログ記録を利用するには、アプリケーションが実行しているすべてのログバッファリングを無効にします。たとえば、Ruby では、config.ru
ファイルに次のコードを追加します。
$stdout.sync = true
フレームワークによっては、デフォルトで、stdout
以外の場所にログ出力を送信するため、追加の設定が必要になります。たとえば、ActiveSupport により Rails TaggedLogger で Ruby を使用する場合、アプリの設定に次のように追加して、stdout
ログ記録を取得します。
config.logger = Logger.new(STDOUT)
詳細は、「Writing Best Practices For Application Logs」(アプリケーションログの書き込みに関するベストプラクティス) を参照してください。
ログの表示
ログの表示は、Heroku CLI、ダッシュボード、ログ記録アドオン、またはログドレインで行うことができます。
Private Space Logging が有効化されている場合は Shield Space 内のアプリのログを表示できません。代わりにログドレインからログを取得してください。
Heroku CLI を使用したログの表示
ログにエラーが表示された場合、詳細については、Heroku エラーコードまたはトラブルシューティングの記事を参照してください。
アプリの最新のログを取得するには、heroku logs
コマンドを使用します。
$ heroku logs
2010-09-16T15:13:46.677020+00:00 app[web.1]: Processing PostController#list (for 208.39.138.12 at 2010-09-16 15:13:46) [GET]
2010-09-16T15:13:46.677023+00:00 app[web.1]: Rendering template within layouts/application
2010-09-16T15:13:46.677902+00:00 app[web.1]: Rendering post/list
2010-09-16T15:13:46.678990+00:00 app[web.1]: Rendered includes/_header (0.1ms)
2010-09-16T15:13:46.698234+00:00 app[web.1]: Completed in 74ms (View: 31, DB: 40) | 200 OK [http://example-app-1234567890ab.heroku.com/]
2010-09-16T15:13:46.723498+00:00 heroku[router]: at=info method=GET path="/posts" host=example-app-1234567890ab.herokuapp.com" fwd="204.204.204.204" dyno=web.1 connect=1ms service=18ms status=200 bytes=975
2010-09-16T15:13:47.893472+00:00 app[worker.1]: 2 jobs processed at 16.6761 j/s, 0 failed ...
この例では、出力には、アプリの Web dyno のいずれか、Heroku HTTP ルーター、アプリの Worker のいずれかからのログ行が含まれます。詳細は、「Heroku のログ形式とメッセージの順序付け」を参照してください。
logs
コマンドは、デフォルトで 100 ログ行を返します。--num
(または -n
) オプションを使用して、取得するログ行数を指定できます (最大 1,500 行)。
$ heroku logs -n 200
リアルタイム tail
tail -f
と同様に、リアルタイム tail は、最新のログを表示し、リアルタイムログが流入できるようにセッションを開いたままにします。アプリからログのライブストリームを表示することにより、ライブアプリケーションの動作に対する洞察が得られ、現在の問題をデバッグできます。
--tail
(または -t
) を使用してログを末尾監視できます。
$ heroku logs --tail
終了したら、Ctrl+C を押してプロンプトに戻ります。
アイドル状態が 1 時間続いた後、リアルタイム tail セッションは自動的に終了します。
フィルタリング
特定のソースまたは特定の dyno、あるいはその両方のログだけを取得する場合は、--source
(または -s
) と --dyno
(または -d
) フィルタリング引数を使用できます。
$ heroku logs --dyno router
2012-02-07T09:43:06.123456+00:00 heroku[router]: 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=13
2012-02-07T09:43:06.123456+00:00 heroku[router]: 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 app
2012-02-07T09:45:47.123456+00:00 app[web.1]: Rendered shared/_search.html.erb (1.0ms)
2012-02-07T09:45:47.123456+00:00 app[web.1]: Completed 200 OK in 83ms (Views: 48.7ms | ActiveRecord: 32.2ms)
2012-02-07T09:45:47.123456+00:00 app[worker.1]: [Worker(host:465cf64e-61c8-46d3-b480-362bfd4ecff9 pid:1)] 1 jobs processed at 23.0330 j/s, 0 failed ...
2012-02-07T09:46:01.123456+00:00 app[web.6]: Started GET "/articles/buildpacks" for 4.1.81.209 at 2012-02-07 09:46:01 +0000
$ heroku logs --source app --dyno worker
2012-02-07T09:47:59.123456+00:00 app[worker.1]: [Worker(host:260cf64e-61c8-46d3-b480-362bfd4ecff9 pid:1)] Article#record_view_without_delay completed after 0.0221
2012-02-07T09:47:59.123456+00:00 app[worker.1]: [Worker(host:260cf64e-61c8-46d3-b480-362bfd4ecff9 pid:1)] 5 jobs processed at 31.6842 j/s, 0 failed ...
dyno でフィルタリングするときには、ベース名 (--dyno web
など) とフルネーム (--dyno web.1
など) のどちらでも使用できます。
フィルタリングスイッチを、--tail
と組み合わせて、フィルタリング出力のリアルタイムストリームを取得することもできます。
$ heroku logs --source app --tail
Heroku Dashboard を使用したログの表示
Heroku ダッシュボードにログインして、Web 上でログを表示できます。表示するアプリに移動します (たとえば、https://dashboard.heroku.com/apps/<app-name>
)。このページで 「More」 (詳細) を選択すると、ドロップダウンメニューが表示されます。
このメニューで、View logs
(ログの表示) を選択します。詳細は、「Heroku のログ形式とメッセージの順序付け」を参照してください。
ログ記録アドオンを使用したログの表示
Heroku プラットフォームで利用可能ないずれかのログ記録アドオンをアプリに追加することをお勧めします。これらのアドオンのほとんどには、開始するための無料プランが用意されています。ログの取得に関する手順については、アドオンのドキュメントを参照してください。
あるいは、カスタムのログドレインを実装することもできます。
Heroku のログ形式とメッセージの順序付け
Heroku の Logplex ルーターは、プラットフォームのアプリおよびその他のコンポーネントによって生成されたログエントリの照合と配信を行います。
Shield Space の Private Space Logging では Logplex は使用されません。ログ形式については、「Private Space Logging」を参照してください。
ログは発生順ではありません。ログは多くのソースから生成され、Logplex により単一のログストリームにアセンブルされます。Logplex 自体は、分散アーキテクチャを使用して高可用性を確保するので、ログメッセージは複数の Logplex ノード間で収集されるため、バラバラの順序となることがあります。
heroku logs
コマンドの出力形式は次のようになります。
timestamp source[dyno]: message
- タイムスタンプ - dyno またはコンポーネントによってログ行が生成された時点で記録された日時。タイムスタンプは、RFC5424 で指定された形式で、マイクロ秒精度を含みます。
- ソース - アプリの dyno (Web dyno、バックグラウンド Worker、cron) すべてには、ソース (
app
) があります。Heroku のシステムコンポーネント (HTTP ルーター、dyno マネージャ) すべてには、ソース (heroku
) があります。 - dyno - ログ行を書き込む dyno またはコンポーネントの名前。たとえば、Worker #3 は
worker.3
と表示され、Heroku HTTP ルーターはrouter
と表示されます。 - メッセージ - ログ行の内容。Logplex では、10000 バイトを超える dyno によって生成される行は、末尾に新規行を追加せず、10000 バイトのチャンクに分割されます。チャンクはそれぞれ、個別のログ行として提示されます。