Django安装程序默认日志logging
我似乎无法弄清楚如何设置我的Django安装“默认”logging器。 我想在settings.py
使用Django 1.3的新LOGGING
settings.py
。
我已经看过Django Logging Doc的例子 ,但是在我看来,他们只是设置了处理程序来处理特定的logging器。 在他们的例子中,他们为名为“django”,“django.request”和“myproject.custom”的logging器设置处理程序。
我所要做的就是设置一个默认的logging.handlers.RotatingFileHandler
,它将默认处理所有的logging器。 也就是说,如果我在我的项目的某个地方创build了一个新模块,并且它被表示为my_app_name.my_new_module
,那么我应该可以做到这一点,并且让所有的日志logging都转到文件日志。
# 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`!
弄清楚了…
通过引用空string''
设置”全部捕获“logging器。
例如,在下面的设置中,我将所有日志事件保存到logs/mylog.log
,除了将保存到logs/django_request.log
的django.request
日志事件logs/django_request.log
。 因为我的django.request
logging器的'propagate'
被设置为False
,所以日志事件永远不会到达'catch all'logging器。
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 }, } }
正如你在回答中所说的,Chris,定义一个默认logging器的一个select就是使用空string作为它的关键字。
不过,我认为预期的方法是在日志configuration字典的root
键下定义一个特殊的日志logging器。 我在Python文档中find了这个:
根 – 这将是根logging器的configuration。 configuration的处理将与任何logging器一样,除了
propagate
设置将不适用。
以下是您的答案更改为使用root
密钥的configuration:
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', }, }, 'root': { 'handlers': ['default'], 'level': 'DEBUG' }, 'loggers': { 'django.request': { 'handlers': ['request_handler'], 'level': 'DEBUG', 'propagate': False }, } }
公平地说,我看不出两个configuration之间的行为有什么不同。 看来用一个空string键定义一个logging器会修改根logging器,因为logging.getLogger('')
将返回根logging器。
我更喜欢'root'
超越''
'root'
的唯一原因是它明确要修改根logging器。 如果你好奇, 'root'
会覆盖''
如果你定义了两个,只是因为最后处理了根条目。
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',