Kategorier

Sidst opdateret 17. september 2020

En Heroku-apps logfiler er samlet fra output-strømme fra alle de kørende processer, systemkomponenter og backing-tjenester. Herokos Logplex dirigerer logstrømme fra alle disse forskellige kilder til en enkelt kanal, hvilket giver et grundlag for omfattende logning.

Typer af logs

Logfiler fra løbetid

Heroku aggregerer følgende kategorier af logfiler for en implementeret app:

  • App-logfiler – Logning af output fra selve applikationen. Dette omfatter logfiler, der genereres af din app’s kode og afhængigheder. (Filter: --source app)
  • Systemlogfiler – Meddelelser om handlinger, der udføres af Heroku-platformens infrastruktur på vegne af din app, f.eks.: genstart af en proces, der er styrtet ned, dvale eller vække en webdyno, eller servering af en fejlside på grund af et problem i din app. (Filter: --source heroku)
  • API-logfiler – Meddelelser om administrative handlinger udført af dig og andre udviklere, der arbejder på din app, f.eks.: implementering af ny kode, skalering af procesdannelsen eller omskiftning af vedligeholdelsestilstand. (Filter: --source app --dyno api)
  • Logfiler for tilføjelsesprogrammer – Meddelelser fra tilføjelsestjenester. Se artiklen om add-on’ets Dev Center for at få flere oplysninger. (Filter varierer efter add-on)

Build logs

De logfiler, der genereres under opbygning og implementering af din app, er adskilt fra appens runtime-logfiler. Logfiler for både vellykkede og mislykkede builds er tilgængelige fra din apps Activity-fane i Heroku Dashboard:

Screenshot af

Klik på View build log for en hvilken som helst build-hændelse i aktivitetsfeedet for at se logfilerne hertil:

Skærmbillede af

Loghistorikgrænser

Logplex er designet til at samle og videresende logmeddelelser, ikke til lagring. Den bevarer de seneste 1.500 linjer af dine konsoliderede logfiler, som udløber efter 1 uge.

For mere produktionsklar persistens af logfiler kan du tilføje en af Heroku-platformens tilgængelige logging add-ons til din app. De fleste af disse add-ons tilbyder en gratis plan for at komme i gang.

Alternativt kan du implementere dine egne logafløb for at få fuld kontrol over, hvad der sker med dine logfiler.

Skrivning til din log

Alt, hvad din app skriver til standard out (stdout) eller standard error (stderr), bliver opsamlet i dine logfiler. Det betyder, at du kan logge fra et hvilket som helst sted i din programkode med en simpel output-angivelse.

I Ruby kan du bruge noget som:

puts "Hello, logs!"

I Java:

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

Det samme gælder for alle andre sprog, der understøttes af Heroku.

For at udnytte logning i realtid skal du muligvis deaktivere enhver logbuffering, som dit program udfører. I Ruby skal du f.eks. tilføje dette til din config.ru-fil:

$stdout.sync = true

I nogle frameworks sendes logoutput et andet sted end stdout som standard. Disse kræver muligvis ekstra konfiguration. Når du f.eks. bruger Ruby on Rails TaggedLogger fra ActiveSupport, skal du tilføje følgende i din app-konfiguration for at få stdout-logning:

config.logger = Logger.new(STDOUT)

Hentning af logfiler via CLI

Se logfiler

For at hente din app’s seneste logfiler skal du bruge kommandoen 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 dette eksempel indeholder output loglinjer fra en af app’ens webdynoer, Heroku HTTP-routeren og en af app’ens arbejdere.

Kommandoen logs henter som standard 100 loglinjer. Du kan angive antallet af loglinjer, der skal hentes (op til maksimalt 1.500 linjer) ved at bruge indstillingen --num (eller -n).

$ heroku logs -n 200

Real-time tail

I lighed med tail -f viser real-time tail de seneste logfiler og lader sessionen stå åben for real-time logfiler, der strømmer ind. Ved at se en live-stream af logfiler fra din app kan du få indsigt i opførslen af dit live-program og fejlfinde aktuelle problemer.

Du kan svanse dine logfiler ved hjælp af --tail (eller -t).

$ heroku logs --tail

Når du er færdig, skal du trykke på Ctrl+C for at vende tilbage til prompten.

En realtidshale-session afsluttes automatisk efter en times inaktivitet.

Logformat

Udgangsformatet for kommandoen heroku logs er som følger:

timestamp source: message
  • Tidsstempel – Den dato og det klokkeslæt, der blev registreret på det tidspunkt, hvor loglinjen blev produceret af dynoen eller komponenten. Tidsstemplet er i det format, der er angivet i RFC5424, og omfatter mikrosekunders præcision.
  • Kilde – Alle din app’s dynoer (webdynoer, baggrundsarbejdere, cron) har kilden, app. Alle Herokus systemkomponenter (HTTP-router, dyno manager) har kilden, heroku.
  • Dyno – Navnet på den dyno eller komponent, der har skrevet loglinjen. F.eks. vises worker #3 som worker.3, og Heroku HTTP-routeren vises som router.
  • Message – Indholdet af loglinjen. Linjer, der genereres af dynoer, som overstiger 10.000 byte, opdeles i 10.000 byte store bidder uden ekstra afsluttende newlines. Hver chunk indsendes som en separat loglinje.

Filtrering

Hvis du kun vil hente logfiler med en bestemt kilde, en bestemt dyno eller begge dele, kan du bruge filtreringsargumenterne --source (eller -s) og --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 filtrerer efter dyno, skal du enten angive basisnavnet (f.eks, --dyno web) eller det fulde navn (f.eks, --dyno web.1) kan bruges.

Du kan også kombinere filtreringskontakterne med --tail for at få en realtidsstrøm af filtreret output.

$ heroku logs --source app --tail

Rækkefølge af logmeddelelser

Når du henter logfiler, vil du måske bemærke, at de ikke altid er i nøjagtig kronologisk rækkefølge, især når der er flere komponenter involveret. Logfiler stammer fra mange kilder (routerknuder, dynoer osv.) og samles i en enkelt logstrøm af Logplex. Logplex selv bruger en distribueret arkitektur for at sikre høj tilgængelighed, hvilket betyder, at logmeddelelser kan blive indsamlet på tværs af flere Logplex-noder og derfor leveres i uorden.

Loghentning via web-dashboardet

Se logs

Du kan se dine logs på nettet ved at logge ind på dit Heroku-dashboard. Naviger til den app, du ønsker at se, f.eks. https://dashboard.heroku.com/apps/<app-name>. Når du er på denne side, skal du vælge “more”, og du bør se en drop-down menu:

I denne menu skal du vælge “View logs”.

Leave a Reply