首页 文章

Django设置默认日志记录

提问于
浏览
90

我可以在 settings.py 中设置't seem to figure out how to setup a 1518682 logger for my Django installation. I would like to use Django 1.3'的新 LOGGING .

我看了Django Logging Doc's example,但它看起来像他们只设置处理程序,它将为特定的 Logger 进行记录 . 在他们的示例中,他们为名为'django','django.request'和'myproject.custom'的 Logger 设置处理程序 .

我想要做的就是设置一个默认的 logging.handlers.RotatingFileHandler 默认处理所有 Logger . 也就是说,如果我在我的项目中的某个地方创建一个新模块并且它被表示为: 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`!

3 回答

  • 21

    弄清楚了...

    您可以通过使用空字符串引用它来设置'catch all' Logger : '' .

    例如,在以下设置中,我将所有日志事件保存到 logs/mylog.log ,但 django.request 日志事件除外,这些事件将保存到 logs/django_request.log . 因为 'propagate' 对于我的 django.request Logger 设置为 False ,所以日志事件永远不会到达'catch all' Logger .

    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
            },
        }
    }
    
  • 143

    正如您在your answer中所说的,Chris,定义默认 Logger 的一个选项是使用空字符串作为其键 .

    但是,我认为预期的方法是在日志配置字典的 root 键下定义一个特殊的 Logger . 我在_1518705中发现了这个:

    root - 这将是根 Logger 的配置 . 配置的处理将与任何 Logger 一样,但传播设置将不适用 .

    这是您的答案更改为使用 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
            },
        }
    }
    

    公平地说,我看不出两种配置之间的行为有什么不同 . 看来,使用空字符串键定义 Logger 将修改根 Logger ,因为logging.getLogger('')将返回根 Logger .

    我更喜欢 'root' 而不是 '' 的唯一原因是它明确地修改了根 Logger . 如果您感到好奇, 'root' 会覆盖 '' 如果您同时定义两者,只是因为根条目是最后处理的 .

  • 0
    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',
    

相关问题