设置 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 都需要一个部分。

最佳答案

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

    '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 模块的每个日志)

关于python - 通配符 Django 日志记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29642243/

10-12 19:32