Version de développement
Cette documentation décrit la version « next » (develop), non encore publiée. Pour la version stable, basculez sur « v5 » dans l'en-tête.
Développeurs

Journalisation et débogage

Écrire dans les fichiers de log de Dodock avec frappe.logger() et retrouver les échecs d'import de données.

Journalisation et débogage

Dodock écrit ses messages de log avec le module logging de Python. La fonction frappe.logger() renvoie un logger qui écrit dans un fichier par module. Cette page décrit cette fonction et les messages que Dodock écrit lors d'un import de données.

Fichiers de log

frappe.logger("mon_module") écrit dans deux fichiers :

FichierContenu
logs/mon_module.log (dossier du bench)Les messages de tous les sites
sites/<site>/logs/mon_module.logLes messages du site courant

Sans nom de module, le logger s'appelle frappe et écrit dans frappe.log. Il ajoute alors à chaque message le site et le contenu de la requête (form_dict). Les valeurs des clés qui contiennent password, secret, token, key ou pwd sont masquées.

Chaque fichier tourne à 100 000 octets, avec 20 fichiers conservés. Les paramètres max_size et file_count changent ces valeurs.

Les fichiers web.log, worker.log et schedule.log du dossier logs/ viennent des processus du bench (serveur web, workers, planificateur). Ils contiennent la sortie de ces processus, pas les messages de frappe.logger().

Niveau de log

Par défaut, le logger garde les messages de niveau ERROR et plus. Avec le serveur de développement (bench start, variable DEV_SERVER), il garde les messages de niveau WARNING et plus.

Pour changer le niveau dans un script ou une console, appelez frappe.utils.logger.set_log_level() avant de créer le logger :

from frappe.utils.logger import set_log_level

set_log_level("DEBUG")
frappe.logger("mon_module").debug("Message visible")

Pour écrire sur la sortie d'erreur au lieu des fichiers, définissez la variable d'environnement FRAPPE_STREAM_LOGGING (utile dans un conteneur).

Écrire un message

import frappe

logger = frappe.logger("mon_module")
logger.info("Synchronisation démarrée")

try:
    synchroniser()
except Exception:
    logger.error("Synchronisation en échec", exc_info=True)
    raise

exc_info=True ajoute la trace de l'exception au message.

frappe.logger() écrit seulement dans les fichiers. Pour une erreur que l'administrateur doit voir dans l'interface, utilisez aussi frappe.log_error(), qui crée un Journal des Erreurs.

Échecs d'import de données

Lors d'un import de données, Dodock écrit dans data_import.log :

ÉvénementNiveauMessage
Une ou plusieurs lignes en échecERRORData Import <nom>: row(s) [<lignes>] failed to import, avec la trace
L'import entier en échecERRORData import <nom> failed, avec la trace
Import partiel (au moins un succès et un échec)WARNINGData Import <nom>: <n> of <total> rows failed
Création impossible d'une valeur liée (mise en correspondance des valeurs)ERRORData Import <nom>: could not create <DocType> <valeur>

Avec le niveau par défaut (ERROR), le message d'import partiel n'est pas écrit.

Ces messages complètent les enregistrements en base : le Journal d'imports de données pour chaque ligne et le Journal des Erreurs pour un échec global.

Pour suivre les imports d'un site :

tail -f sites/<site>/logs/data_import.log