diff --git a/app/log.py b/app/log.py index eee1dd9b..1c1e6d7d 100644 --- a/app/log.py +++ b/app/log.py @@ -9,9 +9,30 @@ from app.config import ( ) # this format allows clickable link to code source in PyCharm -_log_format = '%(asctime)s - %(name)s - %(levelname)s - "%(pathname)s:%(lineno)d" - %(funcName)s() - %(message)s' +_log_format = '%(asctime)s - %(name)s - %(levelname)s - "%(pathname)s:%(lineno)d" - %(funcName)s() - %(message_id)s - %(message)s' _log_formatter = logging.Formatter(_log_format) +# used to keep track of an email lifecycle +_MESSAGE_ID = None + + +def set_message_id(message_id): + global _MESSAGE_ID + print("set message_id", message_id) + _MESSAGE_ID = message_id + + +class EmailHandlerFilter(logging.Filter): + """automatically add message-id to keep track of an email processing""" + + def filter(self, record): + message_id = self.get_message_id() + record.message_id = message_id if message_id else "" + return True + + def get_message_id(self): + return _MESSAGE_ID + def _get_console_handler(): console_handler = logging.StreamHandler(sys.stdout) @@ -29,6 +50,8 @@ def _get_logger(name): # leave the handlers level at NOTSET so the level checking is only handled by the logger logger.addHandler(_get_console_handler()) + logger.addFilter(EmailHandlerFilter()) + # no propagation to avoid propagating to root logger logger.propagate = False diff --git a/email_handler.py b/email_handler.py index 5838cad9..82a2573f 100644 --- a/email_handler.py +++ b/email_handler.py @@ -114,7 +114,7 @@ from app.email_utils import ( ) from app.extensions import db from app.greylisting import greylisting_needed -from app.log import LOG +from app.log import LOG, set_message_id from app.models import ( Alias, Contact, @@ -1779,6 +1779,9 @@ class MailHandler: envelope.rcpt_tos, ) + # generate a different message_id to keep track of an email lifecycle + set_message_id(str(uuid.uuid4())) + app = new_app() with app.app_context(): ret = handle(envelope)