mpso
mpso

Reputation: 1149

Why does my Django 1.3 logging setup cause all messages to be output twice?

My Django 1.3 logging setup causes all log messages to be output twice. I've read that importing settings.py two or more times has caused this problem in the past, but Django 1.3 has new logging features, and I don't think I'm importing settings.py twice anywhere.

settings.py config:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(levelname)s: %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        },
    },
    'loggers': {
        'custom': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    }
}

Code:

import logging
log = logging.getLogger('custom')

log.debug('message1')
log.debug('message2')

Output:

DEBUG: message1
DEBUG:custom:message1

Thanks for your help.

Upvotes: 11

Views: 2095

Answers (3)

david euler
david euler

Reputation: 824

I've been suffered by the same issue. And I fixed it by redirecting the root logs to a file, and project logs to both the file and the console.

I grep my code, and could not find anywhere basicConfig() exists, also tried to set disable_existing_loggers to True, It doesn't help, finally solved the problem by set a file logger. I guess it maybe a problem by design in some cases.

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'simple': {
        # exact format is not important, this is the minimum information
        'format': '%(asctime)s %(name)-12s %(lineno)d %(levelname)-8s %(message)s',
    },
},
'handlers': {
    'console': {
        #'level': 'INFO',
        'class': 'logging.StreamHandler',
        'formatter': 'simple',
    },
    # Add Handler for mail_admins for `warning` and above
    'mail_admins': {
        'level': 'ERROR',
        'class': 'django.utils.log.AdminEmailHandler',
    },
    'file': {
        #'level': 'INFO',
        'class': 'logging.FileHandler',
        'formatter': 'simple',
        'filename': os.path.join(os.path.dirname(PROJECT_ROOT), 'crawler.admin.log'),
    },

},

'loggers': {
    # root logger
    '': {
        'level': 'INFO',
        'handlers': ['file', 'mail_admins'],
    },
    'scrapy': {
        'level': 'WARNING',
        'handlers': ['console', 'mail_admins'],
        'propagate': False,
    },
    'crawleradmin': {
        'level': 'INFO',
        'handlers': ['console', 'file', 'mail_admins'],
        # required to avoid double logging with root logger
        'propagate': False,
    },
},
}

Upvotes: 0

Ken Cochrane
Ken Cochrane

Reputation: 77425

Have you tried setting propagate = False? Along with disable_existing_loggers = True?

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'simple': {
            'format': '%(levelname)s: %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        },
    },
    'loggers': {
        'custom': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    }
}

Upvotes: 13

Tord Holmqvist
Tord Holmqvist

Reputation: 31

You might want to try 'disable_existing_loggers': True?

Upvotes: 0

Related Questions