Starlette - uvicorn - 石墨烯异常记录
Starlette - uvicorn - graphene exception logging
我在 uvicorn 上的 starlette 中使用石墨烯应用。
我想查看带有 traceroute 的异常日志。
但目前它隐藏了异常,我只看到带有“错误请求”消息的访问日志。
我已将我知道的所有记录器重定向到根记录器,访问日志除外。
根记录器已转为正确记录消息,如我所愿,但应用程序处理程序中的异常似乎是被捕获的,没有传播到根记录器。
我也设置了 sys.excepthook
比如:
def _exception_logging(exctype, value, tb):
traceback_string = ''.join(traceback.format_tb(tb, 10))
write_val = \
f'Traceback (most recent call last):\n{traceback_string}{exctype.__name__}: {value}'
logging.error(write_val)
并且我为线程设置了异常挂钩。通常看到所有日志消息就足够了。
我使用下一个 json 配置文件:
{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(message)s",
"use_colors": null
},
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": "[%(asctime)s] [%(process)s] [%(levelname)s]: %(client_addr)s - \"%(request_line)s\" %(status_code)s"
}
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stderr"
},
"access": {
"formatter": "access",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout"
}
},
"loggers": {
"uvicorn": {
"level": "INFO"
},
"uvicorn.exception": {
"level": "INFO"
},
"uvicorn.error": {
"level": "INFO"
},
"uvicorn.access": {
"handlers": [
"access"
],
"level": "INFO",
"propagate": false
}
}
}
我怀疑日志配置文件有问题。
它是 graphql-python 库特定的。
graphql.format_error
函数应该被覆盖,例如:
import logging
from graphql import format_error as default_format_error
def format_error(error):
try:
original_error = error.original_error
if isinstance(original_error, Exception):
logging.error('Error in GraphQL view', exc_info=original_error)
finally:
return default_format_error(error)
我在 uvicorn 上的 starlette 中使用石墨烯应用。
我想查看带有 traceroute 的异常日志。
但目前它隐藏了异常,我只看到带有“错误请求”消息的访问日志。
我已将我知道的所有记录器重定向到根记录器,访问日志除外。
根记录器已转为正确记录消息,如我所愿,但应用程序处理程序中的异常似乎是被捕获的,没有传播到根记录器。
我也设置了 sys.excepthook
比如:
def _exception_logging(exctype, value, tb):
traceback_string = ''.join(traceback.format_tb(tb, 10))
write_val = \
f'Traceback (most recent call last):\n{traceback_string}{exctype.__name__}: {value}'
logging.error(write_val)
并且我为线程设置了异常挂钩。通常看到所有日志消息就足够了。
我使用下一个 json 配置文件:
{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(message)s",
"use_colors": null
},
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": "[%(asctime)s] [%(process)s] [%(levelname)s]: %(client_addr)s - \"%(request_line)s\" %(status_code)s"
}
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stderr"
},
"access": {
"formatter": "access",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout"
}
},
"loggers": {
"uvicorn": {
"level": "INFO"
},
"uvicorn.exception": {
"level": "INFO"
},
"uvicorn.error": {
"level": "INFO"
},
"uvicorn.access": {
"handlers": [
"access"
],
"level": "INFO",
"propagate": false
}
}
}
我怀疑日志配置文件有问题。
它是 graphql-python 库特定的。
graphql.format_error
函数应该被覆盖,例如:
import logging
from graphql import format_error as default_format_error
def format_error(error):
try:
original_error = error.original_error
if isinstance(original_error, Exception):
logging.error('Error in GraphQL view', exc_info=original_error)
finally:
return default_format_error(error)