diff --git a/src/backend/InvenTree/InvenTree/api.py b/src/backend/InvenTree/InvenTree/api.py index f41ff67a86..04ecbad05b 100644 --- a/src/backend/InvenTree/InvenTree/api.py +++ b/src/backend/InvenTree/InvenTree/api.py @@ -1,7 +1,6 @@ """Main JSON interface views.""" import json -import logging import sys from pathlib import Path @@ -10,6 +9,7 @@ from django.db import transaction from django.http import JsonResponse from django.utils.translation import gettext_lazy as _ +import structlog from django_q.models import OrmQ from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework import permissions, serializers @@ -31,7 +31,7 @@ from .mixins import ListAPI, RetrieveUpdateAPI from .status import check_system_health, is_worker_running from .version import inventreeApiText -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class LicenseViewSerializer(serializers.Serializer): diff --git a/src/backend/InvenTree/InvenTree/apps.py b/src/backend/InvenTree/InvenTree/apps.py index 8aed2f09b5..bb24e109e7 100644 --- a/src/backend/InvenTree/InvenTree/apps.py +++ b/src/backend/InvenTree/InvenTree/apps.py @@ -1,6 +1,5 @@ """AppConfig for InvenTree app.""" -import logging from importlib import import_module from pathlib import Path @@ -11,6 +10,7 @@ from django.core.exceptions import AppRegistryNotReady from django.db import transaction from django.db.utils import IntegrityError, OperationalError +import structlog from allauth.socialaccount.signals import social_account_updated import InvenTree.conversion @@ -19,7 +19,7 @@ import InvenTree.tasks from common.settings import get_global_setting, set_global_setting from InvenTree.config import get_setting -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class InvenTreeConfig(AppConfig): diff --git a/src/backend/InvenTree/InvenTree/auth_overrides.py b/src/backend/InvenTree/InvenTree/auth_overrides.py index 3fb92f5a74..2aa7283ae4 100644 --- a/src/backend/InvenTree/InvenTree/auth_overrides.py +++ b/src/backend/InvenTree/InvenTree/auth_overrides.py @@ -1,6 +1,5 @@ """Overrides for allauth and adjacent packages to enforce InvenTree specific auth settings and restirctions.""" -import logging from urllib.parse import urlencode from django import forms @@ -10,6 +9,7 @@ from django.http import HttpResponseRedirect from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from allauth.account.adapter import DefaultAccountAdapter from allauth.account.forms import LoginForm, SignupForm, set_form_field_order from allauth.core.exceptions import ImmediateHttpResponse @@ -27,7 +27,7 @@ import InvenTree.sso from common.settings import get_global_setting from InvenTree.exceptions import log_error -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') # override allauth diff --git a/src/backend/InvenTree/InvenTree/backends.py b/src/backend/InvenTree/InvenTree/backends.py index 82fca3fc05..6ed68c75e2 100644 --- a/src/backend/InvenTree/InvenTree/backends.py +++ b/src/backend/InvenTree/InvenTree/backends.py @@ -1,16 +1,16 @@ """Custom backend implementations.""" import datetime -import logging import time from django.db.utils import IntegrityError, OperationalError, ProgrammingError +import structlog from maintenance_mode.backends import AbstractStateBackend import common.models -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class InvenTreeMaintenanceModeBackend(AbstractStateBackend): diff --git a/src/backend/InvenTree/InvenTree/cache.py b/src/backend/InvenTree/InvenTree/cache.py index 89765f5e80..9510c29a01 100644 --- a/src/backend/InvenTree/InvenTree/cache.py +++ b/src/backend/InvenTree/InvenTree/cache.py @@ -1,12 +1,13 @@ """Configuration options for InvenTree external cache.""" -import logging import socket +import structlog + import InvenTree.config import InvenTree.ready -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def cache_setting(name, default=None, **kwargs): diff --git a/src/backend/InvenTree/InvenTree/config.py b/src/backend/InvenTree/InvenTree/config.py index 525da2da8f..90316a632e 100644 --- a/src/backend/InvenTree/InvenTree/config.py +++ b/src/backend/InvenTree/InvenTree/config.py @@ -2,7 +2,6 @@ import datetime import json -import logging import os import random import shutil @@ -13,7 +12,9 @@ from pathlib import Path from django.core.files.base import ContentFile from django.core.files.storage import Storage -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') CONFIG_DATA = None CONFIG_LOOKUPS = {} diff --git a/src/backend/InvenTree/InvenTree/conversion.py b/src/backend/InvenTree/InvenTree/conversion.py index 0701bc3eb2..669fe950ff 100644 --- a/src/backend/InvenTree/InvenTree/conversion.py +++ b/src/backend/InvenTree/InvenTree/conversion.py @@ -1,6 +1,5 @@ """Helper functions for converting between units.""" -import logging import re from typing import Optional @@ -11,7 +10,9 @@ import pint _unit_registry = None -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') def get_unit_registry(): diff --git a/src/backend/InvenTree/InvenTree/exceptions.py b/src/backend/InvenTree/InvenTree/exceptions.py index cece1162a8..b41b9d0056 100644 --- a/src/backend/InvenTree/InvenTree/exceptions.py +++ b/src/backend/InvenTree/InvenTree/exceptions.py @@ -2,7 +2,6 @@ # -*- coding: utf-8 -*- -import logging import sys import traceback @@ -11,11 +10,12 @@ from django.core.exceptions import ValidationError as DjangoValidationError from django.utils.translation import gettext_lazy as _ import rest_framework.views as drfviews +import structlog from rest_framework import serializers from rest_framework.exceptions import ValidationError as DRFValidationError from rest_framework.response import Response -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def log_error(path, error_name=None, error_info=None, error_data=None): diff --git a/src/backend/InvenTree/InvenTree/exchange.py b/src/backend/InvenTree/InvenTree/exchange.py index d53e6ad49a..6d97bfaabc 100644 --- a/src/backend/InvenTree/InvenTree/exchange.py +++ b/src/backend/InvenTree/InvenTree/exchange.py @@ -1,16 +1,15 @@ """Custom exchange backend which hooks into the InvenTree plugin system to fetch exchange rates from an external API.""" -import logging - from django.db.transaction import atomic +import structlog from djmoney.contrib.exchange.backends.base import SimpleExchangeBackend from djmoney.contrib.exchange.models import ExchangeBackend, Rate from common.currency import currency_code_default, currency_codes from common.settings import get_global_setting -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class InvenTreeExchange(SimpleExchangeBackend): diff --git a/src/backend/InvenTree/InvenTree/helpers.py b/src/backend/InvenTree/InvenTree/helpers.py index f149a5d95f..11110c30ce 100644 --- a/src/backend/InvenTree/InvenTree/helpers.py +++ b/src/backend/InvenTree/InvenTree/helpers.py @@ -4,7 +4,6 @@ import datetime import hashlib import inspect import io -import logging import os import os.path import re @@ -22,6 +21,7 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ import bleach +import structlog from bleach import clean from djmoney.money import Money from PIL import Image @@ -31,7 +31,7 @@ from common.currency import currency_code_default from .settings import MEDIA_URL, STATIC_URL -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def extract_int(reference, clip=0x7FFFFFFF, allow_negative=False): diff --git a/src/backend/InvenTree/InvenTree/helpers_email.py b/src/backend/InvenTree/InvenTree/helpers_email.py index 679a255928..6430c60741 100644 --- a/src/backend/InvenTree/InvenTree/helpers_email.py +++ b/src/backend/InvenTree/InvenTree/helpers_email.py @@ -1,14 +1,14 @@ """Code for managing email functionality in InvenTree.""" -import logging - from django.conf import settings from django.core import mail as django_mail +import structlog + import InvenTree.ready import InvenTree.tasks -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def is_email_configured(): diff --git a/src/backend/InvenTree/InvenTree/helpers_model.py b/src/backend/InvenTree/InvenTree/helpers_model.py index 7333abba83..3461b26254 100644 --- a/src/backend/InvenTree/InvenTree/helpers_model.py +++ b/src/backend/InvenTree/InvenTree/helpers_model.py @@ -1,7 +1,6 @@ """Provides helper functions used throughout the InvenTree project that access the database.""" import io -import logging from decimal import Decimal from typing import Optional from urllib.parse import urljoin @@ -12,6 +11,7 @@ from django.db.utils import OperationalError, ProgrammingError from django.utils.translation import gettext_lazy as _ import requests +import structlog from djmoney.contrib.exchange.models import convert_money from djmoney.money import Money from PIL import Image @@ -24,7 +24,7 @@ from common.notifications import ( from common.settings import get_global_setting from InvenTree.format import format_money -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def get_base_url(request=None): diff --git a/src/backend/InvenTree/InvenTree/management/commands/check_migrations.py b/src/backend/InvenTree/InvenTree/management/commands/check_migrations.py index b06971724c..f183cfe3a2 100644 --- a/src/backend/InvenTree/InvenTree/management/commands/check_migrations.py +++ b/src/backend/InvenTree/InvenTree/management/commands/check_migrations.py @@ -1,12 +1,12 @@ """Check if there are any pending database migrations, and run them.""" -import logging - from django.core.management.base import BaseCommand +import structlog + from InvenTree.tasks import check_for_migrations -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class Command(BaseCommand): diff --git a/src/backend/InvenTree/InvenTree/management/commands/clean_settings.py b/src/backend/InvenTree/InvenTree/management/commands/clean_settings.py index 45f99e98ab..a06778a866 100644 --- a/src/backend/InvenTree/InvenTree/management/commands/clean_settings.py +++ b/src/backend/InvenTree/InvenTree/management/commands/clean_settings.py @@ -1,10 +1,10 @@ """Custom management command to cleanup old settings that are not defined anymore.""" -import logging - from django.core.management.base import BaseCommand -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') class Command(BaseCommand): diff --git a/src/backend/InvenTree/InvenTree/management/commands/rebuild_models.py b/src/backend/InvenTree/InvenTree/management/commands/rebuild_models.py index f90664fb5b..c1d35f879b 100644 --- a/src/backend/InvenTree/InvenTree/management/commands/rebuild_models.py +++ b/src/backend/InvenTree/InvenTree/management/commands/rebuild_models.py @@ -3,13 +3,12 @@ - This is crucial after importing any fixtures, etc """ -import logging - from django.core.management.base import BaseCommand +import structlog from maintenance_mode.core import maintenance_mode_on, set_maintenance_mode -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class Command(BaseCommand): diff --git a/src/backend/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py b/src/backend/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py index 93f12f3436..d4b133d5ab 100644 --- a/src/backend/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py +++ b/src/backend/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py @@ -3,18 +3,18 @@ - May be required after importing a new dataset, for example """ -import logging import os from django.core.management.base import BaseCommand from django.db.utils import OperationalError, ProgrammingError +import structlog from PIL import UnidentifiedImageError from company.models import Company from part.models import Part -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class Command(BaseCommand): diff --git a/src/backend/InvenTree/InvenTree/management/commands/runmigrations.py b/src/backend/InvenTree/InvenTree/management/commands/runmigrations.py index b06971724c..f183cfe3a2 100644 --- a/src/backend/InvenTree/InvenTree/management/commands/runmigrations.py +++ b/src/backend/InvenTree/InvenTree/management/commands/runmigrations.py @@ -1,12 +1,12 @@ """Check if there are any pending database migrations, and run them.""" -import logging - from django.core.management.base import BaseCommand +import structlog + from InvenTree.tasks import check_for_migrations -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class Command(BaseCommand): diff --git a/src/backend/InvenTree/InvenTree/metadata.py b/src/backend/InvenTree/InvenTree/metadata.py index 0670c9b3ac..7fd899a7bd 100644 --- a/src/backend/InvenTree/InvenTree/metadata.py +++ b/src/backend/InvenTree/InvenTree/metadata.py @@ -1,10 +1,9 @@ """Custom metadata for DRF.""" -import logging - from django.core.exceptions import PermissionDenied from django.http import Http404 +import structlog from rest_framework import exceptions, serializers from rest_framework.fields import empty from rest_framework.metadata import SimpleMetadata @@ -17,7 +16,7 @@ import users.models from InvenTree.helpers import str2bool from InvenTree.serializers import DependentField -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class InvenTreeMetadata(SimpleMetadata): @@ -389,7 +388,9 @@ class InvenTreeMetadata(SimpleMetadata): model = field.queryset.model else: logger.debug( - 'Could not extract model for:', field_info.get('label'), '->', field + 'Could not extract model for: %s -> %s', + field_info.get('label'), + field, ) model = None diff --git a/src/backend/InvenTree/InvenTree/middleware.py b/src/backend/InvenTree/InvenTree/middleware.py index 8922e45dde..bf6cdac365 100644 --- a/src/backend/InvenTree/InvenTree/middleware.py +++ b/src/backend/InvenTree/InvenTree/middleware.py @@ -1,6 +1,5 @@ """Middleware for InvenTree.""" -import logging import sys from django.conf import settings @@ -9,6 +8,7 @@ from django.http import HttpResponse from django.shortcuts import redirect from django.urls import Resolver404, include, path, resolve, reverse_lazy +import structlog from allauth_2fa.middleware import AllauthTwoFactorMiddleware, BaseRequire2FAMiddleware from error_report.middleware import ExceptionProcessor @@ -16,7 +16,7 @@ from common.settings import get_global_setting from InvenTree.urls import frontendpatterns from users.models import ApiToken -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def get_token_from_request(request): diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index fdab2c7198..141590bb0b 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -1,6 +1,5 @@ """Generic models which provide extra functionality over base Django model types.""" -import logging from datetime import datetime from string import Formatter @@ -14,6 +13,7 @@ from django.urls import reverse from django.urls.exceptions import NoReverseMatch from django.utils.translation import gettext_lazy as _ +import structlog from django_q.models import Task from error_report.models import Error from mptt.exceptions import InvalidMove @@ -25,7 +25,7 @@ import InvenTree.format import InvenTree.helpers import InvenTree.helpers_model -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class DiffMixin: diff --git a/src/backend/InvenTree/InvenTree/sentry.py b/src/backend/InvenTree/InvenTree/sentry.py index a6e3b78d32..a2a018da5f 100644 --- a/src/backend/InvenTree/InvenTree/sentry.py +++ b/src/backend/InvenTree/InvenTree/sentry.py @@ -1,19 +1,18 @@ """Configuration for Sentry.io error reporting.""" -import logging - from django.conf import settings from django.core.exceptions import ValidationError from django.http import Http404 import rest_framework.exceptions import sentry_sdk +import structlog from djmoney.contrib.exchange.exceptions import MissingRate from sentry_sdk.integrations.django import DjangoIntegration import InvenTree.version -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def default_sentry_dsn(): diff --git a/src/backend/InvenTree/InvenTree/social_auth_urls.py b/src/backend/InvenTree/InvenTree/social_auth_urls.py index 3f1fe3a5c6..a83deaad77 100644 --- a/src/backend/InvenTree/InvenTree/social_auth_urls.py +++ b/src/backend/InvenTree/InvenTree/social_auth_urls.py @@ -1,12 +1,12 @@ """API endpoints for social authentication with allauth.""" -import logging from importlib import import_module from django.conf import settings from django.urls import NoReverseMatch, include, path, reverse import allauth.socialaccount.providers.openid_connect.views as oidc_views +import structlog from allauth.account.models import EmailAddress from allauth.socialaccount import providers from allauth.socialaccount.providers.oauth2.views import OAuth2Adapter, OAuth2LoginView @@ -22,7 +22,7 @@ from InvenTree.auth_overrides import registration_enabled from InvenTree.mixins import CreateAPI, ListAPI, ListCreateAPI from InvenTree.serializers import EmptySerializer, InvenTreeModelSerializer -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class GenericOAuth2ApiLoginView(OAuth2LoginView): diff --git a/src/backend/InvenTree/InvenTree/sso.py b/src/backend/InvenTree/InvenTree/sso.py index 31de8dd167..c1842d70de 100644 --- a/src/backend/InvenTree/InvenTree/sso.py +++ b/src/backend/InvenTree/InvenTree/sso.py @@ -1,18 +1,18 @@ """Helper functions for Single Sign On functionality.""" import json -import logging from django.contrib.auth.models import Group from django.db.models.signals import post_save from django.dispatch import receiver +import structlog from allauth.socialaccount.models import SocialAccount, SocialLogin from common.settings import get_global_setting from InvenTree.helpers import str2bool -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def get_provider_app(provider): diff --git a/src/backend/InvenTree/InvenTree/status.py b/src/backend/InvenTree/InvenTree/status.py index 500dfcd1ae..a17cc3463e 100644 --- a/src/backend/InvenTree/InvenTree/status.py +++ b/src/backend/InvenTree/InvenTree/status.py @@ -1,17 +1,17 @@ """Provides system status functionality checks.""" -import logging from datetime import timedelta from django.utils import timezone +import structlog from django_q.models import Success from django_q.status import Stat import InvenTree.helpers_email import InvenTree.ready -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def is_worker_running(**kwargs): diff --git a/src/backend/InvenTree/InvenTree/tasks.py b/src/backend/InvenTree/InvenTree/tasks.py index 20f622380d..6a91e53a3c 100644 --- a/src/backend/InvenTree/InvenTree/tasks.py +++ b/src/backend/InvenTree/InvenTree/tasks.py @@ -1,7 +1,6 @@ """Functions for tasks and a few general async tasks.""" import json -import logging import os import random import re @@ -21,6 +20,7 @@ from django.db.utils import NotSupportedError, OperationalError, ProgrammingErro from django.utils import timezone import requests +import structlog from maintenance_mode.core import ( get_maintenance_mode, maintenance_mode_on, @@ -33,7 +33,7 @@ from plugin import registry from .version import isInvenTreeUpToDate -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def schedule_task(taskname, **kwargs): diff --git a/src/backend/InvenTree/InvenTree/templatetags/inventree_extras.py b/src/backend/InvenTree/InvenTree/templatetags/inventree_extras.py index f0ab013d94..228b5aeb39 100644 --- a/src/backend/InvenTree/InvenTree/templatetags/inventree_extras.py +++ b/src/backend/InvenTree/InvenTree/templatetags/inventree_extras.py @@ -1,6 +1,5 @@ """This module provides template tags for extra functionality, over and above the built-in Django tags.""" -import logging from datetime import date, datetime from django import template @@ -22,7 +21,9 @@ from plugin.plugin import InvenTreePlugin register = template.Library() -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') @register.simple_tag() diff --git a/src/backend/InvenTree/InvenTree/tests.py b/src/backend/InvenTree/InvenTree/tests.py index 91be4f865a..355a8d8122 100644 --- a/src/backend/InvenTree/InvenTree/tests.py +++ b/src/backend/InvenTree/InvenTree/tests.py @@ -1357,14 +1357,17 @@ class TestOffloadTask(InvenTreeTestCase): # First call should run without issue result = InvenTree.tasks.check_daily_holdoff('dummy_task') self.assertTrue(result) - self.assertIn("Logging task attempt for 'dummy_task'", str(cm.output)) + self.assertIn( + 'Logging task attempt for dummy_task', str(cm.output).replace("\\'", '') + ) with self.assertLogs(logger='inventree', level='INFO') as cm: # An attempt has been logged, but it is too recent result = InvenTree.tasks.check_daily_holdoff('dummy_task') self.assertFalse(result) self.assertIn( - "Last attempt for 'dummy_task' was too recent", str(cm.output) + 'Last attempt for dummy_task was too recent', + str(cm.output).replace("\\'", ''), ) # Mark last attempt a few days ago - should now return True @@ -1385,7 +1388,8 @@ class TestOffloadTask(InvenTreeTestCase): result = InvenTree.tasks.check_daily_holdoff('dummy_task') self.assertFalse(result) self.assertIn( - "Last attempt for 'dummy_task' was too recent", str(cm.output) + 'Last attempt for dummy_task was too recent', + str(cm.output).replace("\\'", ''), ) # Configure so a task was successful too recently diff --git a/src/backend/InvenTree/InvenTree/version.py b/src/backend/InvenTree/InvenTree/version.py index 64a10ffb1b..bc4eeb06a9 100644 --- a/src/backend/InvenTree/InvenTree/version.py +++ b/src/backend/InvenTree/InvenTree/version.py @@ -3,7 +3,6 @@ Provides information on the current InvenTree version """ -import logging import os import pathlib import platform @@ -21,7 +20,9 @@ from .api_version import INVENTREE_API_TEXT, INVENTREE_API_VERSION INVENTREE_SW_VERSION = '0.18.0 dev' -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') # Discover git diff --git a/src/backend/InvenTree/build/models.py b/src/backend/InvenTree/build/models.py index 7de5cc6130..b00afa3093 100644 --- a/src/backend/InvenTree/build/models.py +++ b/src/backend/InvenTree/build/models.py @@ -1,7 +1,6 @@ """Build database model definitions.""" import decimal -import logging from datetime import datetime from django.contrib.auth.models import User @@ -15,6 +14,7 @@ from django.dispatch.dispatcher import receiver from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from mptt.exceptions import InvalidMove from mptt.models import MPTTModel, TreeForeignKey from rest_framework import serializers @@ -47,7 +47,7 @@ from generic.states import StateTransitionMixin, StatusCodeMixin from plugin.events import trigger_event from stock.status_codes import StockHistoryCode, StockStatus -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class Build( diff --git a/src/backend/InvenTree/build/tasks.py b/src/backend/InvenTree/build/tasks.py index 0cd00c2329..6ee55bf094 100644 --- a/src/backend/InvenTree/build/tasks.py +++ b/src/backend/InvenTree/build/tasks.py @@ -1,6 +1,5 @@ """Background task definitions for the BuildOrder app.""" -import logging import random import time from datetime import timedelta @@ -11,6 +10,7 @@ from django.db import transaction from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ +import structlog from allauth.account.models import EmailAddress import build.models as build_models @@ -25,7 +25,7 @@ from build.status_codes import BuildStatusGroups from InvenTree.ready import isImportingData from plugin.events import trigger_event -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def auto_allocate_build(build_id: int, **kwargs): diff --git a/src/backend/InvenTree/build/test_build.py b/src/backend/InvenTree/build/test_build.py index 20f3b25403..0aba34bc2a 100644 --- a/src/backend/InvenTree/build/test_build.py +++ b/src/backend/InvenTree/build/test_build.py @@ -1,6 +1,5 @@ """Unit tests for the 'build' models.""" -import logging import uuid from datetime import datetime, timedelta @@ -11,6 +10,8 @@ from django.db.models import Sum from django.test import TestCase from django.test.utils import override_settings +import structlog + import build.tasks import common.models from build.models import Build, BuildItem, BuildLine, generate_next_build_reference @@ -22,7 +23,7 @@ from part.models import BomItem, BomItemSubstitute, Part, PartTestTemplate from stock.models import StockItem, StockItemTestResult from users.models import Owner -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class BuildTestBase(TestCase): diff --git a/src/backend/InvenTree/common/apps.py b/src/backend/InvenTree/common/apps.py index 6536499229..d07757cb3c 100644 --- a/src/backend/InvenTree/common/apps.py +++ b/src/backend/InvenTree/common/apps.py @@ -1,13 +1,13 @@ """App config for common app.""" -import logging - from django.apps import AppConfig +import structlog + import InvenTree.ready from common.settings import get_global_setting, set_global_setting -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class CommonConfig(AppConfig): diff --git a/src/backend/InvenTree/common/currency.py b/src/backend/InvenTree/common/currency.py index a83f13d157..99095210f1 100644 --- a/src/backend/InvenTree/common/currency.py +++ b/src/backend/InvenTree/common/currency.py @@ -1,7 +1,6 @@ """Helper functions for currency support.""" import decimal -import logging import math from typing import Optional @@ -9,11 +8,12 @@ from django.core.cache import cache from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ +import structlog from moneyed import CURRENCIES import InvenTree.helpers -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def currency_code_default(): diff --git a/src/backend/InvenTree/common/icons.py b/src/backend/InvenTree/common/icons.py index 92333c2a75..5ad87bea5a 100644 --- a/src/backend/InvenTree/common/icons.py +++ b/src/backend/InvenTree/common/icons.py @@ -1,7 +1,6 @@ """Icon utilities for InvenTree.""" import json -import logging from dataclasses import dataclass from pathlib import Path from typing import TypedDict @@ -9,7 +8,9 @@ from typing import TypedDict from django.core.exceptions import ValidationError from django.templatetags.static import static -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') _icon_packs = None diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index 163fb77241..c46642a4b8 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -7,7 +7,6 @@ import base64 import hashlib import hmac import json -import logging import os import uuid from datetime import timedelta, timezone @@ -34,6 +33,7 @@ from django.urls import reverse from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ +import structlog from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import convert_money from rest_framework.exceptions import PermissionDenied @@ -54,7 +54,7 @@ from generic.states import ColorEnum from generic.states.custom import state_color_mappings from InvenTree.sanitizer import sanitize_svg -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class MetaMixin(models.Model): diff --git a/src/backend/InvenTree/common/notifications.py b/src/backend/InvenTree/common/notifications.py index 6021583235..fe911f1140 100644 --- a/src/backend/InvenTree/common/notifications.py +++ b/src/backend/InvenTree/common/notifications.py @@ -1,6 +1,5 @@ """Base classes and functions for notifications.""" -import logging from dataclasses import dataclass from datetime import timedelta from typing import Optional @@ -9,6 +8,8 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.utils.translation import gettext_lazy as _ +import structlog + import common.models import InvenTree.helpers from InvenTree.ready import isImportingData, isRebuildingData @@ -16,7 +17,7 @@ from plugin import registry from plugin.models import NotificationUserSetting, PluginConfig from users.models import Owner -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') # region methods diff --git a/src/backend/InvenTree/common/tasks.py b/src/backend/InvenTree/common/tasks.py index 55d358b383..616001cd25 100644 --- a/src/backend/InvenTree/common/tasks.py +++ b/src/backend/InvenTree/common/tasks.py @@ -1,6 +1,5 @@ """Tasks (processes that get offloaded) for common app.""" -import logging import os from datetime import timedelta @@ -11,13 +10,14 @@ from django.utils import timezone import feedparser import requests +import structlog import InvenTree.helpers from InvenTree.helpers_model import getModelsWithMixin from InvenTree.models import InvenTreeNotesMixin from InvenTree.tasks import ScheduledTask, scheduled_task -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') @scheduled_task(ScheduledTask.DAILY) diff --git a/src/backend/InvenTree/importer/models.py b/src/backend/InvenTree/importer/models.py index d0c5e67cbc..82555e91ab 100644 --- a/src/backend/InvenTree/importer/models.py +++ b/src/backend/InvenTree/importer/models.py @@ -1,7 +1,6 @@ """Model definitions for the 'importer' app.""" import json -import logging from typing import Optional from django.contrib.auth.models import User @@ -11,6 +10,7 @@ from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from rest_framework.exceptions import ValidationError as DRFValidationError import importer.operations @@ -20,7 +20,7 @@ import importer.validators import InvenTree.helpers from importer.status_codes import DataImportStatusCode -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class DataImportSession(models.Model): diff --git a/src/backend/InvenTree/importer/registry.py b/src/backend/InvenTree/importer/registry.py index 2614c29ea5..28d96d0a79 100644 --- a/src/backend/InvenTree/importer/registry.py +++ b/src/backend/InvenTree/importer/registry.py @@ -1,12 +1,11 @@ """Registry for supported serializers for data import operations.""" -import logging - +import structlog from rest_framework.serializers import Serializer from importer.mixins import DataImportSerializerMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class DataImportSerializerRegister: diff --git a/src/backend/InvenTree/importer/tasks.py b/src/backend/InvenTree/importer/tasks.py index 0a6e38f123..1a74294adf 100644 --- a/src/backend/InvenTree/importer/tasks.py +++ b/src/backend/InvenTree/importer/tasks.py @@ -1,12 +1,13 @@ """Task definitions for the 'importer' app.""" -import logging from datetime import timedelta +import structlog + import InvenTree.helpers import InvenTree.tasks -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def import_data(session_id: int): diff --git a/src/backend/InvenTree/machine/apps.py b/src/backend/InvenTree/machine/apps.py index cfced400c3..0f47f36769 100755 --- a/src/backend/InvenTree/machine/apps.py +++ b/src/backend/InvenTree/machine/apps.py @@ -1,10 +1,10 @@ """Django machine app config.""" -import logging - from django.apps import AppConfig from django.db.utils import OperationalError, ProgrammingError +import structlog + from InvenTree.ready import ( canAppAccessDatabase, isImportingData, @@ -13,7 +13,7 @@ from InvenTree.ready import ( isRunningMigrations, ) -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class MachineConfig(AppConfig): diff --git a/src/backend/InvenTree/machine/registry.py b/src/backend/InvenTree/machine/registry.py index be8aeb677a..7531f5d3af 100644 --- a/src/backend/InvenTree/machine/registry.py +++ b/src/backend/InvenTree/machine/registry.py @@ -1,15 +1,16 @@ """Machine registry.""" -import logging from typing import Union, cast from uuid import UUID from django.core.cache import cache +import structlog + from InvenTree.helpers_mixin import get_shared_class_instance_state_mixin from machine.machine_type import BaseDriver, BaseMachineType -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class MachineRegistry( diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index 8b66d67e9c..2c24f63e8a 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -1,6 +1,5 @@ """Order model definitions.""" -import logging from datetime import datetime from decimal import Decimal @@ -15,6 +14,7 @@ from django.dispatch.dispatcher import receiver from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import convert_money from djmoney.money import Money @@ -58,7 +58,7 @@ from part import models as PartModels from plugin.events import trigger_event from stock.status_codes import StockHistoryCode, StockStatus -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class TotalPriceMixin(models.Model): diff --git a/src/backend/InvenTree/order/tasks.py b/src/backend/InvenTree/order/tasks.py index 9b47d2d24b..678a57dfc9 100644 --- a/src/backend/InvenTree/order/tasks.py +++ b/src/backend/InvenTree/order/tasks.py @@ -1,12 +1,13 @@ """Background tasks for the 'order' app.""" -import logging from datetime import datetime, timedelta from django.contrib.auth.models import User from django.db import transaction from django.utils.translation import gettext_lazy as _ +import structlog + import common.notifications import InvenTree.helpers_model import order.models @@ -15,7 +16,7 @@ from order.events import PurchaseOrderEvents, SalesOrderEvents from order.status_codes import PurchaseOrderStatusGroups, SalesOrderStatusGroups from plugin.events import trigger_event -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def notify_overdue_purchase_order(po: order.models.PurchaseOrder): diff --git a/src/backend/InvenTree/part/apps.py b/src/backend/InvenTree/part/apps.py index a499e899e2..72aa03ab6d 100644 --- a/src/backend/InvenTree/part/apps.py +++ b/src/backend/InvenTree/part/apps.py @@ -1,13 +1,13 @@ """part app specification.""" -import logging - from django.apps import AppConfig from django.db.utils import OperationalError, ProgrammingError +import structlog + import InvenTree.ready -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class PartConfig(AppConfig): diff --git a/src/backend/InvenTree/part/helpers.py b/src/backend/InvenTree/part/helpers.py index fcd24b0f2e..d07e3cfc13 100644 --- a/src/backend/InvenTree/part/helpers.py +++ b/src/backend/InvenTree/part/helpers.py @@ -1,15 +1,15 @@ """Various helper functions for the part app.""" -import logging import os from django.conf import settings +import structlog from jinja2 import Environment, select_autoescape from common.settings import get_global_setting -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') # Compiled template for rendering the 'full_name' attribute of a Part diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index 7f23844d17..234dffedf1 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -5,7 +5,6 @@ from __future__ import annotations import decimal import hashlib import inspect -import logging import math import os import re @@ -25,6 +24,7 @@ from django.dispatch import receiver from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from django_cleanup import cleanup from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import convert_money @@ -67,7 +67,7 @@ from order.status_codes import ( ) from stock import models as StockModels -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class PartCategory(InvenTree.models.InvenTreeTree): diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 66001ff930..24f0b5cf66 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -2,7 +2,6 @@ import imghdr import io -import logging import os from decimal import Decimal @@ -15,6 +14,7 @@ from django.db.models.functions import Coalesce from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ +import structlog from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import convert_money from rest_framework import serializers @@ -56,7 +56,7 @@ from .models import ( PartTestTemplate, ) -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') @register_importer() diff --git a/src/backend/InvenTree/part/stocktake.py b/src/backend/InvenTree/part/stocktake.py index 23c7bb00a7..4878265f8f 100644 --- a/src/backend/InvenTree/part/stocktake.py +++ b/src/backend/InvenTree/part/stocktake.py @@ -1,13 +1,13 @@ """Stocktake report functionality.""" import io -import logging import time from django.contrib.auth.models import User from django.core.files.base import ContentFile from django.utils.translation import gettext_lazy as _ +import structlog import tablib from djmoney.contrib.exchange.models import convert_money from djmoney.money import Money @@ -18,7 +18,7 @@ import InvenTree.helpers import part.models import stock.models -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def perform_stocktake( diff --git a/src/backend/InvenTree/part/tasks.py b/src/backend/InvenTree/part/tasks.py index a7e569960e..8d70537fb3 100644 --- a/src/backend/InvenTree/part/tasks.py +++ b/src/backend/InvenTree/part/tasks.py @@ -1,6 +1,5 @@ """Background task definitions for the 'part' app.""" -import logging import random import time from datetime import datetime, timedelta @@ -8,6 +7,8 @@ from datetime import datetime, timedelta from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ +import structlog + import common.currency import common.notifications import company.models @@ -24,7 +25,7 @@ from InvenTree.tasks import ( scheduled_task, ) -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def notify_low_stock(part: part_models.Part): diff --git a/src/backend/InvenTree/plugin/apps.py b/src/backend/InvenTree/plugin/apps.py index 3c47bc70b0..99f5f4ea01 100644 --- a/src/backend/InvenTree/plugin/apps.py +++ b/src/backend/InvenTree/plugin/apps.py @@ -4,16 +4,15 @@ This initializes the plugin mechanisms and handles reloading throughout the life The main code for plugin special sauce is in the plugin registry in `InvenTree/plugin/registry.py`. """ -import logging - from django.apps import AppConfig +import structlog from maintenance_mode.core import set_maintenance_mode from InvenTree.ready import canAppAccessDatabase, isInMainThread, isInWorkerThread from plugin import registry -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class PluginAppConfig(AppConfig): diff --git a/src/backend/InvenTree/plugin/base/barcodes/api.py b/src/backend/InvenTree/plugin/base/barcodes/api.py index 0170267825..5c88e7baf8 100644 --- a/src/backend/InvenTree/plugin/base/barcodes/api.py +++ b/src/backend/InvenTree/plugin/base/barcodes/api.py @@ -1,11 +1,10 @@ """API endpoints for barcode plugins.""" -import logging - from django.db.models import F from django.urls import include, path from django.utils.translation import gettext_lazy as _ +import structlog from django_filters import rest_framework as rest_filters from drf_spectacular.utils import extend_schema, extend_schema_view from rest_framework import permissions, status @@ -29,7 +28,7 @@ from users.models import RuleSet from . import serializers as barcode_serializers -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class BarcodeView(CreateAPIView): diff --git a/src/backend/InvenTree/plugin/base/barcodes/helper.py b/src/backend/InvenTree/plugin/base/barcodes/helper.py index 9a681939f9..d8814534ce 100644 --- a/src/backend/InvenTree/plugin/base/barcodes/helper.py +++ b/src/backend/InvenTree/plugin/base/barcodes/helper.py @@ -1,12 +1,13 @@ """Helper functions for barcode generation.""" -import logging from typing import Type, cast +import structlog + import InvenTree.helpers_model from InvenTree.models import InvenTreeBarcodeMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def cache(func): diff --git a/src/backend/InvenTree/plugin/base/barcodes/mixins.py b/src/backend/InvenTree/plugin/base/barcodes/mixins.py index ab4bb63c48..69905e1dcc 100644 --- a/src/backend/InvenTree/plugin/base/barcodes/mixins.py +++ b/src/backend/InvenTree/plugin/base/barcodes/mixins.py @@ -2,12 +2,12 @@ from __future__ import annotations -import logging - from django.core.exceptions import ValidationError from django.db.models import Q from django.utils.translation import gettext_lazy as _ +import structlog + from company.models import Company, ManufacturerPart, SupplierPart from InvenTree.exceptions import log_error from InvenTree.models import InvenTreeBarcodeMixin @@ -15,7 +15,7 @@ from order.models import PurchaseOrder from part.models import Part from plugin.base.integration.SettingsMixin import SettingsMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class BarcodeMixin: diff --git a/src/backend/InvenTree/plugin/base/event/events.py b/src/backend/InvenTree/plugin/base/event/events.py index ef1bb152b2..01aa91cc93 100644 --- a/src/backend/InvenTree/plugin/base/event/events.py +++ b/src/backend/InvenTree/plugin/base/event/events.py @@ -1,19 +1,19 @@ """Functions for triggering and responding to server side events.""" -import logging - from django.conf import settings from django.db import transaction from django.db.models.signals import post_delete, post_save from django.dispatch.dispatcher import receiver +import structlog + import InvenTree.exceptions from common.settings import get_global_setting from InvenTree.ready import canAppAccessDatabase, isImportingData from InvenTree.tasks import offload_task from plugin.registry import registry -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def trigger_event(event: str, *args, **kwargs) -> None: diff --git a/src/backend/InvenTree/plugin/base/icons/mixins.py b/src/backend/InvenTree/plugin/base/icons/mixins.py index a103e93c04..76e15cf146 100644 --- a/src/backend/InvenTree/plugin/base/icons/mixins.py +++ b/src/backend/InvenTree/plugin/base/icons/mixins.py @@ -1,11 +1,11 @@ """Plugin mixin classes for icon pack plugin.""" -import logging +import structlog from common.icons import IconPack, reload_icon_packs from plugin.helpers import MixinNotImplementedError -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class IconPackMixin: diff --git a/src/backend/InvenTree/plugin/base/integration/APICallMixin.py b/src/backend/InvenTree/plugin/base/integration/APICallMixin.py index bb9ac1538f..3fa95824a2 100644 --- a/src/backend/InvenTree/plugin/base/integration/APICallMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/APICallMixin.py @@ -1,15 +1,15 @@ """Mixin class for making calls to an external API.""" import json as json_pkg -import logging from collections.abc import Iterable from typing import Optional import requests +import structlog from plugin.helpers import MixinNotImplementedError -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class APICallMixin: diff --git a/src/backend/InvenTree/plugin/base/integration/AppMixin.py b/src/backend/InvenTree/plugin/base/integration/AppMixin.py index 9e07d74d4d..d20a754aff 100644 --- a/src/backend/InvenTree/plugin/base/integration/AppMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/AppMixin.py @@ -1,6 +1,5 @@ """Plugin mixin class for AppMixin.""" -import logging from importlib import reload from pathlib import Path from typing import Optional @@ -9,9 +8,11 @@ from django.apps import apps from django.conf import settings from django.contrib import admin +import structlog + from InvenTree.config import get_plugin_dir -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class AppMixin: diff --git a/src/backend/InvenTree/plugin/base/integration/PanelMixin.py b/src/backend/InvenTree/plugin/base/integration/PanelMixin.py index d4d374e67b..9b79ac1cd8 100644 --- a/src/backend/InvenTree/plugin/base/integration/PanelMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/PanelMixin.py @@ -3,12 +3,12 @@ Allows integration of custom 'panels' into the user interface. """ -import logging +import structlog from InvenTree.helpers import generateTestKey from plugin.helpers import MixinNotImplementedError, render_template, render_text -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class PanelMixin: diff --git a/src/backend/InvenTree/plugin/base/integration/ScheduleMixin.py b/src/backend/InvenTree/plugin/base/integration/ScheduleMixin.py index c61e907e9c..e2784939e4 100644 --- a/src/backend/InvenTree/plugin/base/integration/ScheduleMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/ScheduleMixin.py @@ -1,14 +1,14 @@ """Plugin mixin class for ScheduleMixin.""" -import logging - from django.conf import settings from django.db.utils import OperationalError, ProgrammingError +import structlog + from common.settings import get_global_setting from plugin.helpers import MixinImplementationError -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class ScheduleMixin: diff --git a/src/backend/InvenTree/plugin/base/integration/SettingsMixin.py b/src/backend/InvenTree/plugin/base/integration/SettingsMixin.py index 7d5b04a41f..03f9b14613 100644 --- a/src/backend/InvenTree/plugin/base/integration/SettingsMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/SettingsMixin.py @@ -1,11 +1,12 @@ """Plugin mixin class for SettingsMixin.""" -import logging from typing import TYPE_CHECKING from django.db.utils import OperationalError, ProgrammingError -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') # import only for typechecking, otherwise this throws a model is unready error if TYPE_CHECKING: diff --git a/src/backend/InvenTree/plugin/base/integration/UrlsMixin.py b/src/backend/InvenTree/plugin/base/integration/UrlsMixin.py index a1c9036c95..904bc8bec0 100644 --- a/src/backend/InvenTree/plugin/base/integration/UrlsMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/UrlsMixin.py @@ -1,14 +1,14 @@ """Plugin mixin class for UrlsMixin.""" -import logging - from django.conf import settings from django.urls import include, re_path +import structlog + from common.settings import get_global_setting from plugin.urls import PLUGIN_BASE -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class UrlsMixin: diff --git a/src/backend/InvenTree/plugin/base/integration/mixins.py b/src/backend/InvenTree/plugin/base/integration/mixins.py index 5644dc8f8e..03586eaed3 100644 --- a/src/backend/InvenTree/plugin/base/integration/mixins.py +++ b/src/backend/InvenTree/plugin/base/integration/mixins.py @@ -1,10 +1,10 @@ """Plugin mixin classes.""" -import logging +import structlog from plugin.helpers import MixinNotImplementedError -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class NavigationMixin: diff --git a/src/backend/InvenTree/plugin/base/label/label.py b/src/backend/InvenTree/plugin/base/label/label.py index 425cf0da9d..05a28a9a1b 100644 --- a/src/backend/InvenTree/plugin/base/label/label.py +++ b/src/backend/InvenTree/plugin/base/label/label.py @@ -1,15 +1,15 @@ """Functions to print a label to a mixin printer.""" -import logging - from django.conf import settings from django.utils.translation import gettext_lazy as _ +import structlog + import common.notifications from InvenTree.exceptions import log_error from plugin.registry import registry -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def print_label(plugin_slug: str, **kwargs): diff --git a/src/backend/InvenTree/plugin/base/locate/mixins.py b/src/backend/InvenTree/plugin/base/locate/mixins.py index 3d2077d566..aaf9f20435 100644 --- a/src/backend/InvenTree/plugin/base/locate/mixins.py +++ b/src/backend/InvenTree/plugin/base/locate/mixins.py @@ -1,10 +1,10 @@ """Plugin mixin for locating stock items and locations.""" -import logging +import structlog from plugin.helpers import MixinNotImplementedError -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class LocateMixin: diff --git a/src/backend/InvenTree/plugin/base/ui/mixins.py b/src/backend/InvenTree/plugin/base/ui/mixins.py index 2713a03875..ad3990b205 100644 --- a/src/backend/InvenTree/plugin/base/ui/mixins.py +++ b/src/backend/InvenTree/plugin/base/ui/mixins.py @@ -3,12 +3,12 @@ Allows integration of custom UI elements into the React user interface. """ -import logging from typing import Literal, TypedDict +import structlog from rest_framework.request import Request -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') # List of supported feature types diff --git a/src/backend/InvenTree/plugin/builtin/integration/currency_exchange.py b/src/backend/InvenTree/plugin/builtin/integration/currency_exchange.py index 09ae98f14d..e88edf57ee 100644 --- a/src/backend/InvenTree/plugin/builtin/integration/currency_exchange.py +++ b/src/backend/InvenTree/plugin/builtin/integration/currency_exchange.py @@ -1,13 +1,13 @@ """Builtin plugin for requesting exchange rates from an external API.""" -import logging - from django.utils.translation import gettext_lazy as _ +import structlog + from plugin import InvenTreePlugin from plugin.mixins import APICallMixin, CurrencyExchangeMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class InvenTreeCurrencyExchange(APICallMixin, CurrencyExchangeMixin, InvenTreePlugin): diff --git a/src/backend/InvenTree/plugin/builtin/labels/label_sheet.py b/src/backend/InvenTree/plugin/builtin/labels/label_sheet.py index c58f4d6cb2..a4821805c7 100644 --- a/src/backend/InvenTree/plugin/builtin/labels/label_sheet.py +++ b/src/backend/InvenTree/plugin/builtin/labels/label_sheet.py @@ -1,12 +1,12 @@ """Label printing plugin which supports printing multiple labels on a single page.""" -import logging import math from django.core.exceptions import ValidationError from django.core.files.base import ContentFile from django.utils.translation import gettext_lazy as _ +import structlog import weasyprint from rest_framework import serializers @@ -16,7 +16,7 @@ from plugin import InvenTreePlugin from plugin.mixins import LabelPrintingMixin, SettingsMixin from report.models import LabelOutput, LabelTemplate -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class LabelPrintingOptionsSerializer(serializers.Serializer): diff --git a/src/backend/InvenTree/plugin/helpers.py b/src/backend/InvenTree/plugin/helpers.py index 75170b56fd..4c78ff14e7 100644 --- a/src/backend/InvenTree/plugin/helpers.py +++ b/src/backend/InvenTree/plugin/helpers.py @@ -1,7 +1,6 @@ """Helpers for plugin app.""" import inspect -import logging import os import pathlib import pkgutil @@ -16,7 +15,9 @@ from django.conf import settings from django.core.exceptions import AppRegistryNotReady from django.db.utils import IntegrityError -logger = logging.getLogger('inventree') +import structlog + +logger = structlog.get_logger('inventree') # region logging / errors diff --git a/src/backend/InvenTree/plugin/installer.py b/src/backend/InvenTree/plugin/installer.py index 7f96871520..ba8bfa4543 100644 --- a/src/backend/InvenTree/plugin/installer.py +++ b/src/backend/InvenTree/plugin/installer.py @@ -1,6 +1,5 @@ """Install a plugin into the python virtual environment.""" -import logging import re import subprocess import sys @@ -9,11 +8,13 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ +import structlog + import plugin.models import plugin.staticfiles from InvenTree.exceptions import log_error -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def pip_command(*args): diff --git a/src/backend/InvenTree/plugin/plugin.py b/src/backend/InvenTree/plugin/plugin.py index b2763f00b7..81ccf03d18 100644 --- a/src/backend/InvenTree/plugin/plugin.py +++ b/src/backend/InvenTree/plugin/plugin.py @@ -1,7 +1,6 @@ """Base Class for InvenTree plugins.""" import inspect -import logging import warnings from datetime import datetime from distutils.sysconfig import get_python_lib @@ -13,10 +12,12 @@ from django.conf import settings from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ +import structlog + import InvenTree.helpers from plugin.helpers import get_git_log -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class MetaBase: diff --git a/src/backend/InvenTree/plugin/registry.py b/src/backend/InvenTree/plugin/registry.py index f45c080f10..5a46a27a20 100644 --- a/src/backend/InvenTree/plugin/registry.py +++ b/src/backend/InvenTree/plugin/registry.py @@ -7,7 +7,6 @@ import importlib import importlib.machinery import importlib.util -import logging import os import sys import time @@ -25,6 +24,8 @@ from django.urls import clear_url_caches, path from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ +import structlog + from common.settings import get_global_setting, set_global_setting from InvenTree.config import get_plugin_dir from InvenTree.ready import canAppAccessDatabase @@ -38,7 +39,7 @@ from .helpers import ( ) from .plugin import InvenTreePlugin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class PluginsRegistry: diff --git a/src/backend/InvenTree/plugin/samples/event/event_sample.py b/src/backend/InvenTree/plugin/samples/event/event_sample.py index 1b2bf59615..918f373456 100644 --- a/src/backend/InvenTree/plugin/samples/event/event_sample.py +++ b/src/backend/InvenTree/plugin/samples/event/event_sample.py @@ -1,13 +1,13 @@ """Sample plugin which responds to events.""" -import logging - from django.conf import settings +import structlog + from plugin import InvenTreePlugin from plugin.mixins import EventMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class EventPluginSample(EventMixin, InvenTreePlugin): diff --git a/src/backend/InvenTree/plugin/samples/event/filtered_event_sample.py b/src/backend/InvenTree/plugin/samples/event/filtered_event_sample.py index 7380d0622a..80535c201a 100644 --- a/src/backend/InvenTree/plugin/samples/event/filtered_event_sample.py +++ b/src/backend/InvenTree/plugin/samples/event/filtered_event_sample.py @@ -1,13 +1,13 @@ """Sample plugin which responds to events.""" -import logging - from django.conf import settings +import structlog + from plugin import InvenTreePlugin from plugin.mixins import EventMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class FilteredEventPluginSample(EventMixin, InvenTreePlugin): diff --git a/src/backend/InvenTree/plugin/samples/event/test_event_sample.py b/src/backend/InvenTree/plugin/samples/event/test_event_sample.py index 0e5eb9b86d..20d42ac19b 100644 --- a/src/backend/InvenTree/plugin/samples/event/test_event_sample.py +++ b/src/backend/InvenTree/plugin/samples/event/test_event_sample.py @@ -9,8 +9,6 @@ from plugin.base.event.events import trigger_event from plugin.helpers import MixinNotImplementedError from plugin.mixins import EventMixin -from .event_sample import logger - class EventPluginSampleTests(TestCase): """Tests for EventPluginSample.""" @@ -27,11 +25,9 @@ class EventPluginSampleTests(TestCase): # Enable event testing settings.PLUGIN_TESTING_EVENTS = True # Check that an event is issued - with self.assertLogs(logger=logger, level='DEBUG') as cm: + with self.assertLogs(logger='inventree', level='DEBUG') as cm: trigger_event('test.event') - self.assertIn( - 'DEBUG:inventree:Event `test.event` triggered in sample plugin', cm[1] - ) + self.assertIn('Event `test.event` triggered in sample plugin', str(cm[1])) # Disable again settings.PLUGIN_TESTING_EVENTS = False diff --git a/src/backend/InvenTree/plugin/samples/event/test_filtered_event_sample.py b/src/backend/InvenTree/plugin/samples/event/test_filtered_event_sample.py index 1da5a3b499..602181a0ad 100644 --- a/src/backend/InvenTree/plugin/samples/event/test_filtered_event_sample.py +++ b/src/backend/InvenTree/plugin/samples/event/test_filtered_event_sample.py @@ -7,8 +7,6 @@ from common.models import InvenTreeSetting from plugin import registry from plugin.base.event.events import trigger_event -from .filtered_event_sample import logger - class FilteredEventPluginSampleTests(TestCase): """Tests for EventPluginSample.""" @@ -25,11 +23,9 @@ class FilteredEventPluginSampleTests(TestCase): # Enable event testing settings.PLUGIN_TESTING_EVENTS = True # Check that an event is issued - with self.assertLogs(logger=logger, level='DEBUG') as cm: + with self.assertLogs(logger='inventree', level='DEBUG') as cm: trigger_event('test.event') - self.assertIn( - 'DEBUG:inventree:Event `test.event` triggered in sample plugin', cm[1] - ) + self.assertIn('Event `test.event` triggered in sample plugin', str(cm[1])) # Disable again settings.PLUGIN_TESTING_EVENTS = False @@ -46,7 +42,7 @@ class FilteredEventPluginSampleTests(TestCase): # Enable event testing settings.PLUGIN_TESTING_EVENTS = True # Check that an event is issued - with self.assertLogs(logger=logger, level='DEBUG') as cm: + with self.assertLogs(logger='inventree', level='DEBUG') as cm: trigger_event('test.some.other.event') self.assertNotIn( 'DEBUG:inventree:Event `test.some.other.event` triggered in sample plugin', diff --git a/src/backend/InvenTree/plugin/samples/locate/locate_sample.py b/src/backend/InvenTree/plugin/samples/locate/locate_sample.py index 50f3263f98..b46794260b 100644 --- a/src/backend/InvenTree/plugin/samples/locate/locate_sample.py +++ b/src/backend/InvenTree/plugin/samples/locate/locate_sample.py @@ -3,12 +3,12 @@ Note: This plugin does not *actually* locate anything! """ -import logging +import structlog from plugin import InvenTreePlugin from plugin.mixins import LocateMixin -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class SampleLocatePlugin(LocateMixin, InvenTreePlugin): diff --git a/src/backend/InvenTree/plugin/staticfiles.py b/src/backend/InvenTree/plugin/staticfiles.py index 774cf2f033..115242298e 100644 --- a/src/backend/InvenTree/plugin/staticfiles.py +++ b/src/backend/InvenTree/plugin/staticfiles.py @@ -1,12 +1,12 @@ """Static files management for InvenTree plugins.""" -import logging - from django.contrib.staticfiles.storage import staticfiles_storage +import structlog + from plugin.registry import registry -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def clear_static_dir(path, recursive=True): diff --git a/src/backend/InvenTree/stock/models.py b/src/backend/InvenTree/stock/models.py index 6e70ba16cc..a65d7a9437 100644 --- a/src/backend/InvenTree/stock/models.py +++ b/src/backend/InvenTree/stock/models.py @@ -2,7 +2,6 @@ from __future__ import annotations -import logging import os from datetime import timedelta from decimal import Decimal, InvalidOperation @@ -20,6 +19,7 @@ from django.dispatch import receiver from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from djmoney.contrib.exchange.models import convert_money from mptt.managers import TreeManager from mptt.models import MPTTModel, TreeForeignKey @@ -52,7 +52,7 @@ from stock.events import StockEvents from stock.generators import generate_batch_code from users.models import Owner -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class StockLocationType(InvenTree.models.MetadataMixin, models.Model): diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index 79f75b4388..a11f90b670 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -1,6 +1,5 @@ """JSON serializers for Stock app.""" -import logging from datetime import timedelta from decimal import Decimal @@ -10,6 +9,7 @@ from django.db.models import BooleanField, Case, Count, Prefetch, Q, Value, When from django.db.models.functions import Coalesce from django.utils.translation import gettext_lazy as _ +import structlog from rest_framework import serializers from rest_framework.serializers import ValidationError from sql_util.utils import SubqueryCount, SubquerySum @@ -40,7 +40,7 @@ from .models import ( StockLocationType, ) -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class GenerateBatchCodeSerializer(serializers.Serializer): diff --git a/src/backend/InvenTree/stock/tasks.py b/src/backend/InvenTree/stock/tasks.py index a3791649b7..fd0e4c5df2 100644 --- a/src/backend/InvenTree/stock/tasks.py +++ b/src/backend/InvenTree/stock/tasks.py @@ -1,8 +1,8 @@ """Background tasks for the stock app.""" -import logging +import structlog -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') def rebuild_stock_item_tree(tree_id=None): diff --git a/src/backend/InvenTree/users/apps.py b/src/backend/InvenTree/users/apps.py index fdf96ca0ec..95c8f0ec1e 100644 --- a/src/backend/InvenTree/users/apps.py +++ b/src/backend/InvenTree/users/apps.py @@ -1,13 +1,13 @@ """App configuration class for the 'users' app.""" -import logging - from django.apps import AppConfig from django.db.utils import OperationalError, ProgrammingError +import structlog + import InvenTree.ready -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') class UsersConfig(AppConfig): diff --git a/src/backend/InvenTree/users/models.py b/src/backend/InvenTree/users/models.py index f6d9ce526f..339a3ef2f1 100644 --- a/src/backend/InvenTree/users/models.py +++ b/src/backend/InvenTree/users/models.py @@ -1,7 +1,6 @@ """Database model definitions for the 'users' app.""" import datetime -import logging from django.conf import settings from django.contrib import admin @@ -19,6 +18,7 @@ from django.dispatch import receiver from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import structlog from rest_framework.authtoken.models import Token as AuthToken import InvenTree.helpers @@ -26,7 +26,7 @@ import InvenTree.models from common.settings import get_global_setting from InvenTree.ready import canAppAccessDatabase, isImportingData -logger = logging.getLogger('inventree') +logger = structlog.get_logger('inventree') # OVERRIDE START diff --git a/src/backend/InvenTree/web/templatetags/spa_helper.py b/src/backend/InvenTree/web/templatetags/spa_helper.py index f894bc7aa1..11bfc734fb 100644 --- a/src/backend/InvenTree/web/templatetags/spa_helper.py +++ b/src/backend/InvenTree/web/templatetags/spa_helper.py @@ -1,7 +1,6 @@ """Template tag to render SPA imports.""" import json -from logging import getLogger from pathlib import Path from typing import Union @@ -9,7 +8,9 @@ from django import template from django.conf import settings from django.utils.safestring import mark_safe -logger = getLogger('InvenTree') +import structlog + +logger = structlog.get_logger('inventree') register = template.Library() FRONTEND_SETTINGS = json.dumps(settings.FRONTEND_SETTINGS)