継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

New Relic Logs の parse rule でログを構造化して見やすくする

タダです.

New Relic Logs の parse rule を検証する機会があり,備忘録としてこの記事にまとめていきます.

parse rule とは

parse rule は New Relic に取り込んだログを構造化し,検索性を上げる機能です.ログの構造化には Grok が使われており,自分は ruby のサンプルとデバッガを使っていきました.New Relic にそのままのログを取り込んで使おうとすると見づらく扱いにくい場合や検索する時の検索しづらいことがあると思います.こう言った場合に parse rule が生かされます.具体的に検証したログ例と parse rule を適用した結果を見ていきましょう.

docs.newrelic.com

試したログと parse rule について

試したログは以前の記事に書いた Rails のログを使います.ただし,JSON のログは JSON message is not parsed というドキュメントがあり,試しに構造化してみようとしましたが,後述する JSON 化する前のログと同様のことが難しかったです

試した Rails ログ

I, [2021-12-30T06:07:00.072382 #21473]  INFO -- : {"method":"GET","path":"/","format":"html","controller":"Rails::WelcomeController","action":"index","status":200,"duration":11.43,"view":4.07,"db":0.0,"user_id":1,"sql_queries":"'User Load (3.87) SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = ? ORDER BY \"users\".\"id\" ASC LIMIT ?'","sql_queries_count":1}

試した parse rule

[?:DFEWI], \[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid}\] *%{LOGLEVEL:severity} -- : \{%{GREEDYDATA:detail}\}

parse rule を適用した結果

ログ詳細部分が detail のカラムに構造化できましたが,各要素のカラムにすることまで到達できませんでした...

f:id:sadayoshi_tada:20220108161929p:plain

では,JSON にしていない下記のようなログはどう構造化できたのかをみていきます.

試した Rails ログ

I, [2021-12-31T03:16:07.407114 #13948] INFO -- : method=GET path=/ format=html controller=Rails::WelcomeController action=index status=200 duration=11.57 view=3.38 db=0.00 user_id=1 sql_queries='User Load (4.44) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?' sql_queries_count=1

試した parse rule

[?:DFEWI], \[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid}\] *%{LOGLEVEL:severity} -- : (?:method=%{WORD:method}) (?:path=%{NOTSPACE:request}) (?:format=%{WORD:extention}) (?:controller=%{GREEDYDATA:controller}) (?:action=%{WORD:action}) (?:status=%{NUMBER:status}) (?:duration=%{NUMBER:duration}) (?:view=%{NUMBER:view}) (?:db=%{NUMBER:db}) (?:user_id=%{NUMBER:user_id})

parse rule を適用した結果

parse ruleで適用した method,controller,user_id などをカラムに追加してログの中から抽出できました.

f:id:sadayoshi_tada:20220108162649p:plain

また,例えば user_id を検索したいときも検索条件に加えて他の関連ログを収集できました.parse ruleを適用する前と比べて調査がやりやすくなったと思います.

f:id:sadayoshi_tada:20220108163124p:plain

まとめ

parse rule を検証する機会があったのでやったことをまとめてみました.構造化できたログは扱いやすい形になったので,便利な機能だと思いました.