logging remplit deux fonctions distinctes :
logging.dictConfig pour tout Mayan (console, fichier rotatif, couleurs dans le terminal)LoggingAppConfigMixin est un mixin injecté dans les AppConfig de Mayan. Lors du ready(), si MAYAN_LOGGING_ENABLE=true, il appelle logging.config.dictConfig() pour configurer tous les loggers de toutes les apps installées en une seule passe.
| Handler | Description | Activé par défaut |
|---|---|---|
console |
StreamHandler vers stdout |
Oui |
logfile |
RotatingFileHandler (64 Ko, 5 backups) |
Non |
Configuré via MAYAN_LOGGING_HANDLERS (ex. console,logfile).
MAYAN_LOGGING_LEVEL — défaut : ERROR. En production seules les erreurs apparaissent ; passer à DEBUG pour le diagnostic.
%(name)s <%(process)d> [%(levelname)s] "%(funcName)s() line %(lineno)d %(message)s"
Exemple :
mayan.apps.ocr.tasks <1234> [ERROR] "task_ocr_document_file_page() line 42 OCR failed"
ColorFormatter)Quand MAYAN_LOGGING_DISABLE_COLOR_FORMATTER=false (défaut), les messages sont colorés selon le niveau :
| Niveau | Couleur |
|---|---|
| DEBUG | Cyan |
| INFO | Blanc |
| WARNING | Jaune gras souligné |
| ERROR | Rouge gras |
| CRITICAL | Rouge gras clignotant inversé |
| Variable | Défaut | Description |
|---|---|---|
MAYAN_LOGGING_ENABLE |
true |
Active la configuration des logs |
MAYAN_LOGGING_LEVEL |
ERROR |
Niveau minimum (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
MAYAN_LOGGING_HANDLERS |
console |
Handlers actifs (console, logfile) |
MAYAN_LOGGING_LOG_FILE_PATH |
MEDIA_ROOT/error.log |
Chemin du fichier de log |
MAYAN_LOGGING_DISABLE_COLOR_FORMATTER |
false |
Désactive les couleurs dans le terminal |
En plus des logs Python classiques (fichier/console), Mayan peut stocker les erreurs directement en base, attachées à un objet métier. Depuis l'interface, on peut consulter les erreurs d'un document précis, d'un index, etc. — sans avoir à fouiller les logs serveur.
StoredErrorLog (une entrée par app enregistrée)
└── ErrorLogPartition (une partition par instance d'objet)
content_type + object_id → GenericForeignKey vers l'objet
└── ErrorLogPartitionEntry (une entrée par erreur)
datetime
domain_name
text
Exemple concret :
StoredErrorLog : name="mayan.apps.ocr"
└── ErrorLogPartition : name="documents.Document.42" (le document id=42)
└── ErrorLogPartitionEntry : datetime=2026-04-16 10:00, text="Tesseract failed..."
└── ErrorLogPartitionEntry : datetime=2026-04-16 10:05, text="Timeout after 30s..."
Dans le apps.py d'une app :
from mayan.apps.logging.classes import ErrorLog
error_log = ErrorLog(app_config=self)
error_log.register_model(model=Document)
Cet appel fait automatiquement :
document.error_log qui retourne les entrées d'erreur de cet objetpost_save)pre_delete)error_log_entry_view et error_log_entry_delete sur le modèle# Dans une tâche Celery ou un service
try:
do_something(document)
except Exception as exception:
document.error_log.create(
domain_name='ocr',
text=str(exception)
)
Par défaut, seules les 15 dernières entrées sont conservées par objet (DEFAULT_ERROR_LOG_PARTITION_ENTRY_LIMIT=15). Les plus anciennes sont supprimées automatiquement à chaque écriture. Configurable au moment de l'enregistrement :
error_log = ErrorLog(app_config=self, limit=50)
ErrorLogDomainUn domaine est un label optionnel pour catégoriser les erreurs d'une même partition. Exemple : un document peut avoir des erreurs du domaine ocr, du domaine converter, etc.
from mayan.apps.logging.classes import ErrorLogDomain
error_log_domain_ocr = ErrorLogDomain(name='ocr', label=_('OCR'))
| Fichier | Rôle |
|---|---|
mixins.py |
LoggingAppConfigMixin — configuration de logging.dictConfig au démarrage |
formatters.py |
ColorFormatter — coloration des messages selon le niveau |
classes.py |
ErrorLog, ErrorLogDomain — registre et enregistrement des modèles |
models.py |
StoredErrorLog, ErrorLogPartition, ErrorLogPartitionEntry |
model_mixins.py |
get_domain_label(), get_object() |
literals.py |
Constantes : niveau par défaut (ERROR), limite de 15 entrées, palette de couleurs |