2015-01-13 5 views
5

Ich verwende Fluentd, um Protokollmeldungen in Elasticsearch zu zentralisieren und sie mit Kibana anzuzeigen. Wenn ich Log-Meldungen anzeigen, Nachrichten, die in der gleichen Sekunde aufgetreten sind aus der Ordnung und die Millisekunden in @timestamp nur Nullenfluentd verliert Millisekunden und jetzt Protokollmeldungen werden außerhalb der Reihenfolge in elasticsearch gespeichert

2015-01-13T11:54:01.000-06:00 DEBUG my message 

Wie erhalte ich fluentd Millisekunden zu speichern?

Antwort

12

fluentd derzeit nicht unterstützt Auflösung von unter einer Sekunde: https://github.com/fluent/fluentd/issues/461

ich, indem ein neues Feld, um alle Protokollnachrichten mit record_reformer um diese gearbeitet ns seit Epoche speichern

Zum Beispiel, wenn Ihr fluentd hat einige Eingänge wie folgt:

# 
# Syslog 
# 
<source> 
    type syslog 
    port 5140 
    bind localhost 
    tag syslog 
</source> 

# 
# Tomcat log4j json output 
# 
<source> 
    type tail 
    path /home/foo/logs/catalina-json.out 
    pos_file /home/foo/logs/fluentd.pos 
    tag tomcat 
    format json 
    time_key @timestamp 
    time_format "%Y-%m-%dT%H:%M:%S.%L%Z" 
</source> 

sie dann wie folgt aussehen ändern und eine record_reformer hinzufügen, die eine Nanosekunde Feld fügt

# 
# Syslog 
# 
<source> 
    type syslog 
    port 5140 
    bind localhost 
    tag cleanup.syslog 
</source> 

# 
# Tomcat log4j json output 
# 
<source> 
    type tail 
    path /home/foo/logs/catalina-json.out 
    pos_file /home/foo/logs/fluentd.pos 
    tag cleanup.tomcat 
    format json 
    time_key @timestamp 
    time_format "%Y-%m-%dT%H:%M:%S.%L%Z" 
</source> 

<match cleanup.**> 
    type record_reformer 
    time_nano ${t = Time.now; ((t.to_i * 1000000000) + t.nsec).to_s} 
    tag ${tag_suffix[1]} 
</match> 

Fügen Sie dann das time_nano Feld zu Ihren kibana Dashboards hinzu und verwenden Sie es, um anstelle von @timestamp zu sortieren und alles wird in Ordnung sein.

+1

Danke für die Antwort. Ein Fluentd Maintainer hier. Ich werde dieses Problem im Hinterkopf behalten, da wir uns mehr Gedanken über die Unterstützung von Sub-Sekunden-Zeitstempeln machen (eine bekannte Frage/Design-Entscheidung). –

+0

Vielen Dank für die Aufmerksamkeit auf dieses Problem Kiyoto Tamura. Die Problemumgehung ist weniger als ideal, da der Zeitstempel aus Fluentd oder aus einer Protokolldatei generiert wird, die möglicherweise bereits eine Genauigkeit von mindestens Millisekunden aufweist. Es wäre am besten, zuerst die Millisekunden-Genauigkeit zu verwenden, um die Zeit zu formatieren und dann den aktuellen Nanosekunden-Wert von der aktuellen Sekunde zum Zeitpunkt der Analyse in fließender Form hinzuzufügen, um die Reihenfolge in der gleichen Millisekunde zu halten. Oder zweitens, wenn die geparste Log-Nachricht nur 1 Sekunde Auflösung hatte, wie zum Beispiel syslog. –

+1

Hi @DavidWartell, glaubst du, es wäre besser, die Variable $ {time} von fluent-plugin-record-reformer zu benutzen? Anstatt "Time.now" können wir jetzt die Zeit des Ereignisses anstelle von fluentds Zeit bekommen. – clarete