It’s easy to recognize problems in Ruby on Rails, but finding each problem’s
source can be a challenging task. A problem due to an unexpected event could result in hours of searching through log files and attempting to reproduce the issue. Poor logs will leave you searching, while a helpful log can assist you in finding the cause right away.
Ruby on Rails applications automatically create and maintain the basic text
logs for each environment, such as development, staging, and production. You can easily format and add extra information to the logs using open-source logging libraries, such as Lograge and Fluentd. These libraries effectively manage small applications, but as you scale your application across many servers, developers need to aggregate logs to troubleshoot problems across all of them.
In this tutorial, we will show you how Ruby on Rails applications handle
logging natively. Then, we’ll show you how to send the logs to SolarWinds®
Papertrail™. This log management solution enables you to centralize your logs in the cloud and provides helpful features like fast search, alerts, and more.
Ruby on Rails Native Logging
Ruby offers a built-in logging system. To use it, simply include the following
code snippet in your environment.rb
(development.rb
/production.rb
). You can find environments under the config directory of the root project.
config.logger = Logger.new(STDOUT)
Or you can include the following in an initializer:
Rails.logger = Logger.new(STDOUT)
By default, each log is created under #{Rails.root}/log/
and the log file is
named after the environment in which the application is running. The default format gives basic information that includes the date/time of log generation and description (message or exception) of the log.
D, [2018-08-31T14:12:44.116332 #28944] DEBUG -- : Debug message
I, [2018-08-31T14:12:44.117330 #28944] INFO -- : Test message
F, [2018-08-31T14:12:44.118348 #28944] FATAL -- : Terminating application, raised unrecoverable error!!!
F, [2018-08-31T14:12:44.122350 #28944] FATAL -- : Exception (something bad happened!):
Each log line also includes the severity, otherwise known as log level. The
log levels enable you to filter the logs when outputting them or when
monitoring problems, such as errors or fatal. The available log levels are
:debug
, :info
, :warn
, :error
, :fatal
, and :unknown
. These are
converted to uppercase when output in the log file.
Formatting Logs Using Lograge
The default logging in Ruby on Rails during development or in production can be noisy, as you can see below. It also records a limited amount of
information for each page view.
I, [2018-08-31T14:37:44.588288 #27948] INFO -- : method=GET path=/ format=html controller=Rails::WelcomeController action=index status=200 duration=105.06 view=51.52 db=0.00 params={'controller'=>'rails/welcome', 'action'=>'index'} headers=#<ActionDispatch::Http::Headers:0x046ab950> view_runtime=51.52 db_runtime=0
Lograge adds extra detail and uses a format that is less human readable, but
more useful for large-scale analysis through its JSON output option. JSON
makes it easier to search, filter, and summarize large volumes of logs. The discrete fields facilitate the process of searching through logs and filtering for the information you need.
I, [2018-08-31T14:51:54.603784 #17752] INFO -- : {'method':'GET','path':'/','format':'html','controller':'Rails::WelcomeController','action':'index','status':200,'duration':104.06,'view':51.99,'db':0.0,'params':{'controller':'rails/welcome','action':'index'},'headers':'#<ActionDispatch::Http::Headers:0x03b75520>','view_runtime':51.98726899106987,'db_runtime':0}
In order to configure Lograge in a Ruby on Rails app, you need to follow some simple steps:
Step 1: Find the Gemfile under the project root directory and add the
following gem.
gem 'lograge'
Step 2: Enable Lograge in each relevant environment (development,
production, staging) or in the initializer. You can find all those
environments under the config directory of your project. To find the
initializer, open up the config directory of your project.
# config/initializers/lograge.rb
# OR
# config/environments/production.rb
Rails.application.configure do
config.lograge.enabled = true
end
Step 3: If you’re using Rails 5’s API-only mode and inherit from
ActionController::API
, you must define it as the controller base class that
Lograge will patch:
# config/initializers/lograge.rb
Rails.application.configure do
config.lograge.base_controller_class = 'ActionController::API'
end
With Lograge, you can include additional attributes in log messages, like user ID or request ID, host, source IP, etc. You can read the Lograge
documentation to get more information.
Here’s a simple example that captures three attributes:
class ApplicationController < ActionController::Base
before_action :append_info_to_payload
def append_info_to_payload(payload)
super
payload[:user_id] = current_user.try(:id)
payload[:host] = request.host
payload[:source_ip] = request.remote_ip
end
end
The above three attributes are logged in environment.rb
(production.rb
/development.rb
) with this block.
config.lograge.custom_options = lambda do |event|
event.payload
end
Troubleshoot Problems Faster Using Papertrail
Papertrail is a popular cloud-hosted log management service that integrates
with different logging library solutions. It is easier to centralize all your Ruby on Rails log management in the cloud. You can quickly track real-time activity, making it easier to identify and troubleshoot real-time production
applications.
Papertrail provides numerous features for handling Ruby on Rails log files, including:
Instant log visibility: Papertrail provides fast search and team-wide
access. It also provides analytics reporting and webhook monitoring, which
can be set up typically in less than a minute.
Aggregate logs: : Papertrail aggregates logs across your entire deployment, making them available from a single location. It provides you with an easy way to access logs, including application logs, database logs, Apache logs, and more.
Tail and search logs: Papertrail lets you tail logs in real time from
multiple devices. With the help of advanced searching and filtering tools, you can quickly troubleshoot issues in a production environment.
Proactive alert notifications: Almost every application has critical events
that require human attention. That’s precisely why alerts exist. Papertrail
gives you the ability to receive alerts via email, Slack, Librato®, PagerDuty,
or any custom HTTP webhooks of your choice.
Log archives: You can load the Papertrail log archives into third-party
utilities, such as Redshift or Hadoop.
Logs scalability: With Papertrail, you can scale your log volume and desired searchable duration.
Encryption: For your security, Papertrail supports optional TLS encryption
and certificate-based destination host verification.
Configuring Ruby on Rails to Send Logs to Papertrail
It’s an easy task to get started with Papertrail. If you already have log files,
you can send them to Papertrail using Nxlog or remote_syslog2. This utility will monitor the log files and send new logs to Papertrail. Next, we’ll show you how to send events asynchronously from Ruby on Rails using the remote_syslog_logger.
Add the remote_syslog_logger to your Gemfile. If you are not using a Gemfile, run the following script:
$ gem install remote_syslog_logger
Change the environment configuration file to log via remote_syslog_logger. This is almost always in config/environment.rb
(to affect all environments) or config/environments/<environment name>.rb
, such as config/environments/production.rb
(to affect only a specific environment). Update the host and port to the ones given to you in your Papertrail log destination settings.
config.logger = RemoteSyslogLogger.new('logsN.papertrailapp.com', XXXXX)
It’s that simple! Your logs should now be sent to Papertrail.
Papertrail is designed to help you troubleshoot customer problems, resolve
error messages, improve slow database queries, and more. It gives you analytical tools to help identify and resolve system anomalies and potential
security issues. Learn more about how Papertrail can give you frustration-free log management in the cloud, and sign up for a trial or the free plan to get started.
The SolarWinds trademarks, service marks, and logos are the exclusive property of SolarWinds Worldwide, LLC or its affiliates. All other trademarks are the property of their respective owners.