Django只记录我的应用程序

Joh*_*ann 14 django logging

默认情况下,我可以通过创建一个""可以捕获所有内容的记录器,在SETTINGS配置中启用settings.py中的日志记录.但是,如果我只想从我的项目的应用程序中看到日志记录而不是Django内部组件呢?

我可以想象在我的每个Django应用程序模块中明确地获取一个记录器并按照某些约定命名它,例如logging.getLogger("myproject." + __file__).然后我可以创建一个名为'myproject'的记录器(在SETTINGS中),它将所有这些记录器输出.我不想硬编码我的项目名称,所以我会做一些os.path逻辑,___file___以任意深度提取完整的命名空间到文件.

在这一点上,我停下来,想知道有更简单的方法吗?

小智 11

您可以使用如下方案为所有本地应用程序创建相同的记录器,而无需手动将它们全部添加到日志记录配置中.

首先,拆分您的本地应用程序:

LOCAL_APPS = [
    'myapp1',
    'myapp2',
    ...
]

THIRD_PARTY_APPS = [
    'django. ...',
    ...
]

INSTALLED_APPS = LOCAL_APPS + THIRD_PARTY_APPS
Run Code Online (Sandbox Code Playgroud)

接下来为本地应用创建记录器配置:

local_logger_conf = {
    'handlers': ['my_handler',],
    'level': 'DEBUG',
}
Run Code Online (Sandbox Code Playgroud)

最后,按如下方式定义记录器:

'loggers': { app: copy.deepcopy(local_logger_conf) for app in LOCAL_APPS }
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 10

不确定我是否完全理解你的问题,因为答案似乎太简单了.

假设您已在LOGGING项目的应用程序的处理程序中定义,例如:

'handlers': {
    'handler_for_my_apps': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': 'debug.log',
    },
Run Code Online (Sandbox Code Playgroud)

并且,鉴于您的应用程序app1,app2您可以通过定义记录器来获取这些应用程序中的所有日志,而无需任何Django的内部日志:

'loggers': {
    'app1': {
        'handlers': ['handler_for_my_apps'],
        'level': 'DEBUG',
    },
    'app2': {
        'handlers': ['handler_for_my_apps'],
        'level': 'DEBUG',
    },
Run Code Online (Sandbox Code Playgroud)

除非您定义了一个以django处理程序命名的记录器,否则同一文件中不会有Django日志handler_for_my_apps.

在您的应用中,您可以logging.getLogger(__name__)按照文档的建议使用记录器.

除非我误解了你的问题......