Kategorier

Sist uppdaterad 17 september 2020

En Heroku-apps loggar sammanställs från utdata från alla processer, systemkomponenter och stödtjänster som körs. Herokus Logplex dirigerar loggströmmar från alla dessa olika källor till en enda kanal, vilket ger en grund för omfattande loggning.

Typer av loggar

Runtime-loggar

Heroku aggregerar följande kategorier av loggar för en distribuerad app:

  • App-loggar – Loggningsutgång från själva applikationen. Detta inkluderar loggar som genereras av appens kod och beroenden. (Filter: --source app)
  • Systemloggar – Meddelanden om åtgärder som vidtas av Heroku-plattformens infrastruktur för appens räkning, t.ex. omstart av en process som kraschat, vila eller väckning av en web dyno eller servering av en felsida på grund av ett problem i din app. (Filter: --source heroku)
  • API-loggar – Meddelanden om administrativa åtgärder som vidtas av dig och andra utvecklare som arbetar med din app, t.ex.: distribution av ny kod, skalning av processbildningen eller växling av underhållsläge. (Filter: --source app --dyno api)
  • Tilläggsloggar – Meddelanden från tilläggstjänster. Se artikeln Dev Center för tillägget för mer information. (Filtret varierar beroende på tilläggsprogram)

Byggloggar

Loggarna som genereras när appen byggs och distribueras är separata från appens körtidsloggar. Loggar för både lyckade och misslyckade byggen finns tillgängliga från appens Activity-flik i Heroku Dashboard:

Skärmdump av

Klicka på View build log för en bygghändelse i aktivitetsflödet för att se dess loggar:

Skärmdump av

Gränser för logghistorik

Logplex är utformat för att sammanställa och dirigera loggmeddelanden, inte för lagring. Den behåller de senaste 1 500 raderna av dina konsoliderade loggar, som upphör att gälla efter en vecka.

För mer produktionsklar persistens av loggar kan du lägga till ett av Heroku-plattformens tillgängliga loggningstillägg till din app. De flesta av dessa tillägg erbjuder en gratis plan för att komma igång.

Alternativt kan du implementera dina egna loggningsavlopp för att få full kontroll över vad som händer med dina loggar.

Skrivning till din logg

Allt som din app skriver till standard out (stdout) eller standard error (stderr) fångas upp i dina loggar. Detta innebär att du kan logga från var som helst i programkoden med ett enkelt utdatastatement.

I Ruby kan du använda något som:

puts "Hello, logs!"

I Java:

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

Det samma gäller för alla andra språk som stöds av Heroku.

För att kunna dra nytta av loggning i realtid kan du behöva inaktivera loggbuffertning som ditt program utför. I Ruby lägger du till exempel till följande i din config.ru-fil:

$stdout.sync = true

Vissa ramverk skickar loggutdata någon annanstans än stdout som standard. Dessa kan kräva extra konfiguration. När du till exempel använder Ruby on Rails TaggedLogger från ActiveSupport bör du lägga till följande i din appkonfiguration för att få stdout-loggning:

config.logger = Logger.new(STDOUT)

Loghämtning via CLI

Se loggar

För att hämta appens senaste loggar använder du kommandot 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 ...

I det här exemplet innehåller utdatan logglinjer från en av appens webbdynor, Heroku HTTP-routern och en av appens arbetare.

Kommandot logs hämtar 100 logglinjer som standard. Du kan ange antalet logglinjer som ska hämtas (upp till maximalt 1 500 rader) genom att använda alternativet --num (eller -n).

$ heroku logs -n 200

Real-time tail

Likt tail -f visar real-time tail de senaste loggarna och lämnar sessionen öppen för att realtidsloggar ska strömma in. Genom att visa en live-ström av loggar från din app kan du få en inblick i hur din live-applikation beter sig och felsöka aktuella problem.

Du kan svansa dina loggar med hjälp av --tail (eller -t).

$ heroku logs --tail

När du är klar trycker du på Ctrl+C för att återgå till prompten.

En svanssession i realtid avslutas automatiskt efter en timmes inaktivitet.

Logformat

Utdataformatet för kommandot heroku logs är följande:

timestamp source: message
  • Tidsstämpel – Det datum och den tid som registrerades vid den tidpunkt då logglinjen producerades av dynan eller komponenten. Tidsstämpeln är i det format som anges i RFC5424 och har en precision på en mikrosekund.
  • Källa – Alla appens dynor (webbdynor, bakgrundsarbetare, cron) har källan, app. Alla Herokus systemkomponenter (HTTP-router, dyno manager) har källan, heroku.
  • Dyno – Namnet på den dyno eller komponent som skrev loggraden. Till exempel visas arbetare nr 3 som worker.3 och Heroku HTTP-routern som router.
  • Meddelande – Innehållet i loggraden. Linjer som genereras av dynos och som överstiger 10000 byte delas upp i 10000 byte-bitar utan extra avslutande nya rader. Varje bit skickas in som en separat logglinje.

Filtrering

Om du bara vill hämta loggar med en viss källa, en viss dyno eller båda kan du använda filtreringsargumenten --source (eller -s) och --dyno (eller -d):

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

När du filtrerar efter dyno, kan du antingen ange basnamnet (t.ex, --dyno web) eller det fullständiga namnet (t.ex, --dyno web.1) kan användas.

Du kan också kombinera filtreringsswitcharna med --tail för att få en realtidsström av filtrerad utdata.

$ heroku logs --source app --tail

Logmeddelandeordning

När du hämtar loggar kanske du märker att de inte alltid är i exakt kronologisk ordning, särskilt när flera komponenter är inblandade. Loggar kommer från många källor (routernoder, dynor osv.) och sammanställs till en enda loggström av Logplex. Logplex själv använder en distribuerad arkitektur för att säkerställa hög tillgänglighet, vilket innebär att loggmeddelanden kan samlas in över flera Logplex-noder och därför levereras i fel ordning.

Logghämtning via webbdisplaypanelen

Visa loggar

Du kan visa dina loggar på webben genom att logga in på din Heroku-dashboard. Navigera till den app du vill se till exempel https://dashboard.heroku.com/apps/<app-name>. När du är på denna sida väljer du ”more” och du bör se en rullgardinsmeny:

I denna meny väljer du ”View logs”.

Leave a Reply