Настройка Django по умолчанию - PullRequest
93 голосов
/ 26 марта 2011

Кажется, я не могу понять, как настроить регистратор по умолчанию для моей установки Django. Я хотел бы использовать новую настройку Django 1.3 LOGGING в settings.py.

Я рассмотрел пример Django Logging Doc , но мне кажется, что они только настраивают обработчики, которые будут вести журналы для определенных регистраторов. В случае их примера они устанавливают обработчик для регистраторов с именами 'django', 'django.request' и 'myproject.custom'.

Все, что я хочу сделать, это установить значение по умолчанию logging.handlers.RotatingFileHandler, которое будет обрабатывать все регистраторы по умолчанию. то есть, если я создаю новый модуль где-нибудь в моем проекте, и он обозначается чем-то вроде: my_app_name.my_new_module, я должен быть в состоянии сделать это, и вся запись в журнал происходит во вращающихся файлах.

# In file './my_app_name/my_new_module.py'
import logging
logger = logging.getLogger('my_app_name.my_new_module')
logger.debug('Hello logs!') # <-- This should get logged to my RotatingFileHandler that I setup in `settings.py`!

Ответы [ 4 ]

147 голосов
/ 26 марта 2011

Разобрался ...

Вы устанавливаете регистратор 'catch all', ссылаясь на него пустой строкой: ''.

Например, в следующей настройке Iсохранить все события журнала в logs/mylog.log, за исключением django.request событий журнала, которые будут сохранены в logs/django_request.log.Поскольку для 'propagate' для моего регистратора django.request установлено значение False, событие журнала никогда не достигнет регистратора «catch all».

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/mylog.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },  
        'request_handler': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/django_request.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },
    },
    'loggers': {
        '': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': True
        },
        'django.request': {
            'handlers': ['request_handler'],
            'level': 'DEBUG',
            'propagate': False
        },
    }
}
22 голосов
/ 10 июня 2014

Как вы сказали в ваш ответ , Крис, один из вариантов определения регистратора по умолчанию - использовать пустую строку в качестве ключа.

Однако я думаю, что предполагаемый способ -определите специальный регистратор под ключом root словаря конфигурации журналирования.Я нашел это в документации Python :

root - это будет конфигурация для корневого логгера.Обработка конфигурации будет такой же, как для любого регистратора, за исключением того, что настройка propagate не будет применима.

Вот конфигурация из вашего ответа, измененная для использования клавиши root:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/mylog.log',
            'maxBytes': 10245, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },  
        'request_handler': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/django_request.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'standard',
        },
    },
    'root': {
        'handlers': ['default'],
        'level': 'DEBUG'
    },
    'loggers': {
        'django.request': {
            'handlers': ['request_handler'],
            'level': 'DEBUG',
            'propagate': False
        },
    }
}

Если честно, я не вижу никакой разницы в поведении между этими двумя конфигурациями.Похоже, что определение логгера с пустым строковым ключом изменит корневой логгер, потому что logging.getLogger('') вернет корневой логгер. *1024*

Единственная причина, по которой я предпочитаю 'root', чем '' в том, что он явно касается модификации корневого регистратора.Если вам интересно, 'root' переопределяет '', если вы определяете оба, только потому, что корневая запись обрабатывается последней.

0 голосов
/ 18 декабря 2018

Я сделал быструю выборку, чтобы проверить, какая конфигурация используется, когда в config dict ссылаются и на ключ root, и на пустой регистратор ''.

import logging.config

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'fmt1': {
            'format': '[FMT1] %(asctime)-15s %(message)s',
        },
        'fmt2': {
            'format': '[FMT2] %(asctime)-15s %(message)s',
        }
    },
    'handlers': {
        'console1': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'fmt1',
        },
        'console2': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'fmt2',
        },
    },
    # First config for root logger: console1 -> fmt1
    'root': {
        'handlers': ['console1'],
        'level': 'DEBUG',
        'propagate': True,
    },
    'loggers': {
        # Second config for root logger: console2 -> fmt2
        '': {
            'handlers': ['console2'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

logging.config.dictConfig(LOGGING)

l1 = logging.getLogger()
l2 = logging.getLogger('')
root = logging.root

l1.info("l1")
l2.info("l2")
root.info("root logger")

Печатает следующий результат:

[FMT1] 2018-12-18 17:24:47,691 l1
[FMT1] 2018-12-18 17:24:47,691 l2
[FMT1] 2018-12-18 17:24:47,691 root logger

означает, что конфигурация под ключом root имеет наивысший приоритет.Если блок удален, результат будет:

[FMT2] 2018-12-18 17:25:43,757 l1
[FMT2] 2018-12-18 17:25:43,757 l2
[FMT2] 2018-12-18 17:25:43,757 root logger

В обоих случаях мне удалось отладить и определить, что все три регистратора (l1, l2 и root) ссылаются на одно и то жеЭкземпляр регистратора, корневой регистратор.

Надеюсь, что это поможет другим, которые, как и я, были смущены двумя различными способами настройки корневого регистратора.

0 голосов
/ 10 мая 2017
import logging
logger = logging.getLogger(__name__)

после добавления:

logging.basicConfig(
    level = logging.DEBUG,
    format = '%(name)s %(levelname)s %(message)s',
)

мы можем изменить формат на:

format = '"%(levelname)s:%(name)s:%(message)s"  ',

или

format = '%(name)s %(asctime)s %(levelname)s %(message)s',
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...