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
}

Installer et configurer votre logger

  1. Ajoutez le gem lograge à votre projet :
    gem 'lograge'
    
  2. 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
  1. Ajoutez le gem grape_logging à votre projet :

    gem 'grape_logging'
    
  2. Ajoutez la configuration supplémentaire à Grape :

    use GrapeLogging::Middleware::RequestLogger,
          instrumentation_key: 'grape',
          include: [ GrapeLogging::Loggers::Response.new,
                    GrapeLogging::Loggers::FilterParameters.new ]
    
  3. 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
    

Configurer l’Agent Datadog

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.

  1. Créez un dossier ruby.d/ dans le répertoire de configuration conf.d/ de l’Agent.
  2. 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])
    
  3. Redémarrez l’Agent.
  4. 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