Categorie

Ultimo aggiornamento 17 settembre 2020

I log di un’app Heroku sono aggregati dai flussi di output di tutti i suoi processi in esecuzione, componenti di sistema e servizi di supporto. Logplex di Heroku instrada i flussi di log da tutte queste diverse fonti in un unico canale, fornendo una base per un logging completo.

Tipi di log

Runtime logs

Heroku aggrega le seguenti categorie di log per un’app distribuita:

  • App logs – output di log dall’applicazione stessa. Questo include i log generati dal codice della tua app e dalle dipendenze. (Filtro: --source app)
  • Log di sistema – Messaggi sulle azioni intraprese dall’infrastruttura della piattaforma Heroku per conto della tua applicazione, come ad esempio: riavviare un processo in crash, dormire o svegliare un dyno web, o servire una pagina di errore a causa di un problema nella tua applicazione. (Filtro: --source heroku)
  • API logs – Messaggi sulle azioni amministrative intraprese da te e da altri sviluppatori che lavorano sulla tua app, come: distribuzione di nuovo codice, ridimensionamento della formazione del processo o attivazione della modalità di manutenzione. (Filtro: --source app --dyno api)
  • Log degli add-on – Messaggi dai servizi degli add-on. Vedi l’articolo del Dev Center del componente aggiuntivo per i dettagli. (Il filtro varia a seconda del componente aggiuntivo)

Log di costruzione

I log generati durante la costruzione e la distribuzione della tua app sono separati dai log di runtime dell’app. I log, sia per le build di successo che per quelle non riuscite, sono disponibili dalla scheda Activitydella tua app nella Heroku Dashboard:

Screenshot di

Clicca View build log per qualsiasi evento di build nell’Activity Feed per vederne i log:

Screenshot of

Limiti della cronologia dei log

Logplex è progettato per raccogliere e instradare messaggi di log, non per memorizzarli. Conserva le più recenti 1.500 linee dei tuoi log consolidati, che scadono dopo 1 settimana.

Per una persistenza dei log più adatta alla produzione, puoi aggiungere alla tua app uno dei componenti aggiuntivi di log disponibili sulla piattaforma Heroku. La maggior parte di questi componenti aggiuntivi offre un piano gratuito per iniziare.

In alternativa, puoi implementare i tuoi scarichi di log per avere il pieno controllo su ciò che accade ai tuoi log.

Scrivere nel tuo log

Tutto ciò che la tua app scrive su standard out (stdout) o standard error (stderr) viene catturato nei tuoi log. Questo significa che puoi registrare da qualsiasi punto del codice della tua applicazione con una semplice dichiarazione di output.

In Ruby, potresti usare qualcosa come:

puts "Hello, logs!"

In Java:

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

Lo stesso vale per tutti gli altri linguaggi supportati da Heroku.

Per trarre vantaggio dai log in tempo reale, potresti aver bisogno di disabilitare qualsiasi buffering di log che la tua applicazione sta eseguendo. Per esempio, in Ruby, aggiungi questo al tuo file config.ru:

$stdout.sync = true

Alcuni framework inviano l’output dei log da qualche parte diversa da stdout per default. Questi potrebbero richiedere una configurazione extra. Per esempio, quando si usa il Ruby on Rails TaggedLogger di ActiveSupport, si dovrebbe aggiungere quanto segue nella configurazione della propria app per ottenere un log stdout:

config.logger = Logger.new(STDOUT)

Recupero dei log tramite CLI

Visualizza i log

Per recuperare i log più recenti della tua app, usa il comando 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 questo esempio, l’output include linee di log da uno dei web dynos dell’app, il router HTTP Heroku e uno dei worker dell’app.

Il comando logs recupera 100 linee di log per impostazione predefinita. Puoi specificare il numero di linee di log da recuperare (fino a un massimo di 1.500 linee) usando l’opzione --num (o -n).

$ heroku logs -n 200

Real-time tail

Simile a tail -f, real-time tail visualizza i log recenti e lascia la sessione aperta per i log in tempo reale. Visualizzando un flusso di log in tempo reale dalla tua applicazione, puoi farti un’idea del comportamento della tua applicazione dal vivo e risolvere i problemi attuali.

Puoi seguire i tuoi log usando --tail (o -t).

$ heroku logs --tail

Quando hai finito, premi Ctrl+C per tornare al prompt.

Una sessione di coda in tempo reale viene automaticamente terminata dopo un’ora di inattività.

Formato del log

Il formato dell’output del comando heroku logs è il seguente:

timestamp source: message
  • Timestamp – La data e l’ora registrata nel momento in cui la linea di log è stata prodotta dal dyno o dal componente. Il timestamp è nel formato specificato da RFC5424, e include la precisione al microsecondo.
  • Source – Tutti i dynos della tua app (web dynos, background workers, cron) hanno il source, app. Tutti i componenti di sistema di Heroku (router HTTP, dyno manager) hanno l’origine, heroku.
  • Dyno – Il nome del dyno o del componente che ha scritto la riga di log. Per esempio, worker #3 appare come worker.3, e il router HTTP Heroku appare come router.
  • Message – Il contenuto della riga di log. Le linee generate dai dynos che superano i 10000 byte sono divise in chunk da 10000 byte senza newline aggiuntive. Ogni chunk è inviato come una linea di log separata.

Filtraggio

Se vuoi recuperare solo i log con una certa fonte, un certo dyno, o entrambi, puoi usare gli argomenti di filtraggio --source (o -s) e --dyno (o -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 ...

Quando si filtra per dyno, o il nome base (es, --dyno web) o il nome completo (es, --dyno web.1) può essere usato.

Puoi anche combinare gli interruttori di filtraggio con --tail per ottenere un flusso in tempo reale di output filtrato.

$ heroku logs --source app --tail

Ordinamento dei messaggi di log

Quando recuperi i log, potresti notare che non sono sempre in esatto ordine cronologico, specialmente quando sono coinvolti più componenti. I log provengono da molte fonti (nodi router, dynos, ecc.) e sono assemblati in un singolo flusso di log da Logplex. Logplex stesso utilizza un’architettura distribuita per garantire un’elevata disponibilità, il che significa che i messaggi di log potrebbero essere raccolti su più nodi Logplex e quindi essere consegnati fuori ordine.

Ricerca dei log tramite la dashboard web

Visualizza i log

Puoi visualizzare i tuoi log sul web accedendo alla tua dashboard Heroku. Naviga fino all’app che vuoi vedere, per esempio https://dashboard.heroku.com/apps/<app-name>. Una volta in questa pagina seleziona “more” dovresti vedere un menu a tendina:

In questo menu seleziona “View logs”.

Leave a Reply