From 03d4781d49857be30b4fecf729183e668d686d6e Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sun, 31 Aug 2025 18:27:00 +0200 Subject: [PATCH] chore(settings): add logging configuration and replace print statements --- jdav_web/jdav_web/settings/__init__.py | 1 + .../jdav_web/settings/components/logging.py | 59 +++++++++++++++++++ jdav_web/mailer/mailutils.py | 6 +- jdav_web/mailer/models.py | 8 ++- jdav_web/members/models.py | 2 - jdav_web/members/pdf.py | 6 +- jdav_web/members/views.py | 1 - jdav_web/utils.py | 4 +- 8 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 jdav_web/jdav_web/settings/components/logging.py diff --git a/jdav_web/jdav_web/settings/__init__.py b/jdav_web/jdav_web/settings/__init__.py index e474d0e..060c16e 100644 --- a/jdav_web/jdav_web/settings/__init__.py +++ b/jdav_web/jdav_web/settings/__init__.py @@ -58,6 +58,7 @@ base_settings = [ 'components/emails.py', 'components/texts.py', 'components/locale.py', + 'components/logging.py', 'components/oauth.py', ] diff --git a/jdav_web/jdav_web/settings/components/logging.py b/jdav_web/jdav_web/settings/components/logging.py new file mode 100644 index 0000000..464eb47 --- /dev/null +++ b/jdav_web/jdav_web/settings/components/logging.py @@ -0,0 +1,59 @@ +import os + +DJANGO_LOG_LEVEL = get_var('logging', 'django_level', default='INFO') +ROOT_LOG_LEVEL = get_var('logging', 'level', default='INFO') +LOG_ERROR_TO_EMAIL = get_var('logging', 'email_admins', default=False) +LOG_EMAIL_BACKEND = EMAIL_BACKEND if LOG_ERROR_TO_EMAIL else "django.core.mail.backends.console.EmailBackend" +LOG_ERROR_INCLUDE_HTML = get_var('logging', 'error_report_include_html', default=False) + +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "filters": { + "require_debug_false": { + "()": "django.utils.log.RequireDebugFalse", + }, + "require_debug_true": { + "()": "django.utils.log.RequireDebugTrue", + }, + }, + "formatters": { + "simple": { + "format": "[{asctime}: {levelname}/{name}] {message}", + "style": "{", + }, + "verbose": { + "format": "[{asctime}: {levelname}/{name}] {pathname}:{lineno} {message}", + "style": "{", + }, + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "formatter": "simple", + }, + "console_verbose": { + "class": "logging.StreamHandler", + "formatter": "verbose", + "level": "ERROR", + }, + "mail_admins": { + "level": "ERROR", + "class": "django.utils.log.AdminEmailHandler", + "email_backend": LOG_EMAIL_BACKEND, + "include_html": LOG_ERROR_INCLUDE_HTML, + "filters": ["require_debug_false"], + }, + }, + "root": { + "handlers": ["console"], + "level": ROOT_LOG_LEVEL, + }, + "loggers": { + "django": { + "handlers": ["console", "mail_admins"], + "level": DJANGO_LOG_LEVEL, + "propagate": False, + }, + }, +} diff --git a/jdav_web/mailer/mailutils.py b/jdav_web/mailer/mailutils.py index b78cb1d..d3de5af 100644 --- a/jdav_web/mailer/mailutils.py +++ b/jdav_web/mailer/mailutils.py @@ -1,9 +1,13 @@ from django.core import mail from django.core.mail import EmailMessage from django.conf import settings +import logging import os +logger = logging.getLogger(__name__) + + NOT_SENT, SENT, PARTLY_SENT = 0, 1, 2 def send(subject, content, sender, recipients, message_id=None, reply_to=None, @@ -41,7 +45,7 @@ def send(subject, content, sender, recipients, message_id=None, reply_to=None, # send all mails with one connection connection.send_messages(mails) except Exception as e: - print("Error when sending mail:", e) + logger.error(f"Caught exception while sending email: {e}") failed = True else: succeeded = True diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index e9a5199..dc0ee73 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -1,3 +1,4 @@ +import logging from django.db import models from django.core.exceptions import ValidationError from django import forms @@ -17,6 +18,9 @@ from .rules import is_creator import os +logger = logging.getLogger(__name__) + + alphanumeric = RegexValidator(r'^[0-9a-zA-Z._-]*$', _('Only alphanumeric characters, ., - and _ are allowed')) @@ -145,7 +149,7 @@ class Message(CommonModel): members.update([mol.member for mol in self.to_notelist.membersonlist.all()]) filtered = [m for m in members if m.gets_newsletter] - print("sending mail to", filtered) + logger.info(f"sending mail to {filtered}") attach = [a.f.path for a in Attachment.objects.filter(msg__id=self.pk) if a.f.name] @@ -189,7 +193,7 @@ class Message(CommonModel): a.delete() success = SENT except Exception as e: - print("Exception caught", e) + logger.error(f"Caught exception while sending email: {e}") success = NOT_SENT finally: self.save() diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index 04f85c8..3daeb4c 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -590,7 +590,6 @@ class Member(Person): def send_upload_registration_form_link(self): if not self.upload_registration_form_key: return - print(self.name, self.upload_registration_form_key) link = self.get_upload_registration_form_link() self.send_mail(_('Upload registration form'), settings.UPLOAD_REGISTRATION_FORM_TEXT.format(name=self.prename, @@ -1579,7 +1578,6 @@ class Freizeit(CommonModel): 'Betreuer/in': str(numbers['staff']), 'Auswahl Veranstaltung': 'Auswahl2', 'Ort, Datum': '{p}, {d}'.format(p=settings.SEKTION, d=datetime.now().strftime('%d.%m.%Y'))} - print(members) for i, m in enumerate(members): suffix = str(' {}'.format(i + 1)) # indexing starts at zero, but the listing in the pdf starts at 1 diff --git a/jdav_web/members/pdf.py b/jdav_web/members/pdf.py index 57e414a..d55060e 100644 --- a/jdav_web/members/pdf.py +++ b/jdav_web/members/pdf.py @@ -4,6 +4,7 @@ import os import subprocess import time import glob +import logging from io import BytesIO from pypdf import PdfReader, PdfWriter, PageObject from django import template @@ -15,6 +16,8 @@ from contrib.media import media_path, media_dir, serve_media, ensure_media_dir, from utils import normalize_filename from PIL import Image +logger = logging.getLogger(__name__) + def serve_pdf(filename_pdf): return serve_media(filename_pdf, 'application/pdf') @@ -107,8 +110,7 @@ def pdf_add_attachments(pdf_writer, attachments): pdf_writer.append(img_pdf_scaled) except Exception as e: - print("Could not add image", fp) - print(e) + logger.warning(f"Could not add image under filepath {fp}: {e}.") def scale_pdf_page_to_a4(page): diff --git a/jdav_web/members/views.py b/jdav_web/members/views.py index 46d29c1..4987b17 100644 --- a/jdav_web/members/views.py +++ b/jdav_web/members/views.py @@ -291,7 +291,6 @@ def register(request): new_member.send_upload_registration_form_link() return HttpResponseRedirect(reverse('members:upload_registration_form') + "?key=" + new_member.upload_registration_form_key) except ValueError as e: - print("value error", e) # when input is invalid if pwd: return render_register(request, group, form, emergency_contacts_formset, pwd=pwd.password, diff --git a/jdav_web/utils.py b/jdav_web/utils.py index 021dd40..669df4e 100644 --- a/jdav_web/utils.py +++ b/jdav_web/utils.py @@ -5,6 +5,8 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from decimal import Decimal, ROUND_HALF_DOWN import unicodedata +import logging +logger = logging.getLogger(__name__) def file_size_validator(max_upload_size): @@ -50,7 +52,7 @@ class RestrictedFileField(models.FileField): '{}').format(self.max_upload_size, f._size)) except AttributeError as e: - print(e) + logger.warning(e) return data