bullet log parser
This parser can help to convert the Bullet logs to prefer format you want.
Install
bundle add bullet_log_parser --group "development, test"
# or
gem install bullet_log_parser
Example
cat log/bullet.log | bullet_log_filter.rb
bullet_log_filter.rb
#!/usr/bin/env ruby
# frozen_string_literal: true
begin
require 'bullet_log_parser'
rescue LoadError => _e
require 'bundler/setup'
require 'bullet_log_parser'
end
if __FILE__ == $PROGRAM_NAME
results = BulletLogParser.uniq_log($stdin) do |ast|
# skip no call stack
next if ast[:stack].empty?
stack = ast[:stack].last
puts "#{stack[:filename]}:#{stack[:lineno]}:#{ast[:level]}"
ast[:details].each do |detail|
puts " #{detail}"
end
puts ''
end
puts '-- summary ------'
puts results
.keys
.map { |k| "#{k}:#{results[k].size}" }
.join("\n")
end
AST format
2020-07-27 02:35:50[WARN] user: root
GET /posts
USE eager loading detected
Post => [:comments]
Add to your query: .includes([:comments])
Call stack
/app/app/views/posts/_post.json.jbuilder:4:in `block in _app_views_posts__post_json_jbuilder__2280256895687227436_47114295576380'
/app/app/views/posts/_post.json.jbuilder:3:in `_app_views_posts__post_json_jbuilder__2280256895687227436_47114295576380'
/app/app/views/posts/index.json.jbuilder:1:in `_app_views_posts_index_json_jbuilder__4177424529561133656_47114295515920'
/app/app/controllers/posts_controller.rb:13:in `index'
/app/spec/requests/posts_spec.rb:45:in `block (4 levels) in <main>'
{
"detectedAt": "2020-07-27 02:35:50",
"level": "WARN",
"user": "root",
"request": "GET /posts",
"detection": "USE eager loading detected",
"details": [
"Post => [:comments]",
"Add to your query: .includes([:comments])"
],
"stack": [
{
"filename": "/app/app/views/posts/_post.json.jbuilder",
"lineno": 4,
"message": "in `block in _app_views_posts__post_json_jbuilder__2280256895687227436_47114295576380'"
},
{
"filename": "/app/app/views/posts/_post.json.jbuilder",
"lineno": 3,
"message": "in `_app_views_posts__post_json_jbuilder__2280256895687227436_47114295576380'"
},
{
"filename": "/app/app/views/posts/index.json.jbuilder",
"lineno": 1,
"message": "in `_app_views_posts_index_json_jbuilder__4177424529561133656_47114295515920'"
},
{
"filename": "/app/app/controllers/posts_controller.rb",
"lineno": 13,
"message": "in `index'"
},
{
"filename": "/app/spec/requests/posts_spec.rb",
"lineno": 45,
"message": "in `block (4 levels) in <main>'"
}
]
}