trshmanx
trshmanx

Reputation: 680

How to log Django warnings and errors to log file in Production?

What I want to achieve is that warning and errors that happen in production (i.e. DEBUG=False) are logged into to a rotating log file.

I tried this

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': True,
        'handlers': {
            'file': {
                'level': 'WARNING',
                'class': 'logging.FileHandler',
                'filename': 'staging.log',
            },
        },
        'loggers': {
            '': {
                'handlers': ['file'],
                'level': 'WARNING',
                'propagate': True,
            },
            'django': {
                'handlers': ['file'],
                'level': 'WARNING',
                'propagate': True,
            },
            'django.request': {
                'handlers': ['file'],
                'level': 'WARNING',
                'propagate': True,
            },
        },
    }

However, the above logs everything, not just messages of log level WARNING and above.

Upvotes: 2

Views: 5016

Answers (2)

Madhu Devara
Madhu Devara

Reputation: 1

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'error_file': {
            'class': 'logging.FileHandler',
            'filename': 'logs/error.log',
            'level': 'ERROR',
            'formatter': 'verbose',
        },
        'warning_file': {
            'class': 'logging.FileHandler',
            'filename': 'logs/warning.log',
            'level': 'WARNING',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django_error': {
            'handlers': ['error_file'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django_warning': {
            'handlers': ['warning_file'],
            'level': 'WARNING',
            'propagate': True,
        },
    },
    'formatters': {
        'verbose': {
            'format': '%(asctime)s %(levelname)s %(module)s %(message)s'
        }
    },
}

This will helpful to use separate warning and error log file

Upvotes: 0

skhynixsk
skhynixsk

Reputation: 194

You can follow the django logger here.

In your views.py:

import logging
logger = logging.getLogger(__name__)

then you can record using logger.error() or logger.warning() or logger.info(). It will create a logger file in your main project directory and it will list out all the logging details.

See this:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'handlers': {
        'logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': "yourproject_name.log",
            'maxBytes': 100000,
            'backupCount': 2,
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['logfile'],
            'level': 'INFO',
            'propagate': True,
        },
        'apps': {
            'handlers': ['logfile'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

Upvotes: 3

Related Questions