Skip to content

Commit

Permalink
Honeybadger.logger
Browse files Browse the repository at this point in the history
  • Loading branch information
shalvah committed Dec 23, 2022
1 parent 9990163 commit 614b699
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 1 deletion.
2 changes: 2 additions & 0 deletions honeybadger.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,6 @@ Gem::Specification.new do |s|
s.require_paths = ['lib', 'vendor/capistrano-honeybadger/lib']

s.executables << 'honeybadger'

s.add_dependency "semantic_logger", "~> 4.12"
end
7 changes: 6 additions & 1 deletion lib/honeybadger/config/defaults.rb
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,12 @@ class Boolean; end
description: 'Enable/Disable automatic breadcrumbs from log messages.',
default: true,
type: Boolean
}
},
:'semantic_logger.enabled' => {
description: 'Automatically add the Honeybadger appender to your semantic logger configuration.',
default: false,
type: Boolean
},
}.freeze

DEFAULTS = Hash[OPTIONS.map{|k,v| [k, v[:default]] }].freeze
Expand Down
54 changes: 54 additions & 0 deletions lib/honeybadger/plugins/semantic_logger.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
require 'honeybadger/plugin'
require 'semantic_logger'

module Honeybadger
module Plugins
# @api private
# The Honeybadger semantic_logger plugin. There are two ways to use this:
# 1. `Honeybadger.logger` is a Semantic Logger appender which sends logs to Honeybadger.
# Use it like any other SemanticLogger instance:
# Honeybadger.logger.info("Some message", some: :data)
# Honeybadger.logger.measure("Fed the dog", duration: 2.minutes)
# 2. If `config.semantic_logger.enabled` is true, the appender will be automatically added to your SemanticLogger config,
# so writing your logs as normal will also send them to Honeybadger.
# SemanticLogger["MyApp"].info("Some message", some: :data)
# Rails.logger.info("Some message", some: :data)
# Note that the Rails.logger case requires you to install `rails_semantic_logger`.
Plugin.register :semantic_logger do
requirement { config[:'semantic_logger.enabled'] }

execution do
next if ::SemanticLogger.appenders.map(&:name).include? Honeybadger::Plugins::HoneybadgerAppender.name

appender = Honeybadger::Plugins::HoneybadgerAppender.create
::SemanticLogger.add_appender(appender: appender)
end
end

class HoneybadgerAppender < SemanticLogger::Appender::Http
def log(log_details)
return false unless should_log?(log_details)

super
end

def should_log?(log_details)
# Some custom filter, maybe?
super
end

HONEYBADGER_LOGS_URL = "http://localhost:4567/log"

def self.create(**args)
args[:environment] ||= ::Honeybadger.config[:env]
args[:host] ||= ::Honeybadger.config[:hostname]
args = args.merge(
url: HONEYBADGER_LOGS_URL,
username: 'honeybadger',
password: ::Honeybadger. config[:api_key]
)
new(**args)
end
end
end
end
7 changes: 7 additions & 0 deletions lib/honeybadger/singleton.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@ def notify(exception_or_opts, opts = {})
Agent.instance.notify(exception_or_opts, opts)
end

def logger
# THis method sends a log directly to HB (skipping other registered SemanticLogger appenders),
# so it uses the appender directly. However, we use a different instance of the appender,
# to avoid concurrency issues.
@local_appender ||= Honeybadger::Plugins::HoneybadgerAppender.create
end

# @api private
def load_plugins!
Dir[File.expand_path('../plugins/*.rb', __FILE__)].each do |plugin|
Expand Down

0 comments on commit 614b699

Please sign in to comment.