Django 休息框架在不同文件上记录不同级别
Django rest framework logging different levels on different files
我正在 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,
},
},
}
我没有按预期工作,现在我正在同一文件中获取所有数据(INFO 和 DEBUG)debug.log。所以我决定通过日志库采用另一种方法。我想不通的是如何将这些日志错误的输出通过管道传输到目录中,例如(path/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!')
我发现了这个类似的问题 如果我应用以下内容,它就会起作用:
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 应用程序一个记录器)。另请注意,记录器的 "handlers" 是列表,因此每个记录器可以有多个处理程序(即一个用于调试,一个用于信息)。 logging
库有点复杂,但花点时间 read the full doc 并进行一些试验是值得的,真的。
一些其他注意事项:
为多进程应用程序使用文件处理程序(在生产环境中,django 通常由多进程前端服务器提供服务)通常不是一个坏主意(对文件的并发写访问从未真正起作用)。
这个 'filename': LOGGING_ROOT + "/info.log"
有点破坏了使用 os.path
的全部意义 - 你想要 os.path.join(LOGGING_ROOT, "info.log")
而不是
我正在 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,
},
},
}
我没有按预期工作,现在我正在同一文件中获取所有数据(INFO 和 DEBUG)debug.log。所以我决定通过日志库采用另一种方法。我想不通的是如何将这些日志错误的输出通过管道传输到目录中,例如(path/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!')
我发现了这个类似的问题
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 应用程序一个记录器)。另请注意,记录器的 "handlers" 是列表,因此每个记录器可以有多个处理程序(即一个用于调试,一个用于信息)。 logging
库有点复杂,但花点时间 read the full doc 并进行一些试验是值得的,真的。
一些其他注意事项:
为多进程应用程序使用文件处理程序(在生产环境中,django 通常由多进程前端服务器提供服务)通常不是一个坏主意(对文件的并发写访问从未真正起作用)。
这个
'filename': LOGGING_ROOT + "/info.log"
有点破坏了使用os.path
的全部意义 - 你想要os.path.join(LOGGING_ROOT, "info.log")
而不是