Kategorien

Letzte Aktualisierung am 17. September 2020

Die Logs einer Heroku-App werden aus den Ausgabeströmen aller laufenden Prozesse, Systemkomponenten und unterstützenden Dienste aggregiert. Logplex von Heroku leitet Protokollströme aus all diesen verschiedenen Quellen in einen einzigen Kanal und bietet so eine Grundlage für eine umfassende Protokollierung.

Arten von Protokollen

Laufzeitprotokolle

Heroku aggregiert die folgenden Kategorien von Protokollen für eine bereitgestellte App:

  • App-Protokolle – Protokollierungsausgaben der Anwendung selbst. Dazu gehören Protokolle, die durch den Code und die Abhängigkeiten Ihrer Anwendung generiert werden. (Filter: --source app)
  • Systemprotokolle – Meldungen über Aktionen, die von der Heroku-Plattforminfrastruktur im Auftrag Ihrer Anwendung durchgeführt werden, wie z. B.: Neustart eines abgestürzten Prozesses, Schlafen oder Aufwecken eines Web-Dynos oder Bereitstellen einer Fehlerseite aufgrund eines Problems in Ihrer Anwendung. (Filter: --source heroku)
  • API-Protokolle – Meldungen zu administrativen Aktionen, die von Ihnen und anderen Entwicklern, die an Ihrer App arbeiten, durchgeführt wurden, wie z. B.: Bereitstellung von neuem Code, Skalierung der Prozessbildung oder Umschalten des Wartungsmodus. (Filter: --source app --dyno api)
  • Add-on-Protokolle – Meldungen von Add-on-Diensten. Einzelheiten finden Sie im Dev Center-Artikel des Add-ons. (Filter variiert je nach Add-on)

Erstellungsprotokolle

Die Protokolle, die während der Erstellung und Bereitstellung Ihrer Anwendung erzeugt werden, sind von den Laufzeitprotokollen der Anwendung getrennt. Protokolle für erfolgreiche und nicht erfolgreiche Builds sind auf der Registerkarte Activity Ihrer App im Heroku Dashboard verfügbar:

Screenshot von

Klicken Sie auf View build log für ein beliebiges Build-Ereignis im Activity Feed, um dessen Protokolle zu sehen:

Screenshot von

Protokollverlaufsgrenzen

Logplex ist zum Sammeln und Weiterleiten von Protokollnachrichten gedacht, nicht zum Speichern. Es speichert die letzten 1.500 Zeilen Ihrer konsolidierten Protokolle, die nach einer Woche ablaufen.

Für eine produktivere Persistenz von Protokollen können Sie eines der verfügbaren Protokollierungs-Add-ons der Heroku-Plattform zu Ihrer Anwendung hinzufügen. Die meisten dieser Add-ons bieten einen kostenlosen Plan für den Einstieg an.

Alternativ können Sie Ihre eigenen Log Drains implementieren, um die volle Kontrolle darüber zu haben, was mit Ihren Logs passiert.

Schreiben in Ihr Log

Alles, was Ihre App an Standard Out (stdout) oder Standard Error (stderr) schreibt, wird in Ihren Logs erfasst. Das bedeutet, dass Sie mit einer einfachen Ausgabeanweisung von jeder Stelle in Ihrem Anwendungscode protokollieren können.

In Ruby könnten Sie etwas wie folgt verwenden:

puts "Hello, logs!"

In Java:

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

Das Gleiche gilt für alle anderen von Heroku unterstützten Sprachen.

Um die Vorteile der Echtzeitprotokollierung zu nutzen, müssen Sie möglicherweise die Protokollpufferung Ihrer Anwendung deaktivieren. Fügen Sie zum Beispiel in Ruby Folgendes zu Ihrer config.ru-Datei hinzu:

$stdout.sync = true

Einige Frameworks senden die Log-Ausgabe standardmäßig an eine andere Stelle als stdout. Diese erfordern möglicherweise eine zusätzliche Konfiguration. Wenn Sie z. B. den Ruby on Rails TaggedLogger von ActiveSupport verwenden, sollten Sie Folgendes in die Konfiguration Ihrer Anwendung aufnehmen, um eine stdout-Protokollierung zu erhalten:

config.logger = Logger.new(STDOUT)

Protokollabruf über CLI

Protokolle anzeigen

Um die aktuellsten Protokolle Ihrer App abzurufen, verwenden Sie den Befehl 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 ...

In diesem Beispiel umfasst die Ausgabe Protokollzeilen von einem der Web-Dynos der App, dem Heroku-HTTP-Router und einem der Worker der App.

Der Befehl logs ruft standardmäßig 100 Protokollzeilen ab. Mit der Option --num (oder -n) können Sie die Anzahl der abzurufenden Protokollzeilen angeben (bis zu einem Maximum von 1.500 Zeilen).

$ heroku logs -n 200

Echtzeit-Tail

Ähnlich wie tail -f zeigt Echtzeit-Tail die letzten Protokolle an und lässt die Sitzung offen, damit Echtzeit-Protokolle einströmen können. Indem Sie einen Live-Stream von Protokollen Ihrer Anwendung anzeigen, können Sie einen Einblick in das Verhalten Ihrer Live-Anwendung gewinnen und aktuelle Probleme beheben.

Sie können Ihre Protokolle mit --tail (oder -t) verfolgen.

$ heroku logs --tail

Wenn Sie fertig sind, drücken Sie Strg+C, um zur Eingabeaufforderung zurückzukehren.

Eine Echtzeit-Tail-Sitzung wird automatisch nach einer Stunde Inaktivität beendet.

Protokollformat

Das Ausgabeformat des Befehls heroku logs ist wie folgt:

timestamp source: message
  • Zeitstempel – Das Datum und die Uhrzeit, die zu dem Zeitpunkt aufgezeichnet wurden, als die Protokollzeile vom Prüfstand oder der Komponente erzeugt wurde. Der Zeitstempel ist in dem von RFC5424 spezifizierten Format und enthält eine Genauigkeit von Mikrosekunden.
  • Quelle – Alle Dynos Ihrer Anwendung (Web-Dynos, Hintergrund-Worker, Cron) haben die Quelle, app. Alle Systemkomponenten von Heroku (HTTP-Router, Dyno-Manager) haben die Quelle heroku.
  • Dyno – Der Name des Dynos oder der Komponente, die die Protokollzeile geschrieben hat. Zum Beispiel erscheint Worker #3 als worker.3, und der Heroku HTTP-Router erscheint als router.
  • Message – Der Inhalt der Protokollzeile. Von Dynos generierte Zeilen, die 10000 Byte überschreiten, werden in 10000-Byte-Blöcke ohne zusätzliche Zeilenumbrüche am Ende aufgeteilt. Jedes Stück wird als separate Protokollzeile übermittelt.

Filterung

Wenn Sie nur Protokolle mit einer bestimmten Quelle, einem bestimmten Dyno oder beidem abrufen möchten, können Sie die --source (oder -s) und --dyno (oder -d) Filterargumente verwenden:

$ 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 ...

Beim Filtern nach Dyno kann entweder der Basisname (z.B., --dyno web) oder der vollständige Name (z. B., --dyno web.1) verwendet werden.

Sie können die Filterschalter auch mit --tail kombinieren, um einen Echtzeitstrom gefilterter Ausgaben zu erhalten.

$ heroku logs --source app --tail

Reihenfolge der Protokollnachrichten

Beim Abrufen von Protokollen fällt Ihnen vielleicht auf, dass sie nicht immer in exakter chronologischer Reihenfolge sind, insbesondere wenn mehrere Komponenten beteiligt sind. Die Protokolle stammen aus vielen Quellen (Routerknoten, Dynos usw.) und werden von Logplex zu einem einzigen Protokollstrom zusammengestellt. Logplex selbst verwendet eine verteilte Architektur, um eine hohe Verfügbarkeit zu gewährleisten, was bedeutet, dass Log-Meldungen über mehrere Logplex-Knoten gesammelt und daher in ungeordneter Reihenfolge geliefert werden können.

Log-Abruf über das Web-Dashboard

Logs anzeigen

Sie können Ihre Logs im Web anzeigen, indem Sie sich in Ihr Heroku-Dashboard einloggen. Navigieren Sie zu der App, die Sie sehen möchten, zum Beispiel https://dashboard.heroku.com/apps/<app-name>. Sobald Sie auf dieser Seite sind, wählen Sie „mehr“ und Sie sollten ein Dropdown-Menü sehen:

Wählen Sie in diesem Menü „Protokolle anzeigen“.

Leave a Reply