Dodock offre plusieurs mécanismes pour suivre l'activité du système, diagnostiquer les problèmes et faciliter le débogage des applications. Cette page décrit les outils disponibles pour les administrateurs et développeurs.
Dodock génère plusieurs fichiers de log dans le répertoire logs/ de votre installation. Ces fichiers enregistrent les événements système, les erreurs et les opérations critiques.
| Fichier | Description |
|---|---|
frappe.log | Log principal de l'application, incluant les erreurs générales et les événements système |
web.log | Log des requêtes HTTP et des erreurs liées au serveur web |
worker.log | Log des tâches en arrière-plan (background jobs) et des workers |
schedule.log | Log des tâches planifiées et de leur exécution |
La journalisation dans Dodock est configurée via le fichier sites/common_site_config.json. Vous pouvez ajuster le niveau de log (DEBUG, INFO, WARNING, ERROR, CRITICAL) pour différents composants.
Exemple de configuration :
{
"logging": [
{
"loggers": {
"frappe": {
"level": "INFO",
"handlers": ["file", "console"]
},
"werkzeug": {
"level": "DEBUG"
}
}
}
]
}
Depuis la version incluant la MR #9736, Dodock journalise automatiquement les échecs d'import de données dans les fichiers de log système. Cette fonctionnalité complète les logs existants dans la base de données (Data Import Log et Error Log) en envoyant les mêmes informations vers frappe.logger().
| Type d'événement | Niveau de log | Description |
|---|---|---|
| Échec de ligne | ERROR | Chaque ligne en échec dans un import de données est journalisée avec son numéro de ligne et le message d'erreur |
| Échec global | ERROR | Si l'import entier échoue (par exemple, une exception non gérée), l'erreur est journalisée avec une trace complète |
| Import partiel | WARNING | Si un import se termine avec des erreurs mais crée/modifie certains enregistrements, un résumé est journalisé |
ERROR:frappe.data_import:Row #12 failed in Client import: Value missing for required field: "Nom"
Traceback (most recent call last):
File "apps/frappe/frappe/core/doctype/data_import/importer.py", line 312, in import_data
doc = self.process_row(row)
File "apps/frappe/frappe/core/doctype/data_import/importer.py", line 345, in process_row
doc.insert()
File "apps/frappe/frappe/model/document.py", line 285, in insert
self._validate()
File "apps/frappe/frappe/model/document.py", line 561, in _validate
raise frappe.MandatoryError(f"Value missing for required field: {fieldname}")
frappe.exceptions.MandatoryError: Value missing for required field: "Nom"
logs/frappe.log ou logs/worker.log selon le contexte d'exécutiongrep pour filtrer les logs d'import :
grep "data_import" logs/frappe.log
bench --site [nom_du_site] show-log --module data_import --level ERROR
logs/worker.log pour suivre leur progressionActivez le mode débogage pour obtenir plus d'informations dans les logs :
bench --site [nom_du_site] set-config developer_mode 1
bench --site [nom_du_site] set-config debug 1
Les développeurs peuvent ajouter des logs personnalisés dans leur code :
import frappe
# Journalisation basique
frappe.logger().info("Message d'information")
# Journalisation avec contexte
frappe.logger("data_import").error(
f"Échec de l'import de la ligne {row.row_number}: {str(e)}",
exc_info=True
)
Pour surveiller les logs en temps réel :
# Sur le serveur
tail -f logs/frappe.log | grep -E "data_import|ERROR"
frappe.log et worker.log pour les traces d'erreurbench worker --status
Dodock peut être configuré pour envoyer ses logs vers des outils externes comme :
Exemple de configuration pour Logstash :
{
"logging": [
{
"loggers": {
"frappe": {
"handlers": ["file", "logstash"]
}
},
"handlers": {
"logstash": {
"class": "logstash_async.handler.AsynchronousLogstashHandler",
"host": "logstash.example.com",
"port": 5044,
"database_path": null
}
}
}
]
}
Configurez des alertes pour être notifié des erreurs critiques dans les logs :
# Exemple avec fail2ban pour surveiller les erreurs d'import
[Definition]
failregex = ^.*ERROR.*data_import.*Row #.* failed.*$
ignoreregex =
# Bon
frappe.logger("data_import").error(f"Échec ligne {row.row_number}: champ 'Nom' manquant")
# À éviter
frappe.logger().error("Erreur d'import")
exc_info=True pour les exceptionstry:
# Traitement de la ligne
doc.insert()
except frappe.MandatoryError as e:
frappe.logger("data_import").error(
f"Ligne {row.row_number}: {str(e)}",
exc_info=True
)
raise
except Exception as e:
frappe.logger("data_import").error(
f"Échec inattendu ligne {row.row_number}: {str(e)}",
exc_info=True
)
raise
Cette documentation couvre les fonctionnalités introduites par la MR #9736 concernant la journalisation des échecs d'import de données.