Как насчет здесь!
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
Использование:
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
Если вы видите слишком много журналов из сторонних пакетов, обязательно запустите эту конфигурацию, используя logging.config.dictConfig(LOGGING_CONFIG)
перед импортом сторонних пакетов.
Ссылка: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
root
регистратора: на верхнем уровне словаря. Он описан в документации , имеет преимущество перед тем,['loggers']['']
когда присутствуют оба, но, на мой взгляд,['loggers']['']
более логичен. См. Также обсуждение здесь'disable_existing_loggers': False
как тогда вы, возможно, не настраиваете его целиком, но, возможно, повторно используете что-то, что уже есть ... Если вы установите его,True
то я, похоже, не получу никакого вывода.format
изformatters
?Принятый ответ хорош! Но что, если бы можно было начать с чего-то менее сложного? Модуль ведения журнала - очень мощная вещь, а документация немного сложна, особенно для новичков. Но для начала вам не нужно настраивать форматеры и обработчики. Вы можете добавить его, когда выясните, чего хотите.
Например:
источник
logging.info('Hello, log')
который заставил меня задуматься. Путаница в документации заключается в том, что с dictConfig нам больше не нужно выполнятьgetLogger
какие-либо из этих действий.'': { 'level': 'INFO'...
и почему он не работает без него (например, при изменении пустого значения на допустимое значение, такое какstandard
getLogger()
если вам нужно несколько регистраторов с разными именами. Каждый из этих регистраторов наследует конфигурацию от корневого регистратора.getLogger
всегда необязателен. При использованииlogging.info()
метода напрямую используется корневой регистратор, в то время как уgetLogger()
вас могут быть разные регистраторы с разными именами и уровнями.Пример с обработчиком потока, обработчиком файла, обработчиком вращающегося файла и обработчиком SMTP
источник
Я нашел конфигурацию по умолчанию для Django v1.11.15 ниже, надеюсь, это поможет
источник
источник