Поиск по логам для бедных
Очень здорово когда логи собираются в централизованном месте и есть какой-то удобный интерфейс для их поиска. Однако так бывает не всегда и на самом деле не все интерфейсы удобны.
В самом простом случае логи сохраняются прямо на диске и регулярно ротируются. И если поиск по логам осуществляется редко, то вполне можно справится стандартными линукс утилитами.
Для начала очень рекомендую добавить в 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
Когда поиск сужен можно уже пройтись рубями или любым другим скриптовым языком (ковырять с помощью руби гигабайтные файлы тоже можно, если жизнь заставит, но будет не очень быстро).
Так что если поиск по логам не входит в ежедневные рабочие рутины, в большинстве случаев можно обойтись подручными средствами.
Tweet