Skip to content

Instantly share code, notes, and snippets.

@n3bulous
Last active January 22, 2024 20:39
Show Gist options
  • Save n3bulous/df8abc8cbe21d96f2e11a49da7a572c1 to your computer and use it in GitHub Desktop.
Save n3bulous/df8abc8cbe21d96f2e11a49da7a572c1 to your computer and use it in GitHub Desktop.
Lograge with NewRelic Config
# Shared by Martin Streicher in the Rails Performance Slack
# https://railsperf.slack.com/archives/C0RUUGY6R/p1702565130357359
#
config.lograge.enabled = true # see lograge section below...
config.lograge.formatter = Lograge::Formatters::Logstash.new
config.log_formatter = ::NewRelic::Agent::Logging::DecoratingFormatter.new
config.lograge.custom_options =
lambda do |event|
payload = event.payload
parameter_filter =
ActiveSupport::ParameterFilter.new(
Rails.application.config.filter_parameters
)
params =
parameter_filter.filter(
payload.fetch(:params, {}).except(*ActionController::LogSubscriber::INTERNAL_PARAMS)
)
{
log_type: "api",
request_id: payload[:request_id],
params: params.to_json,
exception: payload[:exception], # ["ExceptionClass", "the message"]
backtrace: payload[:exception_object]&.backtrace&.join(" -- ") # the exception instance
}
end
@n3bulous
Copy link
Author

I ended up using the following for JSON-only logging

Rails.application.configure do
  config.lograge.formatter = Lograge::Formatters::Json.new
  config.lograge.logger = ActiveSupport::Logger.new($stdout)
  config.colorize_logging = false
  config.lograge.formatter = Lograge::Formatters::Json.new
  config.lograge.enabled = true
  config.lograge.keep_original_rails_log = true

  config.lograge.custom_options = lambda do |event|
    {
      application: Rails.application.class.module_parent_name.downcase,
      exception: event.payload[:exception]&.first,
      host: event.payload[:host],
      ip: event.payload[:ip],
      level: event.payload[:level],
      params: event.payload[:params].except(:action, :controller).to_json,
      process_id: Process.pid,
      rails_env: Rails.env,
      remote_ip: event.payload[:remote_ip],
      request_id: event.payload[:headers]["action_dispatch.request_id"],
      request_time: Time.zone.now,
      user_id: event.payload[:current_user_id],
      x_forwarded_for: event.payload[:x_forwarded_for],
    }.compact
  end
end

with app/application_controller.rb

  def append_info_to_payload(payload)
    super
    payload[:level] =
      case payload[:status]
      when (200..399)
        "INFO"
      when (400..499)
        "WARN"
      else
        "ERROR"
      end
    payload[:host] = request.host
    payload[:remote_ip] = request.remote_ip
    payload[:ip] = request.ip
    payload[:current_user_id] = current_user&.id
  en

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment