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.logdjango.request日志事件logs/django_request.log 。 因为我的django.requestlogging器的'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',