2014-04-04 18 views
23

Ich bin neu in LogStash. Ich habe einige Protokolle aus einer Java-Anwendung in Log4J geschrieben. Ich versuche gerade, diese Logs in ElasticSearch zu bekommen. Für das Leben von mir kann ich nicht scheinen, es konsequent zu arbeiten. Zurzeit verwende ich die folgende logstash-Konfiguration:Verwenden von Log4J mit LogStash

Diese Konfiguration scheint zu treffen oder zu treffen. Ich bin mir nicht sicher warum. Zum Beispiel habe ich zwei Nachrichten. Einer arbeitet, und der andere löst einen Parse-Fehler aus. Aber ich bin mir nicht sicher warum. Hier sind die Nachrichten und ihre jeweiligen Ergebnisse:

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 

Der mit [ „Application“] hat meine benutzerdefinierten Felder von timestamp und level. Der Eintrag mit ["_grokparsefailure"] hat jedoch keine benutzerdefinierten Felder. Das seltsame Stück ist, die Protokolle sind fast identisch, wie in der Nachrichtenspalte oben gezeigt. Das verwirrt mich wirklich, aber ich weiß nicht, wie ich herausfinden soll, was das Problem ist oder wie ich darüber hinaus kommen kann. Wer weiß, wie, wie ich Import log4j Protokolle in logstash verwenden können und erhalten die folgenden Felder konsequent:

  • Log Level
  • Timestamp
  • Log Nachricht
  • Machine Name
  • Thema

Vielen Dank für Ihre Hilfe. Selbst wenn ich nur die Log-Level, Timestamp und Log-Nachricht habe, wäre das eine riesige Hilfe. Ich schätze es sehr!

+3

ich kann nicht sehen, wie Ihr grok Muster jemals passt. Du hast zwei Leerzeichen vor dem% {LOGLEVEL: level} ". Wenn du mit einer variablen Anzahl von Leerzeichen klarkommst, benutze \ s + anstelle von Leerzeichen um ein oder mehrere Leerzeichen zu finden. Und +1 auf die grok debugger Antwort – Alcanzar

Antwort

22

Ich würde empfehlen, die Log4j Socket Listener für Logstash und den Log4j Socket Appender zu verwenden.

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] 

Es gibt mehr Informationen für ihre log4j Eingang in den logstash docs ist: http://logstash.net/docs/1.4.2/inputs/log4j

+0

würde ich Ich empfehle das gleiche wie Sie, aber jetzt, ich fange an, Probleme zu haben, wenn die Menge der zu sendenden Nachrichten ziemlich groß ist. Denken Sie daran, dass log4j die Ereignisse von einer TCP-Verbindung liest. – alicia

+0

Ich denke log4j_port in log4j.properties Datei sollte logstash_port sein – imesh

+0

muss '[logstash_host]' localhost sein müssen wir die ip angeben oder kann der hostname ausreichen? – AbtPst