Collecte de logs avec Ruby on Rails
Présentation
Pour envoyer vos logs à Datadog, configurez la journalisation au sein d’un fichier avec Lograge
et effectuez un suivi de ce fichier avec votre Agent Datadog. Tenez compte des attributs réservés lors de la configuration de la journalisation avec Ruby.
Lograge vous permet de transformer le format de log standard basé sur du texte. Exemple :
Started GET "/" for 127.0.0.1 at 2012-03-10 14:28:14 +0100
Processing by HomeController#index as HTML
Rendered text template within layouts/application (0.0ms)
Rendered layouts/_assets.html.erb (2.0ms)
Rendered layouts/_top.html.erb (2.6ms)
Rendered layouts/_about.html.erb (0.3ms)
Rendered layouts/_google_analytics.html.erb (0.4ms)
Completed 200 OK in 79ms (Views: 78.8ms | ActiveRecord: 0.0ms)
Ce format peut être remplacé par le format JSON suivant, qui est doté une meilleure structure :
{
"timestamp": "2016-01-12T19:15:19.118829+01:00",
"level": "INFO",
"logger": "Rails",
"method": "GET",
"path": "/jobs/833552.json",
"format": "json",
"controller": "jobs",
"action": "show",
"status": 200,
"duration": 58.33,
"view": 40.43,
"db": 15.26
}
- Ajoutez le gem
lograge
à votre projet : - Dans votre fichier de configuration, définissez ce qui suit pour configurer Lograge :
# Lograge config
config.lograge.enabled = true
# This specifies to log in JSON format
config.lograge.formatter = Lograge::Formatters::Json.new
## Disables log coloration
config.colorize_logging = false
# Log to a dedicated file
config.lograge.logger = ActiveSupport::Logger.new(Rails.root.join('log', "#{Rails.env}.log"))
# This is useful if you want to log query parameters
config.lograge.custom_options = lambda do |event|
{ :ddsource => 'ruby',
:params => event.payload[:params].reject { |k| %w(controller action).include? k }
}
end
Remarque : Lograge peut également ajouter des informations contextuelles à vos logs. Consultez la documentation Lograge (en anglais) pour en savoir plus.
Pour obtenir un exemple plus détaillé de cette configuration, consultez l’article Comment recueillir, personnaliser et gérer des logs d’application Rails (en anglais).
RocketPants
Pour configurer Lograge pour des contrôleurs rocket_pants
, procédez comme suit dans le fichier config/initializers/lograge_rocketpants.rb
(l’emplacement varie selon votre projet) :
# Tiré de :
# https://github.com/Sutto/rocket_pants/issues/111
app = Rails.application
if app.config.lograge.enabled
ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
case subscriber
when ActionController::LogSubscriber
Lograge.unsubscribe(:rocket_pants, subscriber)
end
end
Lograge::RequestLogSubscriber.attach_to :rocket_pants
end
Ajoutez le gem grape_logging
à votre projet :
Ajoutez la configuration supplémentaire à Grape :
use GrapeLogging::Middleware::RequestLogger,
instrumentation_key: 'grape',
include: [ GrapeLogging::Loggers::Response.new,
GrapeLogging::Loggers::FilterParameters.new ]
Créez le fichier config/initializers/instrumentation.rb
et ajoutez la configuration suivante :
# Subscribe to grape request and log with a logger dedicated to Grape
grape_logger = Logging.logger['Grape']
ActiveSupport::Notifications.subscribe('grape') do |name, starts, ends, notification_id, payload|
grape_logger.info payload
end
Une fois la collecte de logs activée, procédez comme suit pour configurer la collecte de logs personnalisée afin de suivre vos fichiers de log et les envoyer à Datadog.
- Créez un dossier
ruby.d/
dans le répertoire de configuration conf.d/
de l’Agent. - Créez un fichier
conf.yaml
dans votre dossier ruby.d/
avec le contenu suivant : logs:
- type: file
path: "<RUBY_LOG_FILE_PATH>.log"
service: <SERVICE_NAME>
source: ruby
sourcecategory: sourcecode
## Uncomment the following processing rule for multiline logs if they
## start by the date with the format yyyy-mm-dd
#log_processing_rules:
# - type: multi_line
# name: new_log_start_with_date
# pattern: \d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])
- Redémarrez l’Agent.
- Lancez la sous-commande status de l’Agent et cherchez
ruby
dans la section Checks
pour vérifier que les logs sont bien transmis à Datadog.
Si les logs sont au format JSON, Datadog parse automatiquement les messages de log pour extraire les attributs. Utilisez le Log Explorer pour visualiser et dépanner vos logs.
Associer vos logs à vos traces
Si la solution APM est activée pour cette application, vous pouvez améliorer la corrélation entre les traces et les logs d’application en suivant les instructions de journalisation Ruby pour APM afin d’ajouter automatiquement des identifiants de trace et de span à vos logs.
Meilleures pratiques
Dès que possible, ajoutez du contexte supplémentaire (utilisateur, session, action et métriques) à vos logs.
Au lieu d’enregistrer de simples messages dans des chaînes, utilisez les hashs de log comme dans l’exemple suivant :
my_hash = {'user' => '1234', 'button_name'=>'save','message' => 'User 1234 clicked on button saved'};
logger.info(my_hash);
Le hash est converti en JSON, et vous pouvez effectuer des analyses pour user
et button_name
:
{
"timestamp": "2016-01-12T19:15:18.683575+01:00",
"level": "INFO",
"logger": "WelcomeController",
"message": {
"user": "1234",
"button_name": "save",
"message": "User 1234 clicked on button saved"
}
}
Pour aller plus loin
Documentation, liens et articles supplémentaires utiles: