Skip to content

Commit

Permalink
Merge 6120542 into caec7cb
Browse files Browse the repository at this point in the history
  • Loading branch information
Cawllec committed Jun 21, 2018
2 parents caec7cb + 6120542 commit 21f5b1c
Show file tree
Hide file tree
Showing 9 changed files with 251 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ source "https://rubygems.org"
group :test, optional: true do
gem 'rake', RUBY_VERSION <= '1.9.3' ? '~> 11.3.0' : '~> 12.3.0'
gem 'rspec'
gem 'logging'
gem 'rdoc'
gem 'rspec-mocks'
gem 'rdoc', '~> 5.1.0'
gem 'pry'
gem 'addressable', '~> 2.3.8'
gem 'delayed_job' if RUBY_VERSION >= '2.2.2'
Expand Down
6 changes: 6 additions & 0 deletions example/rails-42/app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,10 @@ def severity
end
@text = msg
end

def crash_after_log
@test_model = TestModel.new :foo => "Foo"
@test_model.save
raise "Crash"
end
end
2 changes: 2 additions & 0 deletions example/rails-42/app/models/test_model.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class TestModel < ActiveRecord::Base
end
1 change: 1 addition & 0 deletions example/rails-42/config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
Rails.application.routes.draw do
root :to => 'application#index'
get "log" => 'application#crash_after_log'

get 'crash' => 'application#crash'
get 'crash_with_callback' => 'application#callback'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class CreateTestModels < ActiveRecord::Migration
def change
create_table :test_models do |t|
t.string :foo

t.timestamps null: false
end
end
end
35 changes: 35 additions & 0 deletions lib/bugsnag/breadcrumbs/appender.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
require_relative "logger"
require "logging"

module Bugsnag::Breadcrumbs
class Appender < Logging::Appender
def initialize(level = Logger::INFO)
super "Bugsnag", { :level => level }
end

def <<(message)
return if closed?
Bugsnag::Breadcrumbs.log_breadcrumb(message)
end

def append(event)
return if closed? || !allow(event)

metadata = if !event.method.empty? && !event.file.empty? && !event.line.empty?
{
:trace => {
:method => event.method,
:file => event.file,
:line => event.line
},
:data => event.data
}
else
event.data
end

severity = Bugsnag::Breadcrumbs.get_severity_name(event.level)
Bugsnag::Breadcrumbs.log_breadcrumb(event.logger, metadata, severity)
end
end
end
69 changes: 69 additions & 0 deletions lib/bugsnag/breadcrumbs/logger.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require "logger"
require "bugsnag"

module Bugsnag::Breadcrumbs
class Logger < Logger
SEVERITIES = [
"debug",
"info",
"warn",
"error",
"fatal",
"unknown"
]

def self.get_severity_name(severity)
if (0..5).cover? severity
SEVERITIES[severity]
else
severity
end
end

def self.log_breadcrumb(name, data = nil, severity = "unknown")
metadata = {
:severity => severity
}
if data.is_a? Hash
metadata.merge!(data)
elsif !data.nil?
metadata[:data] = data
end

Bugsnag.leave_breadcrumb(name, Bugsnag::Breadcrumbs::LOG_TYPE, metadata)
end

def initialize(level = Logger::INFO)
@open = true
super nil, level
end

def add(severity, message = nil, progname = nil)
return unless @open

if block_given?
message = yield message
elsif message.nil?
message = progname
end

Bugsnag::Breadcrumbs::Logger.log_breadcrumb(message, { :progname => progname }, Bugsnag::Breadcrumbs::Logger.get_severity_name(severity)) if severity >= level
end
alias log add

def <<(message)
return unless @open
Bugsnag::Breadcrumbs::Logger.log_breadcrumb(message)
end

def close
@open = false
true
end

def reopen
@open = true
true
end
end
end
68 changes: 68 additions & 0 deletions spec/appender_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# encoding: utf-8

# Necessary to avoid monkey patching thread methods
ENV["LOGGING_INHERIT_CONTEXT"] = "false"

require 'spec_helper'
require 'logger'
require 'logging'
require 'bugsnag/logging/appender'

describe Bugsnag::Logging::Appender do

before do
@appender = Bugsnag::Logging::Appender.new
end

it "writes breadcrumbs" do
expect(Bugsnag).to receive(:leave_breadcrumb).with(
"message",
"log",
{
:severity => "unknown"
}
)
@appender << "message"
end

it "write breadcrumbs from a logevent" do
expect(Bugsnag).to receive(:leave_breadcrumb).with(
"testLogger",
"log",
{
:data => ["message1", "message2"],
:severity => "info"
}
)
logevent = Logging::LogEvent.new("testLogger", Logger::INFO, ["message1", "message2"], false)
@appender.append logevent
end

it "adds trace metadata if available" do
expect(Bugsnag).to receive(:leave_breadcrumb).with(
"testLogger",
"log",
{
:trace => hash_including(:method, :file, :line),
:data => ["message1", "message2"],
:severity => "info"
}
)
logevent = Logging::LogEvent.new("testLogger", Logger::INFO, ["message1", "message2"], true)
@appender.append logevent
end

it "doesn't write if closed" do
expect(Bugsnag).to_not receive(:leave_breadcrumb)
@appender.close
@appender << "message"
logevent = Logging::LogEvent.new("testLogger", Logger::INFO, ["message1", "message2"], false)
@appender.append logevent
end

it "is an appender and a bugsnag appender" do
expect(@appender.class.ancestors).to include(Bugsnag::Logging::Appender, Logging::Appender)
end
end


59 changes: 59 additions & 0 deletions spec/logger_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# encoding: utf-8

require 'spec_helper'
require 'logger'
require 'bugsnag/breadcrumbs/logger'

describe Bugsnag::Breadcrumbs::Logger do

before do
@logger = Bugsnag::Breadcrumbs::Logger.new
end

it "writes by default" do
expect(Bugsnag).to receive(:leave_breadcrumb).with(
"message",
"log",
{
:severity => "unknown"
}
)
@logger << "message"
end

it "doesn't write when closed" do
expect(Bugsnag).to_not receive(:leave_breadcrumb)
@logger.close
@logger << "message"
end

it "writes after being re-opened" do
expect(Bugsnag).to receive(:leave_breadcrumb).with(
"message",
"log",
{
:severity => "unknown"
}
)
@logger.close
@logger.reopen
@logger << "message"
end

it "allows a progname and severity" do
expect(Bugsnag).to receive(:leave_breadcrumb).with(
"message",
"log",
{
:progname => "logTests",
:severity => "info"
}
)
@logger.add Logger::INFO, "message", "logTests"
end

it "is a logger and a bugsnag logger" do
expect(@logger.class.ancestors).to include(Bugsnag::Breadcrumbs::Logger, Logger)
end
end

0 comments on commit 21f5b1c

Please sign in to comment.