2014-04-04 26 views
23

Sono nuovo in LogStash. Ho alcuni registri scritti da un'applicazione Java in Log4J. Sto cercando di trasferire quei log in ElasticSearch. Per la vita di me, non riesco a farlo funzionare in modo coerente. Attualmente, sto usando la seguente configurazione del logstash:Utilizzo di Log4J con LogStash

input { 
    file { 
    type => "log4j" 
    path => "/home/ubuntu/logs/application.log" 
    } 
} 
filter { 
    grok { 
    type => "log4j" 
    add_tag => [ "ApplicationName" ] 
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}" ] 
    } 
} 
output { 
    elasticsearch { 
    protocol => "http" 
    codec => "plain" 
    host => "[myIpAddress]" 
    port => "[myPort]" 
    } 
} 

Questa configurazione sembra essere incostante. Non sono sicuro del perché. Ad esempio, ho due messaggi. Uno funziona e l'altro lancia un fallimento di analisi. Eppure, non sono sicuro del perché. Qui ci sono i messaggi ei loro rispettivi risultati:

Tags     Message 
------     ------- 
["_grokparsefailure"] 2014-04-04 20:14:11,613 TRACE c.g.w.MyJavaClass [pool-2- 
         thread-6] message was null from https://domain.com/id-1/env- 
         MethodName 

["ApplicationName"] 2014-04-04 20:14:11,960 TRACE c.g.w.MyJavaClass [pool-2- 
         thread-4] message was null from https://domain.com/id-1/stable- 
         MethodName 

Quello con [ "ApplicationName"] ha i miei campi personalizzati di timestamp e level. Tuttavia, la voce con ["_grokparsefailure"] NON ha i miei campi personalizzati. Il pezzo strano è che i registri sono quasi identici, come mostrato nella colonna dei messaggi sopra. Questo mi sta davvero confondendo, tuttavia, non so come capire quale sia il problema o come andare oltre. Qualcuno sa come come posso utilizzare i registri delle importazioni log4j in logstash e ottenere i seguenti campi in modo coerente:

  • Livello registro
  • timestamp
  • messaggio Log
  • Nome macchina
  • Discussione

Grazie per l'aiuto che puoi fornire. Anche se posso solo il livello di log, il timestamp e il messaggio di log, questo sarebbe un aiuto ENORME. Lo apprezzo sinceramente!

+3

non riesco a vedere come il vostro modello di Grok sempre partite. Hai due spazi prima di% {LOGLEVEL: livello} ". Se devi gestire un numero variabile di spazi, usa \ s + invece di spazi per abbinare uno o più spazi e +1 sulla risposta del debugger di grok – Alcanzar

risposta

22

Si consiglia di utilizzare il listener di socket log4j per logstash e l'appender per socket log4j.

Logstash conf:

input { 
    log4j { 
    mode => server 
    host => "0.0.0.0" 
    port => [logstash_port] 
    type => "log4j" 
    } 
} 
output { 
    elasticsearch { 
    protocol => "http" 
    host => "[myIpAddress]" 
    port => "[myPort]" 
    } 
} 

log4j.properties:

log4j.rootLogger=[myAppender] 
log4j.appender.[myAppender]=org.apache.log4j.net.SocketAppender 
log4j.appender.[myAppender].port=[log4j_port] 
log4j.appender.[myAppender].remoteHost=[logstash_host] 

C'è di più informazioni nei documenti logstash per il loro contributo log4j: http://logstash.net/docs/1.4.2/inputs/log4j

+0

consiglia lo stesso di te, ma in questo momento sto iniziando ad avere problemi quando la quantità di messaggi da inviare è piuttosto grande. Ricorda che log4j legge gli eventi da una connessione TCP. – alicia

+0

Penso log4j_port nel file log4j.properties dovrebbe essere logstash_port. – imesh

+0

fa '[logstash_host]' deve essere localhost? dobbiamo specificare l'ip o il nome host è sufficiente? – AbtPst