[{"data":1,"prerenderedAt":463},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fjournalisation-et-debogage":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fjournalisation-et-debogage":462},{"id":4,"title":5,"body":6,"description":448,"extension":449,"meta":450,"navigation":194,"path":458,"seo":459,"stem":460,"__hash__":461},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002Fjournalisation-et-debogage.md","Journalisation et débogage",{"type":7,"value":8,"toc":442},"minimark",[9,13,26,31,37,78,111,122,142,146,165,172,208,215,219,278,284,297,301,308,382,388,398,401,438],[10,11,5],"h1",{"id":12},"journalisation-et-débogage",[14,15,16,17,21,22,25],"p",{},"Dodock écrit ses messages de log avec le module ",[18,19,20],"code",{},"logging"," de Python. La fonction ",[18,23,24],{},"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.",[27,28,30],"h2",{"id":29},"fichiers-de-log","Fichiers de log",[14,32,33,36],{},[18,34,35],{},"frappe.logger(\"mon_module\")"," écrit dans deux fichiers :",[38,39,40,53],"table",{},[41,42,43],"thead",{},[44,45,46,50],"tr",{},[47,48,49],"th",{},"Fichier",[47,51,52],{},"Contenu",[54,55,56,68],"tbody",{},[44,57,58,65],{},[59,60,61,64],"td",{},[18,62,63],{},"logs\u002Fmon_module.log"," (dossier du bench)",[59,66,67],{},"Les messages de tous les sites",[44,69,70,75],{},[59,71,72],{},[18,73,74],{},"sites\u002F\u003Csite>\u002Flogs\u002Fmon_module.log",[59,76,77],{},"Les messages du site courant",[14,79,80,81,84,85,88,89,92,93,96,97,96,100,96,103,106,107,110],{},"Sans nom de module, le logger s'appelle ",[18,82,83],{},"frappe"," et écrit dans ",[18,86,87],{},"frappe.log",". Il ajoute alors à chaque message le site et le contenu de la requête (",[18,90,91],{},"form_dict","). Les valeurs des clés qui contiennent ",[18,94,95],{},"password",", ",[18,98,99],{},"secret",[18,101,102],{},"token",[18,104,105],{},"key"," ou ",[18,108,109],{},"pwd"," sont masquées.",[14,112,113,114,117,118,121],{},"Chaque fichier tourne à 100 000 octets, avec 20 fichiers conservés. Les paramètres ",[18,115,116],{},"max_size"," et ",[18,119,120],{},"file_count"," changent ces valeurs.",[14,123,124,125,96,128,117,131,134,135,138,139,141],{},"Les fichiers ",[18,126,127],{},"web.log",[18,129,130],{},"worker.log",[18,132,133],{},"schedule.log"," du dossier ",[18,136,137],{},"logs\u002F"," viennent des processus du bench (serveur web, workers, planificateur). Ils contiennent la sortie de ces processus, pas les messages de ",[18,140,24],{},".",[27,143,145],{"id":144},"niveau-de-log","Niveau de log",[14,147,148,149,152,153,156,157,160,161,164],{},"Par défaut, le logger garde les messages de niveau ",[18,150,151],{},"ERROR"," et plus. Avec le serveur de développement (",[18,154,155],{},"bench start",", variable ",[18,158,159],{},"DEV_SERVER","), il garde les messages de niveau ",[18,162,163],{},"WARNING"," et plus.",[14,166,167,168,171],{},"Pour changer le niveau dans un script ou une console, appelez ",[18,169,170],{},"frappe.utils.logger.set_log_level()"," avant de créer le logger :",[173,174,179],"pre",{"className":175,"code":176,"language":177,"meta":178,"style":178},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from frappe.utils.logger import set_log_level\n\nset_log_level(\"DEBUG\")\nfrappe.logger(\"mon_module\").debug(\"Message visible\")\n","python","",[18,180,181,189,196,202],{"__ignoreMap":178},[182,183,186],"span",{"class":184,"line":185},"line",1,[182,187,188],{},"from frappe.utils.logger import set_log_level\n",[182,190,192],{"class":184,"line":191},2,[182,193,195],{"emptyLinePlaceholder":194},true,"\n",[182,197,199],{"class":184,"line":198},3,[182,200,201],{},"set_log_level(\"DEBUG\")\n",[182,203,205],{"class":184,"line":204},4,[182,206,207],{},"frappe.logger(\"mon_module\").debug(\"Message visible\")\n",[14,209,210,211,214],{},"Pour écrire sur la sortie d'erreur au lieu des fichiers, définissez la variable d'environnement ",[18,212,213],{},"FRAPPE_STREAM_LOGGING"," (utile dans un conteneur).",[27,216,218],{"id":217},"écrire-un-message","Écrire un message",[173,220,222],{"className":175,"code":221,"language":177,"meta":178,"style":178},"import frappe\n\nlogger = frappe.logger(\"mon_module\")\nlogger.info(\"Synchronisation démarrée\")\n\ntry:\n    synchroniser()\nexcept Exception:\n    logger.error(\"Synchronisation en échec\", exc_info=True)\n    raise\n",[18,223,224,229,233,238,243,248,254,260,266,272],{"__ignoreMap":178},[182,225,226],{"class":184,"line":185},[182,227,228],{},"import frappe\n",[182,230,231],{"class":184,"line":191},[182,232,195],{"emptyLinePlaceholder":194},[182,234,235],{"class":184,"line":198},[182,236,237],{},"logger = frappe.logger(\"mon_module\")\n",[182,239,240],{"class":184,"line":204},[182,241,242],{},"logger.info(\"Synchronisation démarrée\")\n",[182,244,246],{"class":184,"line":245},5,[182,247,195],{"emptyLinePlaceholder":194},[182,249,251],{"class":184,"line":250},6,[182,252,253],{},"try:\n",[182,255,257],{"class":184,"line":256},7,[182,258,259],{},"    synchroniser()\n",[182,261,263],{"class":184,"line":262},8,[182,264,265],{},"except Exception:\n",[182,267,269],{"class":184,"line":268},9,[182,270,271],{},"    logger.error(\"Synchronisation en échec\", exc_info=True)\n",[182,273,275],{"class":184,"line":274},10,[182,276,277],{},"    raise\n",[14,279,280,283],{},[18,281,282],{},"exc_info=True"," ajoute la trace de l'exception au message.",[14,285,286,288,289,292,293,141],{},[18,287,24],{}," écrit seulement dans les fichiers. Pour une erreur que l'administrateur doit voir dans l'interface, utilisez aussi ",[18,290,291],{},"frappe.log_error()",", qui crée un ",[294,295,296],"strong",{},"Journal des Erreurs",[27,298,300],{"id":299},"échecs-dimport-de-données","Échecs d'import de données",[14,302,303,304,307],{},"Lors d'un import de données, Dodock écrit dans ",[18,305,306],{},"data_import.log"," :",[38,309,310,323],{},[41,311,312],{},[44,313,314,317,320],{},[47,315,316],{},"Événement",[47,318,319],{},"Niveau",[47,321,322],{},"Message",[54,324,325,340,354,368],{},[44,326,327,330,334],{},[59,328,329],{},"Une ou plusieurs lignes en échec",[59,331,332],{},[18,333,151],{},[59,335,336,339],{},[18,337,338],{},"Data Import \u003Cnom>: row(s) [\u003Clignes>] failed to import",", avec la trace",[44,341,342,345,349],{},[59,343,344],{},"L'import entier en échec",[59,346,347],{},[18,348,151],{},[59,350,351,339],{},[18,352,353],{},"Data import \u003Cnom> failed",[44,355,356,359,363],{},[59,357,358],{},"Import partiel (au moins un succès et un échec)",[59,360,361],{},[18,362,163],{},[59,364,365],{},[18,366,367],{},"Data Import \u003Cnom>: \u003Cn> of \u003Ctotal> rows failed",[44,369,370,373,377],{},[59,371,372],{},"Création impossible d'une valeur liée (mise en correspondance des valeurs)",[59,374,375],{},[18,376,151],{},[59,378,379],{},[18,380,381],{},"Data Import \u003Cnom>: could not create \u003CDocType> \u003Cvaleur>",[14,383,384,385,387],{},"Avec le niveau par défaut (",[18,386,151],{},"), le message d'import partiel n'est pas écrit.",[14,389,390,391,394,395,397],{},"Ces messages complètent les enregistrements en base : le ",[294,392,393],{},"Journal d'imports de données"," pour chaque ligne et le ",[294,396,296],{}," pour un échec global.",[14,399,400],{},"Pour suivre les imports d'un site :",[173,402,406],{"className":403,"code":404,"language":405,"meta":178,"style":178},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tail -f sites\u002F\u003Csite>\u002Flogs\u002Fdata_import.log\n","bash",[18,407,408],{"__ignoreMap":178},[182,409,410,414,418,421,425,428,432,435],{"class":184,"line":185},[182,411,413],{"class":412},"sBMFI","tail",[182,415,417],{"class":416},"sfazB"," -f",[182,419,420],{"class":416}," sites\u002F",[182,422,424],{"class":423},"sMK4o","\u003C",[182,426,427],{"class":416},"sit",[182,429,431],{"class":430},"sTEyZ","e",[182,433,434],{"class":423},">",[182,436,437],{"class":416},"\u002Flogs\u002Fdata_import.log\n",[439,440,441],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":178,"searchDepth":185,"depth":191,"links":443},[444,445,446,447],{"id":29,"depth":191,"text":30},{"id":144,"depth":191,"text":145},{"id":217,"depth":191,"text":218},{"id":299,"depth":191,"text":300},"Écrire dans les fichiers de log de Dodock avec frappe.logger() et retrouver les échecs d'import de données.","md",{"reviewed":194,"last_verified":451,"sources":452},"2026-11-03",[453,454,455,456,457],"dodock@develop:frappe\u002Futils\u002Flogger.py","dodock@develop:frappe\u002F__init__.py","dodock@develop:frappe\u002Fcore\u002Fdoctype\u002Fdata_import\u002Fimporter.py","dodock@develop:frappe\u002Fcore\u002Fdoctype\u002Fdata_import\u002Fdata_import.py","dodock@develop:frappe\u002Fcore\u002Fdoctype\u002Fdata_import\u002Fvalue_mapping.py","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fjournalisation-et-debogage",{"title":5,"description":448},"2.next\u002F3.dodock\u002F10.developpeurs\u002Fjournalisation-et-debogage","PO5rC2-YcL18-HKV2oaVZxq5vF9SY21P2r5umdRPemg",{},1793871747018]