Skip to content

Commit

Permalink
Add TaggedLogging support
Browse files Browse the repository at this point in the history
Code grabbed from graylog-labs#81

Signed-off-by: Adam Tharani <[email protected]>
  • Loading branch information
adamtharani committed Jul 26, 2024
1 parent c6831f1 commit 70faa78
Showing 1 changed file with 33 additions and 3 deletions.
36 changes: 33 additions & 3 deletions lib/gelf/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module GELF
# Methods for compatibility with Ruby Logger.
module LoggerCompatibility

attr_accessor :formatter
attr_accessor :formatter, :log_tags

# Use it like Logger#add... or better not to use at all.
def add(level, message = nil, progname = nil, &block)
Expand All @@ -28,9 +28,14 @@ def add(level, message = nil, progname = nil, &block)
message_hash.merge!(self.class.extract_hash_from_exception(message))
end

if message_hash.key?('short_message') && !message_hash['short_message'].empty?
notify_with_level(level, message_hash)
return if !message_hash.key?('short_message') || message_hash['short_message'].empty?

# Include tags in message hash
Array(log_tags).each_with_index do |tag_name, index|
message_hash.merge!("_#{tag_name}" => current_tags[index]) if current_tags[index]
end

notify_with_level(level, message_hash)
end

# Redefines methods in +Notifier+.
Expand All @@ -51,12 +56,37 @@ def add(level, message = nil, progname = nil, &block)
def <<(message)
notify_with_level(GELF::UNKNOWN, 'short_message' => message)
end

def tagged(*tags)
new_tags = push_tags(*tags)
yield self
ensure
current_tags.pop(new_tags.size)
end

def push_tags(*tags)
tags.flatten.reject { |t| t.respond_to?(:empty?) ? !!t.empty? : !t }.tap do |new_tags|
current_tags.concat new_tags
end
end

def current_tags
val = Thread.current.thread_variable_get(:gelf_tagged_logging_tags)
return val unless val.nil?
Thread.current.thread_variable_set(:gelf_tagged_logging_tags, [])
end
end

# Graylog2 notifier, compatible with Ruby Logger.
# You can use it with Rails like this:
# config.logger = GELF::Logger.new("localhost", 12201, "WAN", { :facility => "appname" })
# config.colorize_logging = false
#
# Tagged logging (with tags from rack middleware) (order of tags is important)
# Adds custom gelf messages: { '_uuid_name' => <uuid>, '_remote_ip_name' => <remote_ip> }
# config.logger = GELF::Logger.new("localhost", 12201, "LAN", { :facility => "appname" })
# config.log_tags = [:uuid, :remote_ip]
# config.logger.log_tags = [:uuid_name, :remote_ip_name] # Same order as config.log_tags
class Logger < Notifier
include LoggerCompatibility
end
Expand Down

0 comments on commit 70faa78

Please sign in to comment.