Keywords: Django | Logs | Errors
Abstract: This article explains how to configure Django's logging system to debug errors like 403 when deploying with nginx. It covers the default configuration and provides examples for adding file-based logs to help developers quickly locate and resolve issues.
Introduction
In Django applications, especially when integrated with nginx for production deployment, encountering errors such as 403 Forbidden can be common. To effectively debug these issues, it's essential to access detailed logs. Django's logging system is built on Python's logging module and is configured in the settings.py file.
Default Logging Configuration
By default, a new Django project includes a basic logging configuration that primarily sends email notifications to site administrators for HTTP 500 errors when DEBUG=False. This configuration is defined in the LOGGING dictionary in settings.py.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
This setup does not create log files by default. To store logs locally, additional handlers need to be configured.
Adding File-Based Logs
To create a rotating log file, add a handler with a filename parameter. For example, using RotatingFileHandler from Python's logging module allows you to manage log file size and backups.
'applogfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(DJANGO_ROOT, 'APPNAME.log'),
'maxBytes': 1024*1024*15, # 15MB
'backupCount': 10,
},
Then, in the loggers section, associate this handler with your application logger.
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'APPNAME': {
'handlers': ['applogfile',],
'level': 'DEBUG',
},
}
This configuration sets up a log file named APPNAME.log in the Django root directory, with automatic rotation to handle files up to 15MB and keep 10 backup copies.
Alternative Configuration
For simpler setups, you can use FileHandler as shown in supplementary answers. This creates a static log file.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
This approach is straightforward but lacks features like rotation, making it suitable for development environments.
Conclusion
Properly configuring Django logs is crucial for debugging errors in production. By customizing the LOGGING settings in settings.py, you can set up file-based logs to capture detailed information. Start with the default configuration and extend it based on your needs to efficiently manage and review logs for issues like 403 errors.