Skip to main content
 首页 » 编程设计

python之Django 休息框架在不同文件上记录不同级别

2024年09月07日31sxdcgaq8080

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

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

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

settings.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 中获取所有数据(INFO 和 DEBUG)。所以我决定通过日志库采用另一种方法。我想不通的是如何将这些日志错误的输出通过管道传输到目录中,例如(路径/错误.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!') 

我发现了这个类似的问题 No handlers could be found for logger如果我应用以下内容,它会起作用:

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

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

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

更新:

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

settings.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, 
        }, 
    }, 
} 

我还找到了Making Python loggers output all messages to stdout in addition to log .我当前修改的示例:

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 中。我想我需要应用一些过滤或其他东西。我会想办法解决的。

请您参考如下方法:

这里:

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

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

作为一般规则,如果您想要给定记录器的特定设置,请将其配置为不同的记录器(即每个包或 django 应用程序一个记录器)。另请注意,记录器的“处理程序”是列表,因此每个记录器可以有多个处理程序(即一个用于调试,一个用于信息)。 logging 库有点复杂,但需要时间 read the full doc做一些实验是值得的,真的。

一些其他注意事项:

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

  2. 这个 'filename': LOGGING_ROOT + "/info.log" 有点破坏了使用 os.path 的全部意义 - 你想要 os.path.join(LOGGING_ROOT, "info.log") 改为