|
| 1 | +import logging |
| 2 | +import coloredlogs |
| 3 | +from logging.handlers import QueueHandler, QueueListener, SMTPHandler |
| 4 | +from TelegramHTTPHandler import TelegramHTTPHandler |
| 5 | +import os |
| 6 | +import sys |
| 7 | +import queue |
| 8 | +from dotenv import load_dotenv |
| 9 | + |
| 10 | +load_dotenv(verbose=True) |
| 11 | + |
| 12 | +LOGGING_SMTP_MAILHOST_PORT = int(os.getenv("LOGGING_SMTP_MAILHOST_PORT")) |
| 13 | +LOGGING_SMTP_MAILHOST_HOST = os.getenv("LOGGING_SMTP_MAILHOST_HOST") |
| 14 | +LOGGING_SMTP_MAILHOST = (LOGGING_SMTP_MAILHOST_HOST, LOGGING_SMTP_MAILHOST_PORT) |
| 15 | +LOGGING_SMTP_FROMADDR = os.getenv("LOGGING_SMTP_FROMADDR") |
| 16 | +LOGGING_SMTP_TOADDRS = os.getenv("LOGGING_SMTP_TOADDRS") |
| 17 | +LOGGING_SMTP_SUBJECT = os.getenv("LOGGING_SMTP_SUBJECT") |
| 18 | +LOGGING_SMTP_CREDENTIALS_EMAIL = os.getenv("LOGGING_SMTP_CREDENTIALS_EMAIL") |
| 19 | +LOGGING_SMTP_CREDENTIALS_PASSWORD = os.getenv("LOGGING_SMTP_CREDENTIALS_PASSWORD") |
| 20 | +LOGGING_SMTP_CREDENTIALS = ( |
| 21 | + LOGGING_SMTP_CREDENTIALS_EMAIL, |
| 22 | + LOGGING_SMTP_CREDENTIALS_PASSWORD, |
| 23 | +) |
| 24 | +LOGGING_SMTP_SECURE = os.getenv("LOGGING_SMTP_SECURE") |
| 25 | +if LOGGING_SMTP_SECURE == "()": |
| 26 | + LOGGING_SMTP_SECURE = () |
| 27 | +else: |
| 28 | + LOGGING_SMTP_SECURE = None |
| 29 | + |
| 30 | +LOGGING_SMTP_TIMEOUT = int(os.getenv("LOGGING_SMTP_TIMEOUT")) |
| 31 | + |
| 32 | + |
| 33 | +PYTHON_LOG_LEVEL = os.getenv("PYTHON_LOG_LEVEL", "DEBUG") |
| 34 | +TELEGRAM_PYTHON_LOG_LEVEL = os.getenv("TELEGRAM_PYTHON_LOG_LEVEL", "ERROR") |
| 35 | +EMAIL_LOG_LEVEL = os.getenv("EMAIL_LOG_LEVEL", "ERROR") |
| 36 | + |
| 37 | +logger = logging.getLogger() |
| 38 | +handler = logging.StreamHandler() # sys.stderr will be used by default |
| 39 | + |
| 40 | + |
| 41 | +class RequestFormatter(coloredlogs.ColoredFormatter): |
| 42 | + def format(self, record): |
| 43 | + record.url = None |
| 44 | + record.remote_addr = None |
| 45 | + |
| 46 | + return super().format(record) |
| 47 | + |
| 48 | + |
| 49 | +formatter = RequestFormatter( |
| 50 | + "[%(asctime)s] %(remote_addr)s requested %(url)s %(name)-12s %(levelname)-8s %(message)s %(funcName)s %(pathname)s:%(lineno)d" # noqa |
| 51 | +) |
| 52 | + |
| 53 | +handler.setFormatter(formatter) |
| 54 | +handler.setLevel( |
| 55 | + PYTHON_LOG_LEVEL |
| 56 | +) # Both loggers and handlers have a setLevel method noqa: E501 |
| 57 | +logger.addHandler(handler) |
| 58 | +logger.setLevel(PYTHON_LOG_LEVEL) |
| 59 | + |
| 60 | + |
| 61 | +# Log all uncuaght exceptions |
| 62 | +def handle_exception(exc_type, exc_value, exc_traceback): |
| 63 | + if issubclass(exc_type, KeyboardInterrupt): |
| 64 | + sys.__excepthook__(exc_type, exc_value, exc_traceback) |
| 65 | + return |
| 66 | + |
| 67 | + logger.critical( |
| 68 | + "Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback) |
| 69 | + ) # noqa: E501 |
| 70 | + |
| 71 | + |
| 72 | +sys.excepthook = handle_exception |
| 73 | + |
| 74 | + |
| 75 | +# Telegram logging |
| 76 | +if os.getenv("APP_ENV", None) != "development": |
| 77 | + # See https://docs.python.org/3/howto/logging-cookbook.html#dealing-with-handlers-that-block # noqa |
| 78 | + que = queue.Queue(-1) # no limit on size |
| 79 | + queue_handler = QueueHandler(que) |
| 80 | + |
| 81 | + telegram_token = os.getenv("TELEGRAM_TOKEN", None) |
| 82 | + telegram_chat_id = os.getenv("TELEGRAM_CHAT_ID", None) |
| 83 | + telegramHandlerHost = "api.telegram.org" |
| 84 | + |
| 85 | + telegramHandlerUrl = ( |
| 86 | + f"bot{telegram_token}/sendMessage?chat_id={telegram_chat_id}&text=" |
| 87 | + ) |
| 88 | + |
| 89 | + telegramHandler = TelegramHTTPHandler( |
| 90 | + telegramHandlerHost, url=telegramHandlerUrl, secure=True |
| 91 | + ) |
| 92 | + logger.info( |
| 93 | + f"Setting TELEGRAM_PYTHON_LOG_LEVEL to {TELEGRAM_PYTHON_LOG_LEVEL}" |
| 94 | + ) # noqa: E501 |
| 95 | + telegramHandler.setLevel(TELEGRAM_PYTHON_LOG_LEVEL) |
| 96 | + listener = QueueListener(que, telegramHandler, respect_handler_level=True) |
| 97 | + logger.addHandler(queue_handler) |
| 98 | + listener.start() |
| 99 | + |
| 100 | + SMTP_log_que = queue.Queue(-1) # no limit on size |
| 101 | + SMTP_queue_handler = QueueHandler(SMTP_log_que) |
| 102 | + |
| 103 | + smtpHandler = SMTPHandler( |
| 104 | + LOGGING_SMTP_MAILHOST, |
| 105 | + LOGGING_SMTP_FROMADDR, |
| 106 | + LOGGING_SMTP_TOADDRS, |
| 107 | + LOGGING_SMTP_SUBJECT, |
| 108 | + LOGGING_SMTP_CREDENTIALS, |
| 109 | + LOGGING_SMTP_SECURE, |
| 110 | + LOGGING_SMTP_TIMEOUT, |
| 111 | + ) |
| 112 | + smtpHandler.setFormatter(formatter) |
| 113 | + smtpHandler.setLevel(EMAIL_LOG_LEVEL) |
| 114 | + SMTP_listener = QueueListener(SMTP_log_que, smtpHandler, respect_handler_level=True) |
| 115 | + |
| 116 | + logger.addHandler(SMTP_queue_handler) |
| 117 | + SMTP_listener.start() |
0 commit comments