Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker FastAPI gunicorn添加日志记录时间戳_Docker_Logging_Gunicorn_Fastapi - Fatal编程技术网

Docker FastAPI gunicorn添加日志记录时间戳

Docker FastAPI gunicorn添加日志记录时间戳,docker,logging,gunicorn,fastapi,Docker,Logging,Gunicorn,Fastapi,我正在使用docker运行FastAPI start.sh看起来像: exec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE" 我的docker日志看起来没有时间戳: INFO: 123.123.123.123:48736 - "GET /wp-login.php HTTP/1.0" 404 Not Found INFO: 123.123.123.123:48808 - "

我正在使用docker运行FastAPI

start.sh看起来像:

exec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"
我的docker日志看起来没有时间戳:

INFO:     123.123.123.123:48736 - "GET /wp-login.php HTTP/1.0" 404 Not Found
INFO:     123.123.123.123:48808 - "GET /robots.txt HTTP/1.0" 404 Not Found
INFO:     123.123.123.123:48810 - "GET / HTTP/1.0" 200 OK
在它使用的gunicorn_conf.py中


如何轻松优雅地修改带有时间戳的信息和错误的记录器格式?

您应该能够使用gunicorn_conf.py文件中的变量修改访问日志的格式。您可以在uvicorn gunicorn docker映像中使用gunicorn_conf.py文件作为基础。

您应该能够使用gunicorn_conf.py文件中的变量修改访问日志的格式。您可以将您的gunicorn_conf.py文件用于uvicorn gunicorn docker映像。

我相信在使用uvicorn/gunicorn/fastapi组合时会使用access_log_格式选项。但这主要是为了编辑日志中的%消息部分。如果您只想添加一个时间戳,那么您应该能够覆盖记录器的行为,尽管默认值为我提供了一个时间戳

在定义fastapi应用程序之前,我将下面的示例放在了_uinit__u; py.py中

导入日志,logging.config 日志配置={ 版本:1,, 禁用现有日志记录器:True, 格式化程序:{默认值:{格式:%asctimes[%processs]%levelnames:%messages}, 处理程序:{ 控制台:{ 格式化程序:默认, 类:logging.StreamHandler, 流:ext://sys.stdout, 级别:信息, } }, 根:{handlers:[console],级别:INFO}, 伐木工人:{ gunicorn:{propagate:True}, gunicorn.access:{propagate:True}, gunicorn.error:{propagate:True}, uvicorn:{propagate:True}, uvicorn.access:{propagate:True}, uvicorn.error:{propagate:True}, }, } logging.config.dictConfigLOG\u config logger=logging.getLogger\uuu名称__ 查看答案,了解一些记录dict配置的好例子

如果你真的想编辑uvicorn的访问日志格式,我不确定是否有正式的方法。在撰写本文时,他们似乎有一个硬编码格式:

例如,我对打印x-forwarded-for头值感兴趣。解决这个问题的一个丑陋的方法是使用monkey补丁uvicorn.protocols.utils.get_client_addr并从传递给它的scope dict中提取任何您想要的内容。它恰好有请求头。注意:这可能会产生意外的后果,尤其是如果uvicorn人员更改代码以使用get_client_addr来执行除打印值以外的任何操作时

也许有一种方法可以通过使用自定义记录器的自定义worker类来实现这一点,但我还没有看到这种方法。

我相信access\u log\u格式选项是在使用uvicorn/gunicorn/fastapi组合时实现的。但这主要是为了编辑日志中的%消息部分。如果您只想添加一个时间戳,那么您应该能够覆盖记录器的行为,尽管默认值为我提供了一个时间戳

在定义fastapi应用程序之前,我将下面的示例放在了_uinit__u; py.py中

导入日志,logging.config 日志配置={ 版本:1,, 禁用现有日志记录器:True, 格式化程序:{默认值:{格式:%asctimes[%processs]%levelnames:%messages}, 处理程序:{ 控制台:{ 格式化程序:默认, 类:logging.StreamHandler, 流:ext://sys.stdout, 级别:信息, } }, 根:{handlers:[console],级别:INFO}, 伐木工人:{ gunicorn:{propagate:True}, gunicorn.access:{propagate:True}, gunicorn.error:{propagate:True}, uvicorn:{propagate:True}, uvicorn.access:{propagate:True}, uvicorn.error:{propagate:True}, }, } logging.config.dictConfigLOG\u config logger=logging.getLogger\uuu名称__ 查看答案,了解一些记录dict配置的好例子

如果你真的想编辑uvicorn的访问日志格式,我不确定是否有正式的方法。在撰写本文时,他们似乎有一个硬编码格式:

例如,我对打印x-forwarded-for头值感兴趣。解决这个问题的一个丑陋的方法是使用monkey补丁uvicorn.protocols.utils.get_client_addr并从传递给它的scope dict中提取任何您想要的内容。它恰好有请求头。注意:这可能会产生意外的后果,尤其是如果uvicorn人员更改代码以使用get_client_addr来执行除打印值以外的任何操作时


也许有一种方法可以通过使用自定义记录器的自定义worker类实现这一点,但我还没有看到这种方法。

@user670186能否提供有关如何使用fastapi进行日志记录的代码示例?我也在使用docker,但无法获取任何日志。如果您使用的是uvicorn/gunicorn,我认为access\u log\u格式选项目前不起作用。顺便说一句:@user670186您可以提供有关如何获取日志的代码示例吗 如何使用fastapi?我也在使用docker,但无法获取任何日志。如果您使用的是uvicorn/gunicorn,顺便说一句,我认为access\u log\u格式选项当前不起作用:
INFO:     123.123.123.123:48736 - "GET /wp-login.php HTTP/1.0" 404 Not Found
INFO:     123.123.123.123:48808 - "GET /robots.txt HTTP/1.0" 404 Not Found
INFO:     123.123.123.123:48810 - "GET / HTTP/1.0" 200 OK
use_loglevel = os.getenv("LOG_LEVEL", "info")
            if self.access_log:
                self.access_logger.info(
                    '%s - "%s %s HTTP/%s" %d',
                    get_client_addr(self.scope),
                    self.scope["method"],
                    get_path_with_query_string(self.scope),
                    self.scope["http_version"],
                    status_code,
                    extra={"status_code": status_code, "scope": self.scope},
                )