当前位置: 首页 > 知识库问答 >
问题:

Django rest框架在不同的文件上记录不同的级别

席弘图
2023-03-14

我正在使用Django REST框架,我希望有单独的文件来记录数据。

我想有一个简单的交易文件,例如。GET,PUT,POST等和一个文件的错误,我将收集在错误的情况下。

我一直在阅读Django日志文档,并提出了一些关于如何记录信息数据的配置。以下配置示例:

设置。派克

STATIC_URL = '/static/'
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
LOGGING_ROOT = os.path.join(STATIC_ROOT, 'logging')

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': LOGGING_ROOT + "/info.log",
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

它作为文件中的预期数据样本工作:

"PUT /upload/dat.txt HTTP/1.1" 204 14
"OPTIONS / HTTP/1.1" 200 10020
"GET / HTTP/1.1" 200 9916

我尝试在设置中应用另一个处理程序。py文件,例如:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'fileInfo': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': LOGGING_ROOT + "/info.log",
        },
        'fileDebug': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': LOGGING_ROOT + "/debbug.log",
        },
    },
    'loggers': {
        'django': {
            'handlers': ['fileInfo'],
            'level': 'INFO',
            'propagate': True,
        },
        'django': {
            'handlers': ['fileDebug'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

我没有像预期的那样工作,现在我得到了同一个文件上的所有数据(INFO和DEBUG)debug.log.所以我决定通过日志库有另一种方法。我不明白的是如何将这些日志错误的输出管道到目录中,例如(路径/errors.log)。

从文件中:

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error('Something went wrong!')

我发现这个类似的问题,没有为logger找到处理程序,如果我应用以下内容,它就会工作:

import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.error('Something went wrong!')

现在所有内容都记录在标准输出上(信息和错误)。有没有办法组合这些配置?

我想将所有请求记录到info.log文件中,并在error.log文件中记录错误。

更新:

由bruno desthuilliers提供的解决方案示例如下:

设置。派克

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'fileInfo': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': os.path.join(LOGGING_ROOT, "info.log"),
        },
        'fileDebug': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': os.path.join(LOGGING_ROOT, "debug.log")
        },
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'fileInfo', 'fileDebug'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

我还发现,除了日志之外,让Python记录器将所有消息输出到stdout。我当前修改的示例:

import logging
from thanosTest import settings
logging.basicConfig(filename=os.path.join(settings.LOGGING_ROOT, "error.log"))
stderrLogger = logging.StreamHandler()
stderrLogger.setFormatter(logging.Formatter(logging.BASIC_FORMAT))
logging.getLogger().addHandler(stderrLogger)
logging.error('Something went wrong!')

现在所有内容都记录到错误中。日志我想我需要应用一些过滤之类的。我会设法弄明白的。

共有1个答案

越开畅
2023-03-14

这里:

'loggers': {
    'django': {
        'handlers': ['fileInfo'],
        'level': 'INFO',
        'propagate': True,
    },
    'django': {
        'handlers': ['fileDebug'],
        'level': 'DEBUG',
        'propagate': True,
    },

您定义了两次'django'键,所以第二次会覆盖第一次。

作为一般规则,如果您想要给定记录器的特定设置,请将其配置为不同的记录器(即每个包或django应用程序一个记录器)。还请注意,记录器的“处理程序”是列表,因此每个记录器可以有多个处理程序(即一个用于调试,一个用于信息)。日志记录库有点复杂,但是花时间阅读完整的文档并进行一点实验是值得的,真的。

还有几点需要注意:

>

  • 为多进程应用程序使用文件处理程序(在生产环境中,django通常由多进程前端服务器提供服务)通常是个不错的主意(对文件的并发写访问永远不会真正起作用)。

    这个'filename':LOGGING_ROOT/info.log有点挫败了使用os.path-你想要os.path.join(LOGGING_ROOT,info.log) 而不是

  •  类似资料:
    • 问题内容: 我的logback.xml中有这个添加器 因此,目前我将所有日志保存到一个文件中。如何使它像一个文件仅保存错误日志,而另一个文件保存所有其他日志? 我想在代码中仅使用1个logger实例,如下所示: 问题答案: 开始寻找logback类别,找到过滤器。 只需将过滤器说明添加到您的附加程序即可:

    • 我的简单问题是:如果我有两个类似logger的语句。info()和记录器。error()在Java中(使用log4j),我希望将这两行的结果打印在两个单独的文件中。也就是说,记录器。信息(…)应该打印到一个文件,比如myLog。信息和记录器。错误(…)应该打印到myLog。错误文件。我正在使用滚动文件追加器执行此任务。另外,我只需要一个记录器对象来完成任务。有人可能会建议两个或多个不同的记录器,每

    • 问题内容: 我正在使用log4j登录我的应用程序。我正在尝试在不同文件中使用不同级别的日志,但是出了点问题。对于解决此问题的任何帮助,我们将不胜感激。 问题答案: log4j附加程序的标准行为是,它们以其阈值级别 或更高 的阈值记录所有消息,即具有阈值INFO的附加器将记录INFO,WARN,ERROR和FATAL消息,但不记录DEBUG。如果你想记录 只有 INFO信息,但不会发出警告及以上,然

    • 问题内容: 我有一个普通的INFO级别应用日志。我需要的是另外记录所有错误级别的事件,以单独的错误日志。我正在使用这样的配置: 此配置仅记录错误。如果我首先放置信息级别记录器,则它将仅记录到一般附加程序,但错误记录器将无法工作。我想让他们两个都工作。 问题答案: 您需要做的是只有一个定义了INFO级别的定义,但是在您的两个追加器定义中,您需要相应地设置其阈值,例如 然后,将两个追加程序添加到记录器

    • 如何在SL4J中配置日志记录?我的项目有很多类:class1、class2、Class3....我想做两件事:将所有类记录到一个名为FILE1的文件追加器中,并具有警告级别(class1、class2、class3...)将一个名为class1的类记录到具有调试级别的名为FILE2的文件追加器中。 问题是,当我将class1的记录器配置为具有WARN级别的FILE1 appender时,我不知道如

    • 我还希望com.mypack的级别“trace”与“info”的行为方式相同。到目前为止,我还没有取得任何成功。我需要像这样的东西 感谢你的帮助。