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.
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