Поиск по логам для бедных

September 16, 2016

Очень здорово когда логи собираются в централизованном месте и есть какой-то удобный интерфейс для их поиска. Однако так бывает не всегда и на самом деле не все интерфейсы удобны.

В самом простом случае логи сохраняются прямо на диске и регулярно ротируются. И если поиск по логам осуществляется редко, то вполне можно справится стандартными линукс утилитами.

Для начала очень рекомендую добавить в production.rb:

  config.log_tags = [
    :uuid,
    :remote_ip,
    lambda { |req| "user-#{req.cookie_jar.signed[:uid]}" || "anon" }
  ]

Тогда логи будут выглядет примерно так:

[4ba12972-bf3a-4dc5-9f9e-66908966e534] [50.141.127.26] [user-21] Processing by SomeController#some as HTML
[4ba12972-bf3a-4dc5-9f9e-66908966e534] [50.141.127.26] [user-21] Completed 200 OK in 16ms

и будут прекрасно грепаться.

fgrep '[user-21]' *.log
zfgrep '[user-21]' *.gz
zfgrep 'Completed 302' *.gz

У грепа есть разновидности: fgrep - ищет точные вхождения подстроки, не пытаясь использовать регекспы, zfgrep - делает тоже самое, но уже по сжатым файлам.

В рейлс логи многострочные, поэтому когда нашли интересный кейс, часто хочется узнать логи для данных запросов целиком. В этом случае опять поможет греп. У каждого запроса есть уникальный uuid (при условии что вы добавили log_tags), в этому случае можно склеить любым удобным способом греп команду и получить уже полный листинг запросов для исследования:

grep '10a15a85-1216-47b2-b2c0-8ddb38c97ae2\|2424e9f8-c0cb-411a-8057-6c6308e5f7f6' production.log

Когда поиск сужен можно уже пройтись рубями или любым другим скриптовым языком (ковырять с помощью руби гигабайтные файлы тоже можно, если жизнь заставит, но будет не очень быстро).

Так что если поиск по логам не входит в ежедневные рабочие рутины, в большинстве случаев можно обойтись подручными средствами.

comments powered by Disqus