Django设置默认日志记录

jpfvwuh4  于 2023-03-31  发布在  Go
关注(0)|答案(4)|浏览(125)

我似乎不知道如何为我的Django安装设置一个“默认”记录器。我想在settings.py中使用Django 1.3的新LOGGING设置。
我看过Django Logging Doc的例子,但在我看来,他们只为特定的记录器设置了处理程序。在他们的例子中,他们为名为'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`!
o4hqfura

o4hqfura1#

想明白了...
您可以通过使用空字符串引用'catch all'记录器来设置它:''
例如,在下面的设置中,我将所有日志事件保存到logs/mylog.log,除了django.request日志事件将保存到logs/django_request.log。因为'propagate'被设置为False,所以日志事件永远不会到达'catch all'日志记录器。

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
        },
    }
}
utugiqy6

utugiqy62#

正如您在your answer中所说,Chris,定义默认日志记录器的一个选项是使用空字符串作为其键。
然而,我认为预期的方法是在日志配置字典的root键下定义一个特殊的logger。我在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'会覆盖'',这只是因为根条目是最后处理的。

ymzxtsji

ymzxtsji3#

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',
wlp8pajw

wlp8pajw4#

我做了一个快速的示例来检查当root键和空的''记录器都在config dict中引用时使用了什么配置。

import logging.config

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'fmt1': {
            'format': '[FMT1] %(asctime)-15s %(message)s',
        },
        'fmt2': {
            'format': '[FMT2] %(asctime)-15s %(message)s',
        }
    },
    'handlers': {
        'console1': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'fmt1',
        },
        'console2': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'fmt2',
        },
    },
    # First config for root logger: console1 -> fmt1
    'root': {
        'handlers': ['console1'],
        'level': 'DEBUG',
        'propagate': True,
    },
    'loggers': {
        # Second config for root logger: console2 -> fmt2
        '': {
            'handlers': ['console2'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

logging.config.dictConfig(LOGGING)

l1 = logging.getLogger()
l2 = logging.getLogger('')
root = logging.root

l1.info("l1")
l2.info("l2")
root.info("root logger")

打印以下结果:

[FMT1] 2018-12-18 17:24:47,691 l1
[FMT1] 2018-12-18 17:24:47,691 l2
[FMT1] 2018-12-18 17:24:47,691 root logger

表示root键下的配置优先级最高,如果移除该块,结果为:

[FMT2] 2018-12-18 17:25:43,757 l1
[FMT2] 2018-12-18 17:25:43,757 l2
[FMT2] 2018-12-18 17:25:43,757 root logger

在这两种情况下,我都能够调试并确定所有三个记录器(l1l2root)引用了相同的记录器示例,即根记录器。
希望这将帮助其他人,像我一样,被2种不同的方式配置根记录器所困惑。

相关问题