Django设置默认日志记录
我现在有点搞不清楚怎么为我的Django安装设置一个“默认”的日志记录器。我想用Django 1.3的新功能LOGGING
,这个功能是在settings.py
文件里设置的。
我看过Django日志记录文档里的例子,但我觉得他们只设置了处理器,这些处理器是用来记录特定日志记录器的信息。在他们的例子中,他们为名为'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 个回答
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',
正如你在你的回答中提到的,Chris,一个定义默认日志记录器的选项是使用空字符串作为它的键。
不过,我觉得更合适的方法是,在日志配置字典的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': 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
},
}
}
公平地说,我没有看到这两种配置在行为上有什么区别。看起来使用空字符串键定义的日志记录器会修改根日志记录器,因为logging.getLogger('')
会返回根日志记录器。
我之所以更喜欢'root'
而不是''
,是因为它更明确地表示在修改根日志记录器。如果你感兴趣的话,如果同时定义了'root'
和''
,'root'
会覆盖''
,因为根条目的处理是最后进行的。
我搞明白了……
你可以通过用空字符串来设置一个“通用”的日志记录器,写作:''
。
举个例子,在下面的设置中,我把所有的日志事件都保存到 logs/mylog.log
文件里,除了 django.request
的日志事件,它们会被保存到 logs/django_request.log
文件中。因为我把 django.request
的日志记录器的 'propagate'
设置为 False
,所以这些日志事件不会传递到“通用”的日志记录器那里。
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
},
}
}