How to Implement Logging in Django: Complete Tutorial

Mehedi Khan
Django Unleashed
Published in
5 min readJun 24, 2024
How to Implement Logging in Django

Implementing logging in Django is essential for monitoring your application’s behavior, troubleshooting issues, and keeping track of various events. Here is a complete tutorial on how to set up and configure logging in a Django project:

Step 1: Basic Setup

1. Install Django

If you haven’t installed Django yet, you need to run this command using pip:

pip install django

2. Create a Django Project

Create a new Django project:

django-admin startproject myproject

Navigate to your project directory:

cd myproject

3. Create a Django App

Create a new Django app in your project directory, following this command:

python manage.py startapp myapp

Step 2: Configure Logging in settings.py

  1. Import the Logging Library: Django uses Python’s built-in logging library, so you don’t need to install any additional packages. Import the logging module in your settings.py.
  2. Configure Logging in settings.py: Define the logging configuration. Here is a basic setup:
# settings.py

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'debug.log',
'formatter': 'verbose',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
},
'loggers': {
'django': {
'handlers': ['file', 'console'],
'level': 'DEBUG',
'propagate': True,
},
},
}

3. Explanation:

  • version: Indicates the schema version (always 1).
  • disable_existing_loggers: If False, keeps the existing loggers.
  • formatters: Defines the format of the logs.
  • handlers: Specifies where the log messages are sent. In this case, they are sent to a file and the console.
  • loggers: Configures the loggers. Django logger is used for monitoring all related logs.

Step 3: Custom Loggers

You can add custom loggers for your django applications and different logging levels.

  1. Add Custom Logger:
# settings.py

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'debug.log',
'formatter': 'verbose',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
monitoring },
'loggers': {
'django': {
'handlers': ['file', 'console'],
'level': 'DEBUG',
'propagate': True,
},
'myapp': { # Custom logger for 'myapp'
'handlers': ['file', 'console'],
'level': 'INFO',
'propagate': False,
},
},
}

Step 4: Advanced Configuration

For more advanced logging in Django, you can add more handlers, formatters, and configure different loggers for different parts of your application. Here are a few examples:

Step 5: Advanced Configuration

  1. Email Notifications Configure email notifications for critical errors by adding an email handler:
# settings.py 

'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
},
# other handlers...
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
# other loggers...
},

2. Custom Handlers and Filters Define custom handlers and filters for more complex logging requirements.

Example: Full settings.py Logging Configuration

Here’s a more comprehensive example:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'debug.log',
'formatter': 'verbose',
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': True,
},
'myapp': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': False,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
},
}

Step 6: Using the Logger in Your Application

1. Log Messages in Views

You can use the logger in your views to log messages. Create a view and write some log messages:

# myproject/myapp/views.py
import logging
from django.http import HttpResponse

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request):
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
return HttpResponse("Logging example")

2. Include the View in URLs

Make sure this view is included in your URL configuration:

# myproject/myapp/urls.py

from django.urls import path
from .views import my_view

urlpatterns = [
path('log/', my_view, name='my_view'),
]

And include the app URLs in your project URLs:

# myproject/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]

Step 7: Running the Server

Run the development server to test your logging setup:

python manage.py runserver

Browse http://127.0.0.1:8000/log/ to trigger the logging messages. You should see the log output in the console and also the debug.log file in your project directory.

Step 8: Logging Exceptions

Django automatically logs exceptions to the configured loggers, but you can add custom behavior.

  1. Log Exceptions in Views:
import logging

logger = logging.getLogger('myapp')

def my_view(request):
try:
# Your view logic
pass
except Exception as e:
logger.exception('An error occurred: %s', e)
raise

Step 9: Rotating Log Files

For production environments, it’s often useful to rotate log files to prevent them from growing indefinitely.

  1. Install RotatingFileHandler:

If you don’t have it installed, you might need to install the logging module's handler in Django.

2. Configure RotatingFileHandler:

# settings.py

import logging.handlers

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'debug.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 3,
'formatter': 'verbose',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
},
'loggers': {
'django': {
'handlers': ['file', 'console'],
'level': 'DEBUG',
'propagate': True,
},
},
}

Step 10: Testing Your Logging Configuration

  1. Run Your Django Application: Start your Django development server and trigger some actions that generate logs.
  2. Check the Logs: Ensure that the logs are written to debug.log and appear on the console as per the configuration.

Conclusion

By following these steps, you will have a robust logging setup for your Django application, allowing you to monitor, debug, and maintain your application more effectively. Customize the loggers and handlers further based on your specific requirements to capture the necessary information in the desired format.

Thank you for reading! If you notice any mistakes or have suggestions for improvement, please leave a comment below.

If you enjoyed this post, please click the 👏 button to help others discover it. You can also follow me on:

GitHub | daily.dev | LinkedIn | YouTube

More Libraries

Django

28 stories

Python

12 stories

--

--

Django Unleashed
Django Unleashed

Published in Django Unleashed

Unleashing the Full Potential of Web Development

Mehedi Khan
Mehedi Khan

Written by Mehedi Khan

I'm a Software engineer. I'm comfortable with Python, Django, and Full-stack Web Development. Follow To Support Me On Medium 🫠

No responses yet