Heroku-Protokolle chronologisch sortieren

heroku logsHeroku ist eine Hosting-Plattform, auf deren Protokolle über die Befehlszeile zugegriffen werden kann :

$ heroku logs
2014-07-17T06:24:02.216403+00:00 app[web.1]: Started
2014-07-17T06:24:02.216410+00:00 app[web.1]: Stopped
2014-07-17T06:24:02.216408+00:00 app[web.1]: Paused

Wie Sie oben sehen können, wird die chronologische Reihenfolge nicht eingehalten .
Heroku ist damit zufrieden und gibt keine besonderen Ratschläge.

Gibt es ein Tool oder Bash-Skript, mit dem ich Heroku-Protokolle sortieren kann?
Die Protokolle sind ziemlich klein, maximal 1500 Zeilen.

Kostenlos, Open Source, läuft in Linux Bash.

Antworten (3)

Sie könnten dies versuchen:

heroku logs > heroku.txt
sort -n -t\  -k1 heroku.txt

Das -nsortiert Zahlen der Reihe nach, -t\Bit verwendet ein Leerzeichen als Trennzeichen, -k1verwendet Spalte eins (den Zeitstempel).

Ohne die Protokolle in eine separate Datei zu schreiben, nehme ich an, dass Sie Folgendes verwenden könnten:

heroku logs | sort -n -t\  -k1

Um in umgekehrter Reihenfolge zu sortieren ( -nr):

heroku logs | sort -nr -t\  -k1
Das funktioniert! Ich brauche eigentlich eine chronologische Reihenfolge, könnten Sie also bitte zu wechseln heroku logs | sort -n -t\ -k1? Danke!
Kein Problem :) Habe das für dich geändert.
heroku logs | sortwürde genauso gut funktionieren. Das Datumsformat hat die Eigenschaft, dass die lexikografische Reihenfolge der chronologischen Reihenfolge entspricht, da die Felder eine feste Breite haben und nach abnehmender Bedeutung geordnet sind.
Du hast recht - das ist mir noch nie aufgefallen! Jeden Tag etwas Neues lernen..

Ich habe ein kleines Skript geschrieben, um Live-Protokolle ( heroku logs -t) zu sortieren.

http://pastebin.com/8Lby3bMg

Sie können laufen mit:

heroku logs -t | python delayed_sort.py

Wenn Sie die Färbung beibehalten möchten:

script -q -c "heroku logs -t" -a /dev/null | python delayed_sort.py

Das Skript enthält einfach einen Puffer der letzten 100 Protokollzeilen. Wenn der Puffer voll wird, wird die Zeile mit dem ältesten Zeitstempel ausgegeben (unter Verwendung von Heap-Queue für Effizienz ...). Der Puffer wird auch geleert, wenn 1 Sekunde lang keine neuen Protokollzeilen vorhanden sind.

Es besteht immer noch eine winzige Chance, dass die Zeilen unsortiert ausgegeben werden: eine Zeile mit einem Zeitstempel, der älter als die 100 vorhergehenden Zeilen ist, oder eine Zeile mit einem alten Zeitstempel nach einer Kommunikationspause von 1 Sekunde.

Groß! Vielleicht könnte das Skript Heroku-Protokolle selbst aufrufen, sodass ich nur das Skript aufrufen muss, ohne Pipes zu verwenden?
Das Skript würde für jede Protokolldatei funktionieren, die Zeitstempel enthält. Es könnte ein nettes Heroku-Cli-Plugin sein ( devcenter.heroku.com/articles/using-cli-plugins ), aber ich denke, Sie müssten den Code in Ruby oder so konvertieren. Ich habe einfach ein Bash-Skript in meinem PATH mit dem Namen erstellt heroku-logs, mit der script -q ...Zeile.
Dieses Skript funktioniert nicht unter Mac OSX, da select.poll() nicht unterstützt wird. Siehe: stackoverflow.com/questions/19740471/…

Wie von Gilles vorgeschlagen, ist dies am einfachsten und funktioniert einwandfrei:

heroku logs | sort