Сортировка журналов Heroku в хронологическом порядке

Heroku — это хостинговая платформа, к логам которой можно получить доступ через heroku logsкомандную строку:

$ 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

Как вы могли заметить выше, хронологический порядок не соблюдается .
Heroku доволен этим и не дает особых советов.

Есть ли какой-нибудь инструмент или сценарий bash, который я могу использовать для сортировки журналов Heroku?
Журналы довольно маленькие, максимум 1500 строк.

Бесплатный, с открытым исходным кодом, работает в Linux bash.

Ответы (3)

Вы можете попробовать это:

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

Сортирует -nчисла по порядку, -t\бит использует пробел в качестве разделителя, -k1использует первый столбец (отметка времени).

Не помещая журналы в отдельный файл, я предполагаю, что вы могли бы использовать:

heroku logs | sort -n -t\  -k1

Аналогично, для сортировки в обратном порядке ( -nr):

heroku logs | sort -nr -t\  -k1
Это работает! Мне действительно нужен хронологический порядок, не могли бы вы изменить его на heroku logs | sort -n -t\ -k1? Спасибо!
Нет проблем :) Изменил это для вас.
heroku logs | sortбудет работать так же хорошо. Формат даты имеет то свойство, что лексикографический порядок соответствует хронологическому порядку, благодаря полям фиксированной ширины и в порядке убывания значимости.
Вы совершенно правы - никогда этого не замечал! Узнавайте что-то новое каждый день..

Я написал небольшой скрипт для heroku logs -tсортировки живых журналов ( ).

http://pastebin.com/8Lby3bMg

Вы можете запустить с:

heroku logs -t | python delayed_sort.py

Если вы хотите сохранить окраску:

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

Сценарий просто хранит в буфере последние 100 строк журнала. Когда буфер заполняется, выводится строка с самой старой меткой времени (используя heap-queue для эффективности...). Буфер также очищается, когда нет новых строк журнала в течение 1 секунды.

Есть небольшой шанс, что строки останутся несортированными: строка с отметкой времени старше 100 предшествующих строк или строка со старой отметкой времени после 1-секундной паузы в общении.

Большой! Может быть, скрипт может сам вызывать логи героку, так что мне просто нужно вызывать только скрипт, без использования каналов?
Сценарий будет работать для любого потока журналов, содержащих временные метки. Это может быть хороший плагин heroku-cli-plugins ( devcenter.heroku.com/articles/using-cli-plugins ), но я думаю, вам придется преобразовать код в Ruby или что-то в этом роде. Я просто создал bash-скрипт в моем PATH с именем heroku-logs, со script -q ...строкой.
Этот скрипт не работает на Mac OSX из-за того, что select.poll() не поддерживается. См.: stackoverflow.com/questions/19740471/…

Как предложил Жилль, это самый простой и работает безупречно:

heroku logs | sort