.. _commands: Commands ======== Prerequisites ^^^^^^^^^^^^^ Install ``django-structlog`` with command support (it will install `django-extensions `_). .. code-block:: bash pip install django-structlog[commands] Alternatively install `django-extensions `_ directly: .. code-block:: bash pip install django-extensions Configuration ^^^^^^^^^^^^^ Enable ``django-structlog``'s command logging: .. code-block:: python DJANGO_STRUCTLOG_COMMAND_LOGGING_ENABLED = True Add ``django-extensions``'s `@signalcommand `_ to your commands .. code-block:: python import structlog from django.core.management import BaseCommand from django_extensions.management.utils import signalcommand # <- add this logger = structlog.getLogger(__name__) class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument("foo", type=str) @signalcommand # <- add this def handle(self, foo, *args, **options): logger.info("my log", foo=foo) return 0 Results ^^^^^^^ Log will add ``command_name`` and ``command_id`` to the logs: .. code-block:: bash $ python manage.py example_command bar 2023-09-13T21:10:50.084368Z [info ] command_started [django_structlog.commands] command_name=django_structlog_demo_project.users.example_command command_id=be723d34-59f5-468e-9258-24232aa4cedd 2023-09-13T21:10:50.085325Z [info ] my log [django_structlog_demo_project.users.management.commands.example_command] command_id=be723d34-59f5-468e-9258-24232aa4cedd foo=bar 2023-09-13T21:10:50.085877Z [info ] command_finished [django_structlog.commands] command_id=be723d34-59f5-468e-9258-24232aa4cedd It also supports nested commands which will keep track of parent commands through ``parent_id``: .. code-block:: bash $ python manage.py example_command bar 2023-09-15T00:10:10.466616Z [info ] command_started [django_structlog.commands] command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed command_name=django_structlog_demo_project.users.example_command 2023-09-15T00:10:10.467250Z [info ] my log [django_structlog_demo_project.users.management.commands.example_command] command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed foo=bar 2023-09-15T00:10:10.468176Z [info ] command_started [django_structlog.commands] baz=2 command_id=57524ccb-a8eb-4d30-a989-4e83ffdca9c0 command_name=django_structlog_demo_project.users.example_nested_command parent_command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed 2023-09-15T00:10:10.468871Z [info ] my nested log [django_structlog_demo_project.users.management.commands.example_nested_command] command_id=57524ccb-a8eb-4d30-a989-4e83ffdca9c0 parent_command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed 2023-09-15T00:10:10.469418Z [info ] command_finished [django_structlog.commands] command_id=57524ccb-a8eb-4d30-a989-4e83ffdca9c0 parent_command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed 2023-09-15T00:10:10.469964Z [info ] my log 2 [django_structlog_demo_project.users.management.commands.example_command] command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed 2023-09-15T00:10:10.470585Z [info ] command_finished [django_structlog.commands] command_id=f2a8c9a8-5aa3-4e22-b11c-f387449a34ed