From f2619a7ed7895104797707663c211e2e6d90f366 Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Tue, 3 Oct 2017 15:56:16 +0100 Subject: [PATCH 01/11] Added basic logger/log-device and tests --- lib/bugsnag/loggers/log_device.rb | 28 +++++++++ lib/bugsnag/loggers/logger.rb | 53 +++++++++++++++++ spec/logger_spec.rb | 95 +++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 lib/bugsnag/loggers/log_device.rb create mode 100644 lib/bugsnag/loggers/logger.rb create mode 100644 spec/logger_spec.rb diff --git a/lib/bugsnag/loggers/log_device.rb b/lib/bugsnag/loggers/log_device.rb new file mode 100644 index 000000000..dd222f9c8 --- /dev/null +++ b/lib/bugsnag/loggers/log_device.rb @@ -0,0 +1,28 @@ +require "bugsnag" +require "bugsnag/breadcrumbs/breadcrumb" + +module Bugsnag::Loggers + + class LogDevice + def initialize + @open = true + end + + def reopen + @open = true + end + + def close + @open = false + end + + def write(message, progname = nil, severity = "unknown") + if @open + Bugsnag.leave_breadcrumb(message, Bugsnag::Breadcrumbs::LOG_TYPE, { + :progname => progname, + :severity => severity + }) + end + end + end +end \ No newline at end of file diff --git a/lib/bugsnag/loggers/logger.rb b/lib/bugsnag/loggers/logger.rb new file mode 100644 index 000000000..58d7882f3 --- /dev/null +++ b/lib/bugsnag/loggers/logger.rb @@ -0,0 +1,53 @@ +require "logger" +require "bugsnag" +require "bugsnag/loggers/log_device" + +module Bugsnag::Loggers + + SEVERITIES = [ + "debug", + "info", + "warn", + "error", + "fatal", + "unknown" + ] + + class Logger < Logger + + def initialize(level=Logger::INFO) + @open = true + @log_device = Bugsnag::Loggers::LogDevice.new + super @log_device, level + end + + def add(severity, message = nil, progname = nil) + return unless @open + if block_given? + message = yield message + elsif message.nil? + message = progname + end + if severity >= level + @log_device.write(message, progname, Bugsnag::Loggers::SEVERITIES[severity]) + end + end + alias :log :add + + def <<(message) + return unless @open + @log_device.write message + end + + def close + @open = false + true + end + + def reopen + @open = true + true + end + + end +end \ No newline at end of file diff --git a/spec/logger_spec.rb b/spec/logger_spec.rb new file mode 100644 index 000000000..1dd175977 --- /dev/null +++ b/spec/logger_spec.rb @@ -0,0 +1,95 @@ +# encoding: utf-8 + +require 'spec_helper' +require 'logger' +require 'bugsnag/loggers/logger' +require 'bugsnag/loggers/log_device' + +describe Bugsnag::Loggers do + + context "a log device" do + before do + @log_device = Bugsnag::Loggers::LogDevice.new + end + + it "writes by default" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => nil, + :severity => "unknown" + } + ) + @log_device.write "message" + end + + it "doesn't write when closed" do + expect(Bugsnag).to_not receive(:leave_breadcrumb) + @log_device.close + @log_device.write "message" + end + + it "writes after being re-opened" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => nil, + :severity => "unknown" + } + ) + @log_device.close + @log_device.reopen + @log_device.write "message" + end + + it "allows a progname and severity" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => "logTests", + :severity => "info" + } + ) + @log_device.write "message", "logTests", "info" + end + end + + context "a logger" do + before do + @logger = Bugsnag::Loggers::Logger.new + end + + it "is a logger and a bugsnag logger" do + expect(@logger.class.ancestors).to include(Bugsnag::Loggers::Logger, Logger) + end + + it "logs a breadcrumb when add is called" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => nil, + :severity => "info" + } + ) + @logger.add Logger::INFO, "message" + end + + it "logs a breadcrumb when << is called" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => nil, + :severity => "unknown" + } + ) + @logger << "message" + end + end +end + + \ No newline at end of file From e97d6a536a8d19087da4fcb8b9353a3faac5927d Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Tue, 3 Oct 2017 16:48:24 +0100 Subject: [PATCH 02/11] Removed superfluous log_device, refactored that into logger --- lib/bugsnag/loggers/log_device.rb | 28 ------- lib/bugsnag/loggers/logger.rb | 25 ++++-- spec/logger_spec.rb | 123 +++++++++++------------------- 3 files changed, 65 insertions(+), 111 deletions(-) delete mode 100644 lib/bugsnag/loggers/log_device.rb diff --git a/lib/bugsnag/loggers/log_device.rb b/lib/bugsnag/loggers/log_device.rb deleted file mode 100644 index dd222f9c8..000000000 --- a/lib/bugsnag/loggers/log_device.rb +++ /dev/null @@ -1,28 +0,0 @@ -require "bugsnag" -require "bugsnag/breadcrumbs/breadcrumb" - -module Bugsnag::Loggers - - class LogDevice - def initialize - @open = true - end - - def reopen - @open = true - end - - def close - @open = false - end - - def write(message, progname = nil, severity = "unknown") - if @open - Bugsnag.leave_breadcrumb(message, Bugsnag::Breadcrumbs::LOG_TYPE, { - :progname => progname, - :severity => severity - }) - end - end - end -end \ No newline at end of file diff --git a/lib/bugsnag/loggers/logger.rb b/lib/bugsnag/loggers/logger.rb index 58d7882f3..b7aaa0ba8 100644 --- a/lib/bugsnag/loggers/logger.rb +++ b/lib/bugsnag/loggers/logger.rb @@ -1,6 +1,5 @@ require "logger" require "bugsnag" -require "bugsnag/loggers/log_device" module Bugsnag::Loggers @@ -17,8 +16,7 @@ class Logger < Logger def initialize(level=Logger::INFO) @open = true - @log_device = Bugsnag::Loggers::LogDevice.new - super @log_device, level + super nil, level end def add(severity, message = nil, progname = nil) @@ -29,14 +27,15 @@ def add(severity, message = nil, progname = nil) message = progname end if severity >= level - @log_device.write(message, progname, Bugsnag::Loggers::SEVERITIES[severity]) + severity_name = get_severity_name(severity) + log_breadcrumb(message, progname, severity_name) end end alias :log :add def <<(message) return unless @open - @log_device.write message + log_breadcrumb(message) end def close @@ -49,5 +48,21 @@ def reopen true end + private + def log_breadcrumb(message, progname = nil, severity = "unknown") + Bugsnag.leave_breadcrumb(message, Bugsnag::Breadcrumbs::LOG_TYPE, { + :progname => progname, + :severity => severity + }) + end + + private + def get_severity_name(severity) + if (0..5).include? severity + Bugsnag::Loggers::SEVERITIES[severity] + else + severity + end + end end end \ No newline at end of file diff --git a/spec/logger_spec.rb b/spec/logger_spec.rb index 1dd175977..c6dba6777 100644 --- a/spec/logger_spec.rb +++ b/spec/logger_spec.rb @@ -3,92 +3,59 @@ require 'spec_helper' require 'logger' require 'bugsnag/loggers/logger' -require 'bugsnag/loggers/log_device' -describe Bugsnag::Loggers do +describe Bugsnag::Loggers::Logger do - context "a log device" do - before do - @log_device = Bugsnag::Loggers::LogDevice.new - end - - it "writes by default" do - expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", - { - :progname => nil, - :severity => "unknown" - } - ) - @log_device.write "message" - end - - it "doesn't write when closed" do - expect(Bugsnag).to_not receive(:leave_breadcrumb) - @log_device.close - @log_device.write "message" - end - - it "writes after being re-opened" do - expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", - { - :progname => nil, - :severity => "unknown" - } - ) - @log_device.close - @log_device.reopen - @log_device.write "message" - end + before do + @logger = Bugsnag::Loggers::Logger.new + end - it "allows a progname and severity" do - expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", - { - :progname => "logTests", - :severity => "info" - } - ) - @log_device.write "message", "logTests", "info" - end + it "writes by default" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => nil, + :severity => "unknown" + } + ) + @logger << "message" end - context "a logger" do - before do - @logger = Bugsnag::Loggers::Logger.new - end + it "doesn't write when closed" do + expect(Bugsnag).to_not receive(:leave_breadcrumb) + @logger.close + @logger << "message" + end - it "is a logger and a bugsnag logger" do - expect(@logger.class.ancestors).to include(Bugsnag::Loggers::Logger, Logger) - end + it "writes after being re-opened" do + expect(Bugsnag).to receive(:leave_breadcrumb).with( + "message", + "log", + { + :progname => nil, + :severity => "unknown" + } + ) + @logger.close + @logger.reopen + @logger << "message" + end - it "logs a breadcrumb when add is called" do - expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", - { - :progname => nil, - :severity => "info" - } - ) - @logger.add Logger::INFO, "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 "logs a breadcrumb when << is called" do - expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", - { - :progname => nil, - :severity => "unknown" - } - ) - @logger << "message" - end + it "is a logger and a bugsnag logger" do + expect(@logger.class.ancestors).to include(Bugsnag::Loggers::Logger, Logger) end end From 4cb8b653913229705423cff4dd2a866ff44252bb Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Wed, 4 Oct 2017 10:06:59 +0100 Subject: [PATCH 03/11] Renamed library to logging, added appender and tests --- Gemfile | 1 + lib/bugsnag/logging/appender.rb | 33 +++++++++++ lib/bugsnag/{loggers => logging}/logger.rb | 46 ++++++++------- spec/appender_spec.rb | 65 ++++++++++++++++++++++ spec/logger_spec.rb | 10 ++-- 5 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 lib/bugsnag/logging/appender.rb rename lib/bugsnag/{loggers => logging}/logger.rb (51%) create mode 100644 spec/appender_spec.rb diff --git a/Gemfile b/Gemfile index b6eeb9a2c..faface067 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,7 @@ source "https://rubygems.org" group :test, optional: true do gem 'rake', '~> 10.1.1' gem 'rspec' + gem 'logging' gem 'rdoc' gem 'pry' gem 'addressable', '~> 2.3.8' diff --git a/lib/bugsnag/logging/appender.rb b/lib/bugsnag/logging/appender.rb new file mode 100644 index 000000000..9a289f2f0 --- /dev/null +++ b/lib/bugsnag/logging/appender.rb @@ -0,0 +1,33 @@ +require_relative "logger" +require "logging" + +module Bugsnag::Logging + class Appender < Logging::Appender + def initialize(level=Logger::INFO) + super "Bugsnag", {:level => level} + end + + def <<(message) + return if closed? + Bugsnag::Logging.log_breadcrumb(message) + end + + def append(event) + return if (closed?)||(!allow(event)) + if (event.method.size > 0) && (event.file.size > 0) && (event.line.size > 0) + metadata = { + :trace => { + :method => event.method, + :file => event.file, + :line => event.line + }, + :data => event.data + } + else + metadata = event.data + end + severity = Bugsnag::Logging.get_severity_name(event.level) + Bugsnag::Logging.log_breadcrumb(event.logger, metadata, severity) + end + end +end diff --git a/lib/bugsnag/loggers/logger.rb b/lib/bugsnag/logging/logger.rb similarity index 51% rename from lib/bugsnag/loggers/logger.rb rename to lib/bugsnag/logging/logger.rb index b7aaa0ba8..36890a3fd 100644 --- a/lib/bugsnag/loggers/logger.rb +++ b/lib/bugsnag/logging/logger.rb @@ -1,7 +1,7 @@ require "logger" require "bugsnag" -module Bugsnag::Loggers +module Bugsnag::Logging SEVERITIES = [ "debug", @@ -12,6 +12,27 @@ module Bugsnag::Loggers "unknown" ] + def self.get_severity_name(severity) + if (0..5).include? 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 + class Logger < Logger def initialize(level=Logger::INFO) @@ -27,15 +48,15 @@ def add(severity, message = nil, progname = nil) message = progname end if severity >= level - severity_name = get_severity_name(severity) - log_breadcrumb(message, progname, severity_name) + severity_name = Bugsnag::Logging.get_severity_name(severity) + Bugsnag::Logging.log_breadcrumb(message, {:progname => progname}, severity_name) end end alias :log :add def <<(message) return unless @open - log_breadcrumb(message) + Bugsnag::Logging.log_breadcrumb(message) end def close @@ -47,22 +68,5 @@ def reopen @open = true true end - - private - def log_breadcrumb(message, progname = nil, severity = "unknown") - Bugsnag.leave_breadcrumb(message, Bugsnag::Breadcrumbs::LOG_TYPE, { - :progname => progname, - :severity => severity - }) - end - - private - def get_severity_name(severity) - if (0..5).include? severity - Bugsnag::Loggers::SEVERITIES[severity] - else - severity - end - end end end \ No newline at end of file diff --git a/spec/appender_spec.rb b/spec/appender_spec.rb new file mode 100644 index 000000000..11f14b338 --- /dev/null +++ b/spec/appender_spec.rb @@ -0,0 +1,65 @@ +# encoding: utf-8 + +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 + + \ No newline at end of file diff --git a/spec/logger_spec.rb b/spec/logger_spec.rb index c6dba6777..46576b49a 100644 --- a/spec/logger_spec.rb +++ b/spec/logger_spec.rb @@ -2,12 +2,12 @@ require 'spec_helper' require 'logger' -require 'bugsnag/loggers/logger' +require 'bugsnag/logging/logger' -describe Bugsnag::Loggers::Logger do +describe Bugsnag::Logging::Logger do before do - @logger = Bugsnag::Loggers::Logger.new + @logger = Bugsnag::Logging::Logger.new end it "writes by default" do @@ -15,7 +15,6 @@ "message", "log", { - :progname => nil, :severity => "unknown" } ) @@ -33,7 +32,6 @@ "message", "log", { - :progname => nil, :severity => "unknown" } ) @@ -55,7 +53,7 @@ end it "is a logger and a bugsnag logger" do - expect(@logger.class.ancestors).to include(Bugsnag::Loggers::Logger, Logger) + expect(@logger.class.ancestors).to include(Bugsnag::Logging::Logger, Logger) end end From 09499428f61a56cae7f9979e484e596e430efd3e Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Wed, 4 Oct 2017 11:21:52 +0100 Subject: [PATCH 04/11] Added flag to stop monkey patching when testing --- spec/appender_spec.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/appender_spec.rb b/spec/appender_spec.rb index 11f14b338..ac9b3711d 100644 --- a/spec/appender_spec.rb +++ b/spec/appender_spec.rb @@ -1,5 +1,8 @@ # encoding: utf-8 +# Necessary to avoid monkey patching thread methods +ENV["LOGGING_INHERIT_CONTEXT"] = "false" + require 'spec_helper' require 'logger' require 'logging' From 4f02f50bedc1ca64917f3b610db285eef6b90e9d Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Tue, 10 Oct 2017 09:58:05 +0100 Subject: [PATCH 05/11] Added logger example --- .../app/controllers/application_controller.rb | 6 +++ example/rails-42/app/models/test_model.rb | 2 + .../rails-42/config/initializers/bugsnag.rb | 3 -- example/rails-42/config/routes.rb | 1 + .../20171009132509_create_test_models.rb | 9 +++++ example/rails-42/db/schema.rb | 38 +++++++++++++++++++ example/rails-42/test/controllers/.keep | 0 example/rails-42/test/fixtures/.keep | 0 example/rails-42/test/helpers/.keep | 0 example/rails-42/test/integration/.keep | 0 example/rails-42/test/mailers/.keep | 0 example/rails-42/test/models/.keep | 0 example/rails-42/test/test_helper.rb | 10 ----- 13 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 example/rails-42/app/models/test_model.rb delete mode 100644 example/rails-42/config/initializers/bugsnag.rb create mode 100644 example/rails-42/db/migrate/20171009132509_create_test_models.rb create mode 100644 example/rails-42/db/schema.rb delete mode 100644 example/rails-42/test/controllers/.keep delete mode 100644 example/rails-42/test/fixtures/.keep delete mode 100644 example/rails-42/test/helpers/.keep delete mode 100644 example/rails-42/test/integration/.keep delete mode 100644 example/rails-42/test/mailers/.keep delete mode 100644 example/rails-42/test/models/.keep delete mode 100644 example/rails-42/test/test_helper.rb diff --git a/example/rails-42/app/controllers/application_controller.rb b/example/rails-42/app/controllers/application_controller.rb index 55f1e3588..6d4c1ae70 100644 --- a/example/rails-42/app/controllers/application_controller.rb +++ b/example/rails-42/app/controllers/application_controller.rb @@ -6,4 +6,10 @@ class ApplicationController < ActionController::Base def index raise "YO" end + + def crash_after_log + @test_model = TestModel.new :foo => "Foo" + @test_model.save + raise "Crash" + end end diff --git a/example/rails-42/app/models/test_model.rb b/example/rails-42/app/models/test_model.rb new file mode 100644 index 000000000..39bf2b8f1 --- /dev/null +++ b/example/rails-42/app/models/test_model.rb @@ -0,0 +1,2 @@ +class TestModel < ActiveRecord::Base +end diff --git a/example/rails-42/config/initializers/bugsnag.rb b/example/rails-42/config/initializers/bugsnag.rb deleted file mode 100644 index 0f3db4807..000000000 --- a/example/rails-42/config/initializers/bugsnag.rb +++ /dev/null @@ -1,3 +0,0 @@ -Bugsnag.configure do |config| - config.api_key = "066f5ad3590596f9aa8d601ea89af845" -end diff --git a/example/rails-42/config/routes.rb b/example/rails-42/config/routes.rb index 79275189e..40b952fa8 100644 --- a/example/rails-42/config/routes.rb +++ b/example/rails-42/config/routes.rb @@ -1,5 +1,6 @@ Rails.application.routes.draw do root :to => 'application#index' + get "log" => 'application#crash_after_log' # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/example/rails-42/db/migrate/20171009132509_create_test_models.rb b/example/rails-42/db/migrate/20171009132509_create_test_models.rb new file mode 100644 index 000000000..bebac26f9 --- /dev/null +++ b/example/rails-42/db/migrate/20171009132509_create_test_models.rb @@ -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 diff --git a/example/rails-42/db/schema.rb b/example/rails-42/db/schema.rb new file mode 100644 index 000000000..2f12a225d --- /dev/null +++ b/example/rails-42/db/schema.rb @@ -0,0 +1,38 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20171009132509) do + + create_table "delayed_jobs", force: :cascade do |t| + t.integer "priority", default: 0, null: false + t.integer "attempts", default: 0, null: false + t.text "handler", null: false + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.string "queue" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority" + + create_table "test_models", force: :cascade do |t| + t.string "foo" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/example/rails-42/test/controllers/.keep b/example/rails-42/test/controllers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/rails-42/test/fixtures/.keep b/example/rails-42/test/fixtures/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/rails-42/test/helpers/.keep b/example/rails-42/test/helpers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/rails-42/test/integration/.keep b/example/rails-42/test/integration/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/rails-42/test/mailers/.keep b/example/rails-42/test/mailers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/rails-42/test/models/.keep b/example/rails-42/test/models/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/rails-42/test/test_helper.rb b/example/rails-42/test/test_helper.rb deleted file mode 100644 index 92e39b2d7..000000000 --- a/example/rails-42/test/test_helper.rb +++ /dev/null @@ -1,10 +0,0 @@ -ENV['RAILS_ENV'] ||= 'test' -require File.expand_path('../../config/environment', __FILE__) -require 'rails/test_help' - -class ActiveSupport::TestCase - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... -end From 87e25085eb4cd0dadd504a82639dbc4c8e2565c5 Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Thu, 29 Mar 2018 11:46:51 +0100 Subject: [PATCH 06/11] feature(logging): Add logging for use with ActiveRecord/Mongoid - Refactor to fix rubocop issues. --- lib/bugsnag/logging/appender.rb | 32 +++++++++++++++++--------------- lib/bugsnag/logging/logger.rb | 19 ++++++++----------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/lib/bugsnag/logging/appender.rb b/lib/bugsnag/logging/appender.rb index 9a289f2f0..563f4097b 100644 --- a/lib/bugsnag/logging/appender.rb +++ b/lib/bugsnag/logging/appender.rb @@ -3,8 +3,8 @@ module Bugsnag::Logging class Appender < Logging::Appender - def initialize(level=Logger::INFO) - super "Bugsnag", {:level => level} + def initialize(level = Logger::INFO) + super "Bugsnag", { :level => level } end def <<(message) @@ -13,19 +13,21 @@ def <<(message) end def append(event) - return if (closed?)||(!allow(event)) - if (event.method.size > 0) && (event.file.size > 0) && (event.line.size > 0) - metadata = { - :trace => { - :method => event.method, - :file => event.file, - :line => event.line - }, - :data => event.data - } - else - metadata = event.data - end + 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::Logging.get_severity_name(event.level) Bugsnag::Logging.log_breadcrumb(event.logger, metadata, severity) end diff --git a/lib/bugsnag/logging/logger.rb b/lib/bugsnag/logging/logger.rb index 36890a3fd..904a0b736 100644 --- a/lib/bugsnag/logging/logger.rb +++ b/lib/bugsnag/logging/logger.rb @@ -2,7 +2,6 @@ require "bugsnag" module Bugsnag::Logging - SEVERITIES = [ "debug", "info", @@ -13,14 +12,14 @@ module Bugsnag::Logging ] def self.get_severity_name(severity) - if (0..5).include? severity + if (0..5).cover? severity SEVERITIES[severity] else severity end end - def self.log_breadcrumb(name, data=nil, severity = "unknown") + def self.log_breadcrumb(name, data = nil, severity = "unknown") metadata = { :severity => severity } @@ -34,25 +33,23 @@ def self.log_breadcrumb(name, data=nil, severity = "unknown") end class Logger < Logger - - def initialize(level=Logger::INFO) + 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 - if severity >= level - severity_name = Bugsnag::Logging.get_severity_name(severity) - Bugsnag::Logging.log_breadcrumb(message, {:progname => progname}, severity_name) - end + + Bugsnag::Logging.log_breadcrumb(message, { :progname => progname }, Bugsnag::Logging.get_severity_name(severity)) if severity >= level end - alias :log :add + alias log add def <<(message) return unless @open @@ -69,4 +66,4 @@ def reopen true end end -end \ No newline at end of file +end From 522195735d1d84ce92ee1aec9d1eb4238371ff31 Mon Sep 17 00:00:00 2001 From: Alex Moinet Date: Wed, 11 Apr 2018 14:19:16 +0100 Subject: [PATCH 07/11] feature(logging): Add logging for use with ActiveRecord/Mongoid - Move logger and appender from Bugsnag::Logging to Bugsnag::Breadcrumbs module --- .../{logging => breadcrumbs}/appender.rb | 8 +-- lib/bugsnag/breadcrumbs/logger.rb | 69 +++++++++++++++++++ lib/bugsnag/logging/logger.rb | 69 ------------------- spec/logger_spec.rb | 11 ++- 4 files changed, 78 insertions(+), 79 deletions(-) rename lib/bugsnag/{logging => breadcrumbs}/appender.rb (76%) create mode 100644 lib/bugsnag/breadcrumbs/logger.rb delete mode 100644 lib/bugsnag/logging/logger.rb diff --git a/lib/bugsnag/logging/appender.rb b/lib/bugsnag/breadcrumbs/appender.rb similarity index 76% rename from lib/bugsnag/logging/appender.rb rename to lib/bugsnag/breadcrumbs/appender.rb index 563f4097b..81b2da13f 100644 --- a/lib/bugsnag/logging/appender.rb +++ b/lib/bugsnag/breadcrumbs/appender.rb @@ -1,7 +1,7 @@ require_relative "logger" require "logging" -module Bugsnag::Logging +module Bugsnag::Breadcrumbs class Appender < Logging::Appender def initialize(level = Logger::INFO) super "Bugsnag", { :level => level } @@ -9,7 +9,7 @@ def initialize(level = Logger::INFO) def <<(message) return if closed? - Bugsnag::Logging.log_breadcrumb(message) + Bugsnag::Breadcrumbs.log_breadcrumb(message) end def append(event) @@ -28,8 +28,8 @@ def append(event) event.data end - severity = Bugsnag::Logging.get_severity_name(event.level) - Bugsnag::Logging.log_breadcrumb(event.logger, metadata, severity) + severity = Bugsnag::Breadcrumbs.get_severity_name(event.level) + Bugsnag::Breadcrumbs.log_breadcrumb(event.logger, metadata, severity) end end end diff --git a/lib/bugsnag/breadcrumbs/logger.rb b/lib/bugsnag/breadcrumbs/logger.rb new file mode 100644 index 000000000..511f42fd2 --- /dev/null +++ b/lib/bugsnag/breadcrumbs/logger.rb @@ -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 diff --git a/lib/bugsnag/logging/logger.rb b/lib/bugsnag/logging/logger.rb deleted file mode 100644 index 904a0b736..000000000 --- a/lib/bugsnag/logging/logger.rb +++ /dev/null @@ -1,69 +0,0 @@ -require "logger" -require "bugsnag" - -module Bugsnag::Logging - 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 - - class Logger < Logger - 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::Logging.log_breadcrumb(message, { :progname => progname }, Bugsnag::Logging.get_severity_name(severity)) if severity >= level - end - alias log add - - def <<(message) - return unless @open - Bugsnag::Logging.log_breadcrumb(message) - end - - def close - @open = false - true - end - - def reopen - @open = true - true - end - end -end diff --git a/spec/logger_spec.rb b/spec/logger_spec.rb index 46576b49a..a18f0b6d8 100644 --- a/spec/logger_spec.rb +++ b/spec/logger_spec.rb @@ -2,12 +2,12 @@ require 'spec_helper' require 'logger' -require 'bugsnag/logging/logger' +require 'bugsnag/breadcrumbs/logger' + +describe Bugsnag::Breadcrumbs::Logger do -describe Bugsnag::Logging::Logger do - before do - @logger = Bugsnag::Logging::Logger.new + @logger = Bugsnag::Breadcrumbs::Logger.new end it "writes by default" do @@ -53,8 +53,7 @@ end it "is a logger and a bugsnag logger" do - expect(@logger.class.ancestors).to include(Bugsnag::Logging::Logger, Logger) + expect(@logger.class.ancestors).to include(Bugsnag::Breadcrumbs::Logger, Logger) end end - \ No newline at end of file From 3741b34dc4addd6e0b1d49262d31bb9deec3bf8b Mon Sep 17 00:00:00 2001 From: Simon Maynard Date: Thu, 21 Jun 2018 17:44:09 -0700 Subject: [PATCH 08/11] Fix up loggers and tests --- lib/bugsnag.rb | 2 +- lib/bugsnag/breadcrumbs/appender.rb | 24 ++++++--------- lib/bugsnag/breadcrumbs/logger.rb | 9 +++--- spec/appender_spec.rb | 46 +++++++++++++---------------- spec/logger_spec.rb | 30 ++++++++++--------- 5 files changed, 52 insertions(+), 59 deletions(-) diff --git a/lib/bugsnag.rb b/lib/bugsnag.rb index d0d0bd614..77d1eea2b 100644 --- a/lib/bugsnag.rb +++ b/lib/bugsnag.rb @@ -124,7 +124,7 @@ def notify(exception, auto_notify=false, &block) ## # Records a breadcrumb to give context to notifications - def leave_breadcrumb(name, type=nil, metadata={}) + def leave_breadcrumb(name, metadata={}, type=Bugsnag::Breadcrumbs::MANUAL_TYPE) configuration.recorder.add_breadcrumb(Bugsnag::Breadcrumbs::Breadcrumb.new(name, type, metadata)) end diff --git a/lib/bugsnag/breadcrumbs/appender.rb b/lib/bugsnag/breadcrumbs/appender.rb index 81b2da13f..96c5e1f56 100644 --- a/lib/bugsnag/breadcrumbs/appender.rb +++ b/lib/bugsnag/breadcrumbs/appender.rb @@ -9,27 +9,21 @@ def initialize(level = Logger::INFO) def <<(message) return if closed? - Bugsnag::Breadcrumbs.log_breadcrumb(message) + Bugsnag::Breadcrumbs::Logger.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 + message = event.data.to_s + metadata = { + :method => event.method.to_s, + :file => event.file.to_s, + :line => event.line.to_s + }.delete_if {|k,v| v == ""} - severity = Bugsnag::Breadcrumbs.get_severity_name(event.level) - Bugsnag::Breadcrumbs.log_breadcrumb(event.logger, metadata, severity) + severity = Bugsnag::Breadcrumbs::Logger.get_severity_name(event.level) + Bugsnag::Breadcrumbs::Logger.log_breadcrumb(message, metadata, severity) end end end diff --git a/lib/bugsnag/breadcrumbs/logger.rb b/lib/bugsnag/breadcrumbs/logger.rb index 511f42fd2..54cfa87fe 100644 --- a/lib/bugsnag/breadcrumbs/logger.rb +++ b/lib/bugsnag/breadcrumbs/logger.rb @@ -20,17 +20,18 @@ def self.get_severity_name(severity) end end - def self.log_breadcrumb(name, data = nil, severity = "unknown") + def self.log_breadcrumb(message, data = nil, severity = "unknown") metadata = { - :severity => severity + :severity => severity, + :message => message } if data.is_a? Hash metadata.merge!(data) elsif !data.nil? - metadata[:data] = data + metadata[:data] = data.to_s end - Bugsnag.leave_breadcrumb(name, Bugsnag::Breadcrumbs::LOG_TYPE, metadata) + Bugsnag.leave_breadcrumb("Log output", metadata, Bugsnag::Breadcrumbs::LOG_TYPE) end def initialize(level = Logger::INFO) diff --git a/spec/appender_spec.rb b/spec/appender_spec.rb index ac9b3711d..01ee55ceb 100644 --- a/spec/appender_spec.rb +++ b/spec/appender_spec.rb @@ -6,48 +6,46 @@ require 'spec_helper' require 'logger' require 'logging' -require 'bugsnag/logging/appender' +require 'bugsnag/breadcrumbs/appender' + +describe Bugsnag::Breadcrumbs::Appender do -describe Bugsnag::Logging::Appender do - before do - @appender = Bugsnag::Logging::Appender.new + @appender = Bugsnag::Breadcrumbs::Appender.new end it "writes breadcrumbs" do expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", + "Log output", { - :severity => "unknown" - } + :severity => "unknown", + :message => "message" + }, + "log" ) @appender << "message" end it "write breadcrumbs from a logevent" do expect(Bugsnag).to receive(:leave_breadcrumb).with( - "testLogger", - "log", + "Log output", { - :data => ["message1", "message2"], - :severity => "info" - } + :message => ["message1", "message2"].to_s, + :severity => "info", + }, + "log" ) 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" - } - ) + expect(Bugsnag).to receive(:leave_breadcrumb) do |name, metadata, severity| + expect(name).to eq("Log output") + expect(metadata).to include(:message, :severity, :method, :file, :line) + expect(metadata).to include(:message => ["message1", "message2"].to_s, :severity => "info") + expect(severity).to eq("log") + end logevent = Logging::LogEvent.new("testLogger", Logger::INFO, ["message1", "message2"], true) @appender.append logevent end @@ -61,8 +59,6 @@ end it "is an appender and a bugsnag appender" do - expect(@appender.class.ancestors).to include(Bugsnag::Logging::Appender, Logging::Appender) + expect(@appender.class.ancestors).to include(Bugsnag::Breadcrumbs::Appender, Logging::Appender) end end - - \ No newline at end of file diff --git a/spec/logger_spec.rb b/spec/logger_spec.rb index a18f0b6d8..b4d404f08 100644 --- a/spec/logger_spec.rb +++ b/spec/logger_spec.rb @@ -12,11 +12,12 @@ it "writes by default" do expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", + "Log output", { - :severity => "unknown" - } + :severity => "unknown", + :message => "message" + }, + "log" ) @logger << "message" end @@ -29,11 +30,12 @@ it "writes after being re-opened" do expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", + "Log output", { - :severity => "unknown" - } + :severity => "unknown", + :message => "message" + }, + "log" ) @logger.close @logger.reopen @@ -42,18 +44,18 @@ it "allows a progname and severity" do expect(Bugsnag).to receive(:leave_breadcrumb).with( - "message", - "log", + "Log output", { :progname => "logTests", - :severity => "info" - } + :severity => "info", + :message => "message" + }, + "log" ) - @logger.add Logger::INFO, "message", "logTests" + @logger.info("logTests") { "message" } end it "is a logger and a bugsnag logger" do expect(@logger.class.ancestors).to include(Bugsnag::Breadcrumbs::Logger, Logger) end end - From 5e6377da74dee6f0c4959ee6d6ec8b684726ad71 Mon Sep 17 00:00:00 2001 From: Simon Maynard Date: Thu, 21 Jun 2018 17:47:55 -0700 Subject: [PATCH 09/11] Pin rdoc --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index b052801eb..2e1ef8175 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ 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 'rdoc', '~> 5.1.0' gem 'rspec-mocks' gem 'pry' gem 'addressable', '~> 2.3.8' From 102ff82f064d8246efd10fdf55a100888e3afbe5 Mon Sep 17 00:00:00 2001 From: Simon Maynard Date: Thu, 21 Jun 2018 17:55:56 -0700 Subject: [PATCH 10/11] Fix test --- spec/report_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/report_spec.rb b/spec/report_spec.rb index 0b7db97c7..1a52551b2 100644 --- a/spec/report_spec.rb +++ b/spec/report_spec.rb @@ -119,7 +119,7 @@ def gloops end it "attaches added breadcrumbs" do - Bugsnag.leave_breadcrumb("Test", Bugsnag::Breadcrumbs::MANUAL_TYPE, {:foo => "foo", :bar => "bar"}) + Bugsnag.leave_breadcrumb("Test", {:foo => "foo", :bar => "bar"}, Bugsnag::Breadcrumbs::MANUAL_TYPE) Bugsnag.notify(BugsnagTestException.new("It crashed")) expect(Bugsnag).to have_sent_notification{ |payload, headers| breadcrumb = get_breadcrumb_from_payload(payload) From 1ff4f8dc434722ae2e8d6df7ed860ed98e45463f Mon Sep 17 00:00:00 2001 From: Simon Maynard Date: Thu, 21 Jun 2018 18:18:36 -0700 Subject: [PATCH 11/11] Rubocop --- lib/bugsnag/breadcrumbs/appender.rb | 2 +- lib/bugsnag/breadcrumbs/logger.rb | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/bugsnag/breadcrumbs/appender.rb b/lib/bugsnag/breadcrumbs/appender.rb index 96c5e1f56..790c6fa7a 100644 --- a/lib/bugsnag/breadcrumbs/appender.rb +++ b/lib/bugsnag/breadcrumbs/appender.rb @@ -20,7 +20,7 @@ def append(event) :method => event.method.to_s, :file => event.file.to_s, :line => event.line.to_s - }.delete_if {|k,v| v == ""} + }.delete_if { |_k, v| v == "" } severity = Bugsnag::Breadcrumbs::Logger.get_severity_name(event.level) Bugsnag::Breadcrumbs::Logger.log_breadcrumb(message, metadata, severity) diff --git a/lib/bugsnag/breadcrumbs/logger.rb b/lib/bugsnag/breadcrumbs/logger.rb index 54cfa87fe..e3f012b91 100644 --- a/lib/bugsnag/breadcrumbs/logger.rb +++ b/lib/bugsnag/breadcrumbs/logger.rb @@ -48,7 +48,12 @@ def add(severity, message = nil, progname = nil) message = progname end - Bugsnag::Breadcrumbs::Logger.log_breadcrumb(message, { :progname => progname }, Bugsnag::Breadcrumbs::Logger.get_severity_name(severity)) if severity >= level + if severity >= level + Bugsnag::Breadcrumbs::Logger.log_breadcrumb( + message, + { :progname => progname }, + Bugsnag::Breadcrumbs::Logger.get_severity_name(severity)) + end end alias log add