Emails / logs : trace de remise + logging racine fiable
- deliver_many : log INFO « Emails remis : N/M — sujet=… » sur chaque lot (sans destinataire ni corps). Avant, un envoi réussi ne journalisait rien. - configure_logging : basicConfig(force=True) pour que les logs app.* sortent dans la sortie du conteneur même quand uvicorn configure le logging avant l'import de app.main. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
b84f62dfab
commit
9521034207
@@ -73,10 +73,12 @@ def deliver_many(messages: list[EmailMessage]) -> None:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
sent = 0
|
||||||
with smtp:
|
with smtp:
|
||||||
for message in messages:
|
for message in messages:
|
||||||
try:
|
try:
|
||||||
smtp.send_message(message)
|
smtp.send_message(message)
|
||||||
|
sent += 1
|
||||||
except smtplib.SMTPException as exc:
|
except smtplib.SMTPException as exc:
|
||||||
# Ex. « 550 sender not authorized », « 535 auth failed ».
|
# Ex. « 550 sender not authorized », « 535 auth failed ».
|
||||||
logger.error(
|
logger.error(
|
||||||
@@ -84,6 +86,13 @@ def deliver_many(messages: list[EmailMessage]) -> None:
|
|||||||
message["From"],
|
message["From"],
|
||||||
exc,
|
exc,
|
||||||
)
|
)
|
||||||
|
# RGPD : ni destinataire ni corps, seulement le compte et le sujet.
|
||||||
|
logger.info(
|
||||||
|
"Emails remis : %d/%d — sujet=%r",
|
||||||
|
sent,
|
||||||
|
len(messages),
|
||||||
|
messages[0]["Subject"],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def send(to: str, subject: str, body: str) -> None:
|
def send(to: str, subject: str, body: str) -> None:
|
||||||
|
|||||||
@@ -9,7 +9,11 @@ from app.config import get_settings
|
|||||||
|
|
||||||
|
|
||||||
def configure_logging() -> None:
|
def configure_logging() -> None:
|
||||||
|
# `force=True` : on réinstalle le handler racine même si l'import de
|
||||||
|
# `app.main` se fait après la configuration de logging d'uvicorn/gunicorn,
|
||||||
|
# sinon les logs `app.*` n'apparaissent pas dans la sortie du conteneur.
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=get_settings().log_level,
|
level=get_settings().log_level,
|
||||||
format="%(asctime)s %(levelname)s %(name)s %(message)s",
|
format="%(asctime)s %(levelname)s %(name)s %(message)s",
|
||||||
|
force=True,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user