Rails 7.1, log to STDOUT and log/production.log – Ruby-on-rails

by
Alexei Petrov
logging ruby-on-rails ruby-on-rails-7

Quick Fix: Utilize Rails v7.1‘s BroadcastLogger class to broadcast logs to console and file. This method centralizes logging with more straightforward configuration.

The Problem:

In a Rails 7.1.2 application, the logger is currently configured to log to STDOUT. The task is to modify this configuration to enable logging to both STDOUT and a log file, specifically log/production.log, while maintaining compatibility with Rails 7.1. The provided instructions for Rails versions prior to 7.1 do not apply due to API changes. Determine the appropriate approach for achieving this dual logging functionality in Rails 7.1.

The Solutions:

Solution 1: Using ActiveSupport::BroadcastLogger

In Rails 7.1, you can use the ActiveSupport::BroadcastLogger class to log to both STDOUT and a file. Here’s an example:

stdout_logger           = ActiveSupport::Logger.new(STDOUT, formatter: Logger::Formatter.new)
file_logger             = ActiveSupport::Logger.new("log/production.log", formatter: Logger::Formatter.new)
tagged_stdout_logger    = ActiveSupport::TaggedLogging.new(stdout_logger)
tagged_file_logger      = ActiveSupport::TaggedLogging.new(file_logger)
broadcast_logger = ActiveSupport::BroadcastLogger.new(tagged_stdout_logger, tagged_file_logger)
config.logger    = broadcast_logger

This will log to both STDOUT and the file log/production.log.


Solution 2: Cleaner Setup with Rails 7.1+

In Rails 7.1 and later, you can use the formatter option when creating the ActiveSupport::Logger objects, which makes the setup cleaner:

config.logger = ActiveSupport::BroadcastLogger.new(
  ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new($stdout, formatter: Logger::Formatter.new)),
  ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new("log/production.log", formatter: Logger::Formatter.new))
)

This also logs to both STDOUT and the file log/production.log.

Q&A

How to log to both STDOUT and log/production.log in a new Rails 7.1.2 application?

User ActiveSupport::BroadcastLogger to handle the broadcasting of logs to multiple destinations.

What is the new class added in Rails 7.1 for handling broadcasting of logs?

ActiveSupport::BroadcastLogger is the newly added class for handling broadcasting of logs.

What’s the shorter version of the broadcast logger setup?

Pass formatter directly to new in BroadcastLogger‘s initialization.

Video Explanation:

The following video, titled "Lograge - Awesome Ruby Gems #RubyOnRails - YouTube", provides additional insights and in-depth exploration related to the topics discussed in this post.

Play video

... Rails logs. I use it in production on most my projects. Here is how to set it up & customise it a little. # Chapters 0:00 - What are we ...