Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add on additional fields to all log entries #303

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 19 additions & 1 deletion lib/lograge.rb
Expand Up @@ -172,15 +172,33 @@ def setup_custom_payload
end

def extend_base_class(klass)
append_payload_method = klass.instance_method(:append_info_to_payload)
custom_payload_method = lograge_config.custom_payload_method
define_append_info_to_payload_method(klass, custom_payload_method)
prepend_set_request_store_before_action(klass, custom_payload_method)
end

def define_append_info_to_payload_method(klass, custom_payload_method)
append_payload_method = klass.instance_method(:append_info_to_payload)
klass.send(:define_method, :append_info_to_payload) do |payload|
append_payload_method.bind(self).call(payload)
payload[:custom_payload] = custom_payload_method.call(self)
end
end

def prepend_set_request_store_before_action(klass, custom_payload_method)
klass.class_eval do
prepend_before_action do |controller|
# TODO: it's not ideal that the user's custom_payload method would be called
# twice (below and in the append_info_to_payload).
# Would removing calling it in append_info_to_payload and accessing the
# payload via the request store in Lograge::LogSubscribers::Base#custom_options
# be okay? (i.e. modify the line
# `options.merge event.payload[:custom_payload] || {}` to read from request store)
RequestStore.store[:lograge_custom_payload] = custom_payload_method.call(controller)
end
end
end

def set_lograge_log_options
Lograge.logger = lograge_config.logger
Lograge.custom_options = lograge_config.custom_options
Expand Down
4 changes: 4 additions & 0 deletions lib/lograge/log_subscribers/action_controller.rb
Expand Up @@ -5,6 +5,10 @@ def process_action(event)
process_main_event(event)
end

def start_processing(event)
RequestStore.store[:lograge_event_payload] = event.payload.without(:headers, :params)
end

def redirect_to(event)
RequestStore.store[:lograge_location] = event.payload[:location]
end
Expand Down
4 changes: 4 additions & 0 deletions lib/lograge/log_subscribers/base.rb
Expand Up @@ -58,6 +58,10 @@ def get_error_status_code(exception)
end

def custom_options(event)
# TODO: unsure if MergedWithLogragePayload should care about the user's
# custom_options for now (if it did, it seems that it would only make sense
# to call custom_options twice, one for the process_action event as is, plus one for
# the newly listened to start_processing.)
options = Lograge.custom_options(event) || {}
options.merge event.payload[:custom_payload] || {}
end
Expand Down
@@ -0,0 +1,23 @@
begin
require 'logstash-logger'
require 'logstash-event'
rescue LoadError
puts 'You need to install the logstash-event and logstash-logger gems ' \
'to use Lograge::LogStashLoggerFormatters::MergedWithLogragePayload.'
raise
end

module Lograge
module LogStashLoggerFormatters
class MergedWithLogragePayload < LogStashLogger::Formatter::Base
private

def format_event(event)
lograge_event_payload = RequestStore.store[:lograge_event_payload] || {}
lograge_event_payload.merge!(RequestStore.store[:lograge_custom_payload] || {})
event.overwrite(event.fields.merge(lograge_event_payload))
"#{event.to_json}\n"
end
end
end
end
4 changes: 4 additions & 0 deletions spec/lograge_spec.rb
Expand Up @@ -113,6 +113,10 @@ def append_info_to_payload(payload)
def current_user_id
'24601'
end

def self.prepend_before_action(&block)
block.call(new)
end
end
end
let(:payload) { { timestamp: Date.parse('5-11-1955') } }
Expand Down