2017-07-06 5 views
0

Ich habe versucht, einen benutzerdefinierten mehrzeiligen Protokollparser einzurichten, um Protokolle in Stackdriver mit einigen lesbaren Feldern zu erhalten. Derzeit sieht es wie folgt aus:Stackdriver benutzerdefinierte Multiline-Protokollierung, Zeitformat

<source> 
    type tail 
    read_from_head true 
    path /root/ansible.log 
    pos_file /var/lib/google-fluentd/pos/ansible.pos 
    time_format "%a %b %e %T %Z %Y" 
    format multiline 
    format_firstline /Started ansible run at/ 
    format1 /Started ansible run at (?<timestart>[^\n]+)\n(?<body>.*)/ 
    format2 /PLAY RECAP.*/ 
    format3 /ok=(?<ok>\d+)\s+changed=(?<changed>\d+)\s+unreachable=(?<unreachable>\d+)\s+failed=(?<failed>\d+).*/ 
    format4 /Finished ansible run at (?<timeend>[^\n]+)/ 
    tag ansible 
</source> 

Es ist geschafft den Spezifikationen bei http://docs.fluentd.org/v0.12/articles/parser_multiline, und es funktioniert. Aber es funktioniert ohne einen richtigen Zeitstempel - timestart und timeend sind nur einfache Felder in der JSON. In diesem aktuellen Zustand ist die time_format Einstellung nutzlos, weil ich keine time Variable unter den Regexes habe. Dies aggregiert alle Variablen, die ich brauche, Logs erscheinen in Stackdriver, wenn ich den Fluendienst starte, und alles ist fast glücklich.

Wenn ich jedoch einen der Namen dieser Zeitvariablen in time ändere und versuche, dem Eintrag tatsächlich einen Stackdriver-Zeitstempel zuzuweisen, funktioniert das nicht. Das flüssige Protokoll auf der Maschine sagt, dass der Arbeiter alles gestartet und geparst hat, aber Protokolle werden in der Stackdriver-Konsole überhaupt nicht angezeigt.

timestart und timeend aussehen wie Fri Jun 2 20:39:58 UTC 2017 oder etwas in diese Richtung. Die Zeitformatspezifikationen sind bei http://ruby-doc.org/stdlib-2.4.1/libdoc/time/rdoc/Time.html#method-c-strptime und ich habe sie zu oft überprüft und doppelt überprüft, und ich kann nicht herausfinden, was ich falsch mache.

EDIT: ein anderes Detail: wenn ich versuche, die Variable time zu analysieren, während die Protokolle nicht in der Stackdriver-Konsole angezeigt werden, wird das entsprechende Tag (in diesem Fall ansible) in der Liste der Tags angezeigt. Es ist nur so, dass die Ergebnisse leer sind.

Antwort

0

Sie sind richtig, dass die Stackdriver Logging Agent für den Zeitstempel in der 'time' Feld aussieht, aber es nutzt Rubys Time.iso8601 diesen Wert zu analysieren (zurück auf Time.at auf Fehler fallen). Die Zeichenfolge, die Sie angegeben haben (Fri Jun 2 20:39:58 UTC 2017), ist nicht in einem dieser Formate, daher kann sie nicht analysiert werden (Sie könnten wahrscheinlich den Fehler in /var/log/google-fluentd/google-fluentd.log sehen). Sie können ein record_transformer Plugin zu Ihrer Config hinzufügen, um Ihr analysiertes Datum in das richtige Format zu ändern (Hinweis: enable_ruby ist Ihr Freund). Etwas wie:

<filter foo.bar> 
    @type record_transformer 
    enable_ruby 
    <record> 
    time ${Time.strptime(record['time'], '%a %b %d %T %Z %Y').iso8601} 
    </record> 
</filter> 

sollte funktionieren ...

+0

Außer, wie ich sagte, ich sehe keine Fehler im fluentd Protokoll, das fluentd log sagt alles in Ordnung ist, es ist nur, dass die Protokolle don wird nicht in Stackdriver angezeigt. Und was das Zeitformat angeht, versuche ich bereits,%%% B% E% T% Z% Y' im obigen Block zu verwenden, also frage ich mich nur, warum meine Methode nicht funktioniert. – snetch