Présentation

Utilisez votre logger Python préféré pour écrire des logs dans un fichier sur votre host. Surveillez ensuite le fichier avec l’Agent Datadog pour envoyer vos logs vers Datadog.

Configurer votre logger

Les logs Python sont assez complexes à gérer, principalement à cause des tracebacks. Ils sont divisés en plusieurs lignes, ce qui les rend difficiles à associer à l’événement de log d’origine. Pour répondre à ce cas de figure, nous vous conseillons d’utiliser un formateur JSON lors de l’écriture des logs afin de :

  • Garantir que chaque paramètre stack_trace est correctement associé au bon log
  • Vous assurer que tous les attributs d’un événement de log sont correctement extraits (gravité, nom du logger, nom du thread, etc.)

Vous trouverez ci-dessous des exemples de configuration pour les bibliothèques de journalisation suivantes :

Associer votre service à l’ensemble des logs et traces

Si l’APM est activé pour cette application, associez vos logs et vos traces en ajoutant automatiquement l’ID des traces, l’ID des spans et les paramètres env, service et version à vos logs. Pour ce faire, suivez les instructions relatives à l’utilisation de Python pour l’APM (en anglais).

Remarque : si le traceur de l’APM injecte service dans vos logs, cela remplace la valeur définie dans la configuration de l’Agent.

Une fois cette opération terminée, le log doit avoir le format suivant :

2019-01-07 15:20:15,972 DEBUG [flask.app] [app.py:100] [dd.trace_id=5688176451479556031 dd.span_id=4663104081780224235] – Il s'agit d'un exemple

Configurez ensuite l’Agent Datadog de façon à collecter les logs Python à partir du fichier.

Écrire les logs dans un fichier

Exemple d’utilisation avec JSON-log-formatter :

import logging

import json_log_formatter

formatter = json_log_formatter.JSONFormatter()

json_handler = logging.FileHandler(filename='/var/log/mon-log.json')
json_handler.setFormatter(formatter)

logger = logging.getLogger('my_json')
logger.addHandler(json_handler)
logger.setLevel(logging.INFO)

logger.info('Sign up', extra={'referral_code': '52d6ce'})

Le fichier de log comprend l’entrée de log suivante (sur une ligne) :

{
  "message": "Sign up",
  "time": "2015-09-01T06:06:26.524448",
  "referral_code": "52d6ce"
}

Exemple d’utilisation avec Python-json-logger :

import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()

logHandler = logging.FileHandler(filename='/var/log/my-log.json')
formatter = jsonlogger.JsonFormatter()
logHandler.setFormatter(formatter)
logger.addHandler(logHandler)
logger.setLevel(logging.INFO)

logger.info('Sign up', extra={'referral_code': '52d6ce'})

Le fichier de log comprend l’entrée de log suivante (sur une ligne) :

{
  "message": "Sign up",
  "referral_code": "52d6ce"
}

Pour en savoir plus sur la configuration du handler, consultez la documentation Python-json-logger.

Configurer l’Agent Datadog

Créez un fichier conf.yaml dans le répertoire conf.d/python.d/ de l’Agent avec le contenu suivant :

init_config:

instances:

##Section des logs
logs:

  - type: file
    path: "<CHEMIN_VERS_LOG_PYTHON>.log"
    service: "<VOTRE_APPLICATION>"
    source: python
    sourcecategory: sourcecode
    # Si des logs multiligne commencent par la date au format aaaa-mm-jj, supprimer la mise en commentaire de la règle de traitement suivante
    #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 pour prendre en compte les changements de configuration.

Pour aller plus loin