通配符Django日志记录

6

在设置Django日志时,是否可以使用通配符来匹配包?

目前我的LOGGING如下:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'mypack.mod1': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'mypack.mod2': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

我的问题是,有没有什么方法可以避免需要同时使用 mypack.mod1mypack.mod2 两个部分。

1个回答

11

是的,有一种方法(甚至有几种)。最简单(也可能是最好的)的方法是这样定义日志记录器:

yes, there is a way (well several even). The simplest (and probably the best also) way is to define your logger this way:

    'mypack': {
        'handlers': ['console'],
        'level': 'DEBUG',
        'propagate': True,
    },
mypack.mod2中调用logger = logging.getLogger(__name__)时,名称实际上是mypack.mod2。如果使用点符号表示法,如果python找不到mypack.mod2的记录器,则会尝试查找其父记录器(如果您有多个层次,例如mypack.mod1.submod3.subsubmod42 ),并且将被名为mypack的记录器捕获。
另一种方法(虽然我不建议这样做,除非您确实知道自己在做什么)是通过使用logger = logging.getLogger('TheNameOfTheLoggerIWantToCall')而不是使用__name__进行常规调用来显式调用特定的记录器名称。
您还可以查看https://docs.djangoproject.com/en/1.8/topics/logging/#naming-loggers了解更多信息。
[更新] 根据“父母层次结构”的同一原则,命名为空字符串的记录器将捕获所有内容(不仅仅是Django,而是使用的每个python模块的所有日志)。

有没有办法创建一个全通配符记录器,可以捕获任何记录器记录的所有内容? - Alex Rothberg
@AlexRothberg 根记录器(即 logging.getLogger())会捕获所有内容(通常情况下)。 - Clintm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接