Django设置默认日志记录

101 投票
4 回答
59034 浏览
提问于 2025-04-16 14:27

我现在有点搞不清楚怎么为我的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 个回答

3
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',
28

正如你在你的回答中提到的,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'会覆盖'',因为根条目的处理是最后进行的。

164

我搞明白了……

你可以通过用空字符串来设置一个“通用”的日志记录器,写作:''

举个例子,在下面的设置中,我把所有的日志事件都保存到 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
        },
    }
}

撰写回答