16

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

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

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

4

3 回答 3

20

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

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

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

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

INSTALLED_APPS = LOCAL_APPS + THIRD_PARTY_APPS

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

local_logger_conf = {
    'handlers': ['my_handler',],
    'level': 'DEBUG',
}

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

'loggers': { app: copy.deepcopy(local_logger_conf) for app in LOCAL_APPS }
于 2014-03-13T22:41:00.347 回答
13

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

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

'handlers': {
    'handler_for_my_apps': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': 'debug.log',
    },

并且给定您的应用程序app1app2等等,您可以通过定义记录器来获得这些应用程序的所有日志,而无需任何 Django 的内部日志:

'loggers': {
    'app1': {
        'handlers': ['handler_for_my_apps'],
        'level': 'DEBUG',
    },
    'app2': {
        'handlers': ['handler_for_my_apps'],
        'level': 'DEBUG',
    },

同一个文件中不会有 Django 日志,当然,除非您定义了一个以djangohandler命名的记录器handler_for_my_apps

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

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

于 2013-06-01T23:00:29.427 回答
1

感谢您的分享,阅读这篇文章有助于解决我项目的日志记录问题。我将分享我选择的解决方案,希望它可以帮助其他人。定义一个字典列表:

LOCAL_APPS = [
   {'app_name': 'app1', 'level': 'INFO'},
   {'app_name': 'app2', 'level': 'DEBUG'},
   ]

现在创建一个函数来修改设置的 LOGGING:

def create_app_logger(app_name, level):
    app_handler = app_name + '_handler'
    LOGGING['handlers'][app_handler] = {
        'level': 'INFO',
        'class': 'logging.FileHandler',
        'filename': f'../logs/{app_name}_logs.log',
        'formatter': 'custom',
    }
    LOGGING['loggers'][app_name] = {
        'handlers': ['console', app_handler],
        'level': level,
        'propagate': False,
    }

最后循环遍历列表:

for dictionary in LOCAL_APPS:
    create_app_logger(dictionary['app_name'], dictionary['level'])

由于一个应用程序可以是一个独立的世界,这样您就可以为每个应用程序创建一个日志文件,而且您可以控制所需的日志记录级别。当然可以进一步个性化。

干杯

于 2021-03-28T14:03:34.170 回答