2015-08-31 14 views
10

Desidero inviare i registri da un'app Java a ElasticSearch e l'approccio convenzionale sembra essere quello di impostare Logstash sul server che esegue l'app e fare in modo che logstash analizzi il log file (con regex ...!) e caricali in ElasticSearch.Registrazione dall'app Java a ELK senza necessità di log di analisi

C'è un motivo in questo modo, piuttosto che impostare log4J (o logback) per registrare le cose nel formato desiderato direttamente in un raccoglitore di registri che può quindi essere spedito a ElasticSearch in modo asincrono? Mi sembra pazzesco dover smanettare con i filtri grok per gestire le tracce di stack multiline (e masterizzare i cicli della CPU sull'analisi dei log) quando l'app stessa potrebbe semplicemente registrare il formato desiderato in primo luogo?

Su una nota tangenzialmente correlata, per le app in esecuzione in un contenitore Docker, è consigliabile eseguire il log direttamente su ElasticSearch, data la necessità di eseguire un solo processo?

+0

Anche se si invia un documento json bello direttamente a elasticsearch, può ancora esserci una business intelligence che deve essere applicata durante il percorso. È un ottimo uso per il logstash. Inoltre, la maggior parte delle persone non vive in un mondo eterogeneo, quindi l'utilizzo di un aggregatore può essere potente. tmtowtdi, di sicuro. –

+0

Ritengo che ciò sia principalmente dovuto a motivi di scalabilità. Se l'applicazione spinge i registri su Elasticsearch, la contropressione dovuta alla lentezza di ELasticsearch può influire sulle prestazioni dell'applicazione e se l'applicazione mette in coda molti log nella memoria principale, avrà sicuramente un effetto negativo. –

risposta

2

Penso che sia di solito sconsigliato accedere direttamente a Elasticsearch da un Log4j/Logback/qualunque appender, ma sono d'accordo che scrivere logstash per analizzare un log Java "normale" leggibile dall'uomo è una cattiva idea. Io uso https://github.com/logstash/log4j-jsonevent-layout ovunque io possa avere gli appendici di file regolari di Log4j producono log JSON che non richiedono ulteriori analisi da Logstash.

4

Se davvero si vuole andare su questa strada, l'idea sarebbe quella di utilizzare qualcosa come un Elasticsearch appender (o this one o this other one) che spedire i vostri log direttamente al cluster ES.

Tuttavia, vorrei sconsigliarlo per gli stessi motivi menzionati da @ Vineth Mohan. Dovresti anche pormi un paio di domande, ma principalmente cosa succederebbe se il tuo cluster ES dovesse andare giù per qualsiasi motivo (OOM, rete giù, aggiornamento ES, ecc.)?

Ci sono molte ragioni per cui esiste l'asincronicità, una delle quali è la robustezza della tua architettura e il più delle volte è molto più importante della masterizzazione di un paio di cicli della CPU sull'analisi dei log.

Si noti inoltre che esiste uno ongoing discussion su questo argomento molto attivo nel forum di discussione ES ufficiale.

+0

L'emissione di registri di testo ambigui da dati strutturati e l'analisi di nuovo è una complicazione inutile. Non si tratta di cicli della CPU, ma di robustezza dei dati. È un peccato estrarre con attenzione le tracce dello stack quando sono strutturate in origine ... E non capisco perché si stia combattendo sul cluster ES (specialmente se si configura la ridondanza con la replica).Probabilmente vedremo Logstash/Flume o anche Kafka/Redis morti piuttosto che ES ... – gavenkoa

+0

@gavenkoa Non conosco il tuo contesto e il tuo chilometraggio può variare. Ovviamente, su un singolo nodo di sviluppo o di staging, questo non ha senso, ma l'esperienza ha dimostrato che avere questa pipeline asincrona fornisce molta più robustezza nelle impostazioni di produzione reali per una moltitudine di ragioni. Sentiti libero di creare una domanda con i tuoi casi d'uso dettagliati e possiamo parlarne. – Val

0

Se avete bisogno di una soluzione rapida ho scritto questo appender qui Log4J2 Elastic REST Appender se volete usarlo. Ha la capacità di memorizzare gli eventi del registro in base al tempo e/o al numero di eventi prima di inviarlo a Elastic (utilizzando l'API _bulk in modo che invii tutto in una volta sola). È stato pubblicato su Maven Central quindi è abbastanza semplice.

Come gli altri utenti hanno già menzionato, il modo migliore per farlo sarebbe salvarlo su file e quindi spedirlo a ES separatamente. Comunque penso che ci sia un valore se hai bisogno di ottenere qualcosa che funzioni velocemente finché non hai tempo/risorse per implementare il modo ottimale.