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

2023-11-26

我正在研究Django REST 框架我想要有单独的文件来记录数据。

我想要一个用于简单交易的文件,例如GET、PUT、POST 等,以及一个包含错误的文件,我将在出现错误时收集这些错误。

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

设置.py

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

我尝试在 settings.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,
        },
    },
}

我没有按预期工作,现在我在同一文件 debug.log 上获取所有数据(信息和调试)。所以我决定通过日志库采用另一种方法。我不知道如何将这些日志错误的输出通过管道传输到目录中,例如(路径/错误.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!')

我发现这个类似的问题找不到记录器的处理程序如果我应用以下内容,它就会起作用:

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

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

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

Update:

解决方案提供者布鲁诺·德修利耶样本如下:

设置.py

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!')

现在一切都记录在 error.log 中。我想我需要应用一些过滤或其他东西。我会尽力弄清楚。


Here:

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

您定义了“django”键两次,因此第二次覆盖第一个。

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

其他一些注意事项:

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

  2. this 'filename': LOGGING_ROOT + "/info.log"有点违背了使用的全部目的os.path- 你要os.path.join(LOGGING_ROOT, "info.log") instead

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest框架在不同文件上记录不同级别 的相关文章

随机推荐

  • 通过外部页面链接开通微信公众号

    我找不到任何关于这个问题的参考资料 我希望这里有人知道 我为客户创建了一个 html5 促销页面 该页面位于我的服务器上 我正在通过微信将页面地址分享给客户 他正在将其重新分享给他的朋友 当他们打开页面时 它会在微信应用浏览器中打开 到目前
  • 缩小评级栏大小时出现问题。

    我想减小评级栏的大小 我有一些样式属性可以做到这一点 但它们超出了用户交互的范围 它们只是指示器 所以 请告诉我如何缩小尺寸 提前致谢 如何粘贴给定的代码here 步骤1 您需要自己的评级星星res drawable 步骤 2 输入res
  • 使用 Group By 时出现 SQL 错误:每个 GROUP BY 表达式必须至少包含一列不是外部引用

    在执行我认为最简单的查询之一时 我遇到了此错误 我看到其他人也在这里遇到了问题 我已经浏览了我见过的每个解决方案 但他们有更多涉及的查询 所以我很难找出问题 我做了一个小虚拟表来说明我的问题 表名 组测试 id name 1 Mel 2 L
  • pandas groupby 之后并行应用

    我用过rosetta parallel pandas easy并行化apply after groupby 例如 from rosetta parallel pandas easy import groupby to series to f
  • Rust 如何处理杀死线程?

    生成的线程之间是否存在父子连接 如果我从生成其他线程的地方杀死该线程 那些线程也会被杀死吗 这个操作系统特定吗 Rust 如何处理杀死线程 事实并非如此 没有办法杀死一个线程 也可以看看 如何从另一个线程终止或挂起一个 Rust 线 程 R
  • 使用 JavaScript 将 1 年添加到日期

    我有以下日期 2014 10 29 我试图在日期上添加一年 不是 365 天 而是 1 年 var newDate new Date 2014 10 29 newDate setDate newDate getFullYear 1 var
  • 如何使用 WaitGroup 处理错误并终止 Goroutine

    我今天一直在研究 Goroutines Channels 和 WaitGroup 在阅读了一段时间之后 我终于开始理解这个概念了 我的问题是 我不确定在这样工作时如何处理错误 主要是因为我使用了 WaitGroup 使用 WaitGroup
  • 如何在 Lisp 中一次生成一个列表中元素的所有排列?

    我已经有了生成元素列表的所有排列的代码 然而 我意识到 如果我想操作生成的列表 我需要遍历这个列表 该列表可能会很大 因此维护成本很高 我想知道是否有一种方法可以通过每次调用生成排列 以便我可以检查列表是否与我需要的匹配 如果不匹配 我将生
  • 当存在重复的数组值时, array_diff() 具有“一对一”元素删除功能

    我有两个包含重复值的数组 test1 blah1 blah1 blah1 blah1 blah2 test2 blah1 blah1 blah1 blah2 我试图获得数组差异 result array diff test1 test2 e
  • 未解决的参考:kotlinx

    我正在尝试在 Android Studio 中尝试 Kotlin 和 Kotlin Android 扩展 我在 Ubuntu 14 04 上的 Android Studio v 1 5 1 和 OS X El Capitan 上的 Andr
  • 获取与正在运行的应用程序关联的图标

    有了打开的应用程序的窗口句柄 我就可以使用 GetWindowText 函数从应用程序的标题栏中检索文本 我想更进一步并检索与同一应用程序关联的图标 我该怎么做呢 我浏览了我认为相关的 Win32 API 部分 但什么也没引起我的注意 任何
  • WebDriverException:转发新会话时出错,找不到:{platform=WINDOWS,browserName=FIREFOX,version=3.6}

    我是 Selenium Web 驱动程序和 Grid 2 的新手 我正在尝试运行一个测试用例 但它给了我一个例外 线程 main org openqa selenium WebDriverException 中出现异常 转发新会话时出错 找
  • 正则表达式匹配一定长度的全大写单词

    我有一个函数可以为那些坚持将所有内容都大写的顽皮用户修复大小写 我希望我的函数仅在字符串包含时被调用由 3 个或更多大写字母组成的大写单词 这可以用正则表达式来完成吗 例子 例如 I false DEAL true Welcome fals
  • ClearCase:加载特定目录的旧版本?

    如何在 UCM 快照视图中加载旧版本的目录 在我们的项目中 一位开发人员将未编译和不可编译的代码签入到 ClearCase 其他开发人员更新了她的观点 然后他没有编译项目 因为以前的开发人员未编译代码 因此 开发人员只想获取目录的先前版本
  • 将 SQLite 填充到内存中以进行单元测试

    我正在考虑使用 SQLite 作为 Oracle 数据库的内存存根 我可以轻松地将所有 DAL 命令定向到 SQLite 但我现在想知道如何轻松填充每个测试方法的数据 每种方法是否应该首先创建所需的表并插入特定测试的行 我应该在夹具设置阶段
  • nginx入口控制器转发源ip

    我已经为应用程序设置了入口 但想要将我的 IP 地址列入白名单 所以我创建了这个 Ingress apiVersion extensions v1beta1 kind Ingress metadata annotations cert ma
  • 如何降低 Switch case 语句的循环复杂度

    有一个函数有 switch case 我们需要减少它的 CC string data string empty switch value case Less than 2 billion data 0 2B break case 2 bil
  • Google 即搜即得如何运作?

    关于新的谷歌即时搜索到底如何工作有什么想法吗 这似乎只是对旧搜索的 AJAX 调用 但要简化 Google 是相当困难的 有人有猜测吗 编辑 我知道每次按键都会发送 AJAX 但它是否具有预测性 或者您认为这只是常规的谷歌搜索 UPDATE
  • C++98/03 引用折叠和 cv 限定符

    下面的代码编译 gcc 4 7 2 或 icc 13 并生成 1 2 输出 意思就是const预选赛被取消 i 例如 f
  • Django Rest框架在不同文件上记录不同级别

    我正在研究Django REST 框架我想要有单独的文件来记录数据 我想要一个用于简单交易的文件 例如GET PUT POST 等 以及一个包含错误的文件 我将在出现错误时收集这些错误 我一直在读Django 日志记录文档我想出了一些关于如